summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olv@google.com>2018-05-29 12:57:23 -0700
committerChia-I Wu <olv@google.com>2018-05-30 09:29:49 -0700
commitc4b08bde2aaa455a7f789eb2858863d19563b949 (patch)
tree534680968900e4aeb4fec0ca13c5599b76d883df
parentca175ee15a529cca0eb2bc8372e552d4ad255fc0 (diff)
downloadnative-c4b08bde2aaa455a7f789eb2858863d19563b949.tar.gz
surfaceflinger: RenderIntent::COLORIMETRIC is no longer mandatory
RenderIntent::COLORIMETRIC is mandatory only for SDR color modes. For HDR color modes, RenderIntent::TONE_MAP_COLORIMETRIC is mandatory. Bug: 80030364 Test: HDR videos Change-Id: I70d96ac66d069218d789dded330169284a61bde1
-rw-r--r--services/surfaceflinger/DisplayDevice.cpp28
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp18
2 files changed, 29 insertions, 17 deletions
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp
index e81df8ad53..9ecbacc86b 100644
--- a/services/surfaceflinger/DisplayDevice.cpp
+++ b/services/surfaceflinger/DisplayDevice.cpp
@@ -162,18 +162,20 @@ std::vector<RenderIntent> getRenderIntentCandidates(RenderIntent intent) {
}
}
- // add other HDR candidates when intent is HDR
if (isHdr) {
+ // add other HDR candidates when intent is HDR
for (auto hdrIntent : sHdrRenderIntents) {
if (hdrIntent != intent) {
candidates.push_back(hdrIntent);
}
}
- }
-
- // add COLORIMETRIC
- if (intent != RenderIntent::COLORIMETRIC) {
- candidates.push_back(RenderIntent::COLORIMETRIC);
+ } else {
+ // add other SDR candidates when intent is SDR
+ for (auto sdrIntent : sSdrRenderIntents) {
+ if (sdrIntent != intent) {
+ candidates.push_back(sdrIntent);
+ }
+ }
}
return candidates;
@@ -727,14 +729,24 @@ void DisplayDevice::populateColorModes(
}
}
- // add known SDR combinations
+ // add all known SDR combinations
for (auto intent : sdrRenderIntents) {
for (auto mode : sSdrColorModes) {
addColorMode(hwcColorModes, mode, intent);
}
}
- // add known HDR combinations
+ // collect all known HDR render intents
+ std::unordered_set<RenderIntent> hdrRenderIntents(sHdrRenderIntents.begin(),
+ sHdrRenderIntents.end());
+ iter = hwcColorModes.find(ColorMode::BT2100_PQ);
+ if (iter != hwcColorModes.end()) {
+ for (auto intent : iter->second) {
+ hdrRenderIntents.insert(intent);
+ }
+ }
+
+ // add all known HDR combinations
for (auto intent : sHdrRenderIntents) {
for (auto mode : sHdrColorModes) {
addColorMode(hwcColorModes, mode, intent);
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index f5fa478a2d..a120738713 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1932,27 +1932,27 @@ void SurfaceFlinger::pickColorMode(const sp<DisplayDevice>& displayDevice,
Dataspace hdrDataSpace;
Dataspace bestDataSpace = getBestDataspace(displayDevice, &hdrDataSpace);
+ // respect hdrDataSpace only when there is modern HDR support
+ const bool isHdr = hdrDataSpace != Dataspace::UNKNOWN &&
+ displayDevice->hasModernHdrSupport(hdrDataSpace);
+ if (isHdr) {
+ bestDataSpace = hdrDataSpace;
+ }
+
RenderIntent intent;
switch (mDisplayColorSetting) {
case DisplayColorSetting::MANAGED:
case DisplayColorSetting::UNMANAGED:
- intent = RenderIntent::COLORIMETRIC;
+ intent = isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
break;
case DisplayColorSetting::ENHANCED:
- intent = RenderIntent::ENHANCE;
+ intent = isHdr ? RenderIntent::TONE_MAP_ENHANCE : RenderIntent::ENHANCE;
break;
default: // vendor display color setting
intent = static_cast<RenderIntent>(mDisplayColorSetting);
break;
}
- // respect hdrDataSpace only when there is modern HDR support
- if (hdrDataSpace != Dataspace::UNKNOWN && displayDevice->hasModernHdrSupport(hdrDataSpace)) {
- bestDataSpace = hdrDataSpace;
- intent = mDisplayColorSetting == DisplayColorSetting::ENHANCED ?
- RenderIntent::TONE_MAP_ENHANCE : RenderIntent::TONE_MAP_COLORIMETRIC;
- }
-
displayDevice->getBestColorMode(bestDataSpace, intent, outDataSpace, outMode, outRenderIntent);
}