diff options
author | John Reck <jreck@google.com> | 2023-06-14 14:41:10 -0400 |
---|---|---|
committer | John Reck <jreck@google.com> | 2023-06-14 21:18:05 -0400 |
commit | 5b02fc47b36af39a94a22148eb49b85820d17a5f (patch) | |
tree | 6b7cff0f197886726fe808671cf20a43b68770f0 | |
parent | 094946bd8c1a8f205417a21755023118857950f7 (diff) | |
download | native-5b02fc47b36af39a94a22148eb49b85820d17a5f.tar.gz |
Adjust screenshot behavior of HDR content
Cap the max amount of HDR headroom beyond which the
layer is clipped. This avoids over-dimming the SDR content
range in the resulting SDR screenshot
Test: screenshot of silkfx
Bug: 286942637
Change-Id: I67df32d9c192da18df516972ed92e9bd64063186
-rw-r--r-- | libs/renderengine/skia/SkiaRenderEngine.cpp | 4 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 7 |
2 files changed, 10 insertions, 1 deletions
diff --git a/libs/renderengine/skia/SkiaRenderEngine.cpp b/libs/renderengine/skia/SkiaRenderEngine.cpp index 5854135afe..fda6ea189e 100644 --- a/libs/renderengine/skia/SkiaRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaRenderEngine.cpp @@ -86,6 +86,7 @@ namespace { // Debugging settings static const bool kPrintLayerSettings = false; static const bool kFlushAfterEveryLayer = kPrintLayerSettings; +static constexpr bool kEnableLayerBrightening = true; } // namespace @@ -699,7 +700,8 @@ void SkiaRenderEngine::drawLayersInternal( // ...and compute the dimming ratio if dimming is requested const float displayDimmingRatio = display.targetLuminanceNits > 0.f && - maxLayerWhitePoint > 0.f && display.targetLuminanceNits > maxLayerWhitePoint + maxLayerWhitePoint > 0.f && + (kEnableLayerBrightening || display.targetLuminanceNits > maxLayerWhitePoint) ? maxLayerWhitePoint / display.targetLuminanceNits : 1.f; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 79378befcc..fe2db940f7 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -7419,6 +7419,13 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl( renderArea->getHintForSeamlessTransition()); sdrWhitePointNits = state.sdrWhitePointNits; displayBrightnessNits = state.displayBrightnessNits; + if (sdrWhitePointNits > 1.0f) { + // Restrict the amount of HDR "headroom" in the screenshot to avoid over-dimming + // the SDR portion. 2.0 chosen by experimentation + constexpr float kMaxScreenshotHeadroom = 2.0f; + displayBrightnessNits = + std::min(sdrWhitePointNits * kMaxScreenshotHeadroom, displayBrightnessNits); + } if (requestedDataspace == ui::Dataspace::UNKNOWN) { renderIntent = state.renderIntent; |