summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
author Peiyong Lin <lpy@google.com> 2018-04-25 14:34:31 -0700
committer Peiyong Lin <lpy@google.com> 2018-05-02 10:56:11 -0700
commitfb069305e90947aeb76b72527f23aa24564f3c87 (patch)
tree45a22b91bce96a44053931f0396ae81f6b6fc3ce /services/surfaceflinger/SurfaceFlinger.cpp
parentaf0c783042eb89b58abb28bda87e4dd298af725f (diff)
[SurfaceFlinger] Adapt min/max luminance from hardware composer.
The luminance capability of the display is very important to HDR content. Previously, the minimum and maximum luminance were assumed as 0.0 and 500.0 respectively. This patch adapts the value returned from hardware composer and plumbs the value to RenderEngine. If hardware composer doesn't return valid values, 0.0 and 500.0 are still used as minimum and maximum luminance respectively. BUG: 73825729 BUG: 78574325 Test: Build, flash, watch video. Change-Id: Ie1dc93f5cca7068580d6ae19da43346491196d7c
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp41
1 files changed, 15 insertions, 26 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index e12d7ca73d..f736c8cfda 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1119,31 +1119,14 @@ status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& display,
return BAD_VALUE;
}
- HdrCapabilities capabilities;
- int status = getBE().mHwc->getHdrCapabilities(
- displayDevice->getHwcDisplayId(), &capabilities);
- if (status == NO_ERROR) {
- if (displayDevice->hasWideColorGamut()) {
- std::vector<Hdr> types = capabilities.getSupportedHdrTypes();
- // insert HDR10/HLG as we will force client composition for HDR10/HLG
- // layers
- if (!displayDevice->hasHDR10Support()) {
- types.push_back(Hdr::HDR10);
- }
- if (!displayDevice->hasHLGSupport()) {
- types.push_back(Hdr::HLG);
- }
-
- *outCapabilities = HdrCapabilities(types,
- capabilities.getDesiredMaxLuminance(),
- capabilities.getDesiredMaxAverageLuminance(),
- capabilities.getDesiredMinLuminance());
- } else {
- *outCapabilities = std::move(capabilities);
- }
- } else {
- return BAD_VALUE;
- }
+ // At this point the DisplayDeivce should already be set up,
+ // meaning the luminance information is already queried from
+ // hardware composer and stored properly.
+ const HdrCapabilities& capabilities = displayDevice->getHdrCapabilities();
+ *outCapabilities = HdrCapabilities(capabilities.getSupportedHdrTypes(),
+ capabilities.getDesiredMaxLuminance(),
+ capabilities.getDesiredMaxAverageLuminance(),
+ capabilities.getDesiredMinLuminance());
return NO_ERROR;
}
@@ -2917,6 +2900,8 @@ bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& displayDev
outputDataspace = displayDevice->getCompositionDataSpace();
}
getBE().mRenderEngine->setOutputDataSpace(outputDataspace);
+ getBE().mRenderEngine->setDisplayMaxLuminance(
+ displayDevice->getHdrCapabilities().getDesiredMaxLuminance());
if (!displayDevice->makeCurrent()) {
ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
@@ -4721,6 +4706,9 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder,
}
bool getWideColorSupport() const override { return false; }
Dataspace getDataSpace() const override { return Dataspace::UNKNOWN; }
+ float getDisplayMaxLuminance() const override {
+ return DisplayDevice::sDefaultMaxLumiance;
+ }
class ReparentForDrawing {
public:
@@ -4923,7 +4911,8 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea,
if (renderArea.getWideColorSupport()) {
outputDataspace = renderArea.getDataSpace();
}
- getBE().mRenderEngine->setOutputDataSpace(outputDataspace);
+ engine.setOutputDataSpace(outputDataspace);
+ engine.setDisplayMaxLuminance(renderArea.getDisplayMaxLuminance());
// make sure to clear all GL error flags
engine.checkErrors();