summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alec Mouri <alecmouri@google.com> 2023-05-02 00:03:08 +0000
committer Alec Mouri <alecmouri@google.com> 2023-05-02 00:08:26 +0000
commit792b150a708a61faedaaa5983fbc5c5185984f50 (patch)
treed45dba99bbb180dd1ceae9da7c336859249fe7cc
parent8a186104276cdf57d552c54dbad488e14f0d3d16 (diff)
Don't overdim SDR content in an HLG screenshot.
Aligning HLG and PQ to 1.0 == 203 nits made SDR assets in screenshots too dim, since both the colorspace and the color transform applied dimming. Removing dimming application from the color transform is a larger change, so just compensate when configuring the screenshot in SurfaceFlinger instead. Bug: 280347733 Test: HwAccelerationTest Test: Navigate in and out of recents Change-Id: Idfdb74c0c3b977717b870b2bb9a469be37d27dc9
-rw-r--r--libs/shaders/shaders.cpp6
-rw-r--r--services/surfaceflinger/ScreenCaptureOutput.cpp10
2 files changed, 15 insertions, 1 deletions
diff --git a/libs/shaders/shaders.cpp b/libs/shaders/shaders.cpp
index b8f2be111e..c85517a976 100644
--- a/libs/shaders/shaders.cpp
+++ b/libs/shaders/shaders.cpp
@@ -103,10 +103,14 @@ static void generateLuminanceNormalizationForOOTF(ui::Dataspace inputDataspace,
// tonemapping downstream.
// BT. 2100-2 operates on normalized luminances, so renormalize to the input to
// correctly adjust gamma.
+ // Note that following BT. 2408 for HLG OETF actually maps 0.75 == ~264.96 nits,
+ // rather than 203 nits, because 203 nits == OOTF(invOETF(0.75)), so even though
+ // we originally scaled by 203 nits we need to re-normalize to 264.96 nits when
+ // converting to the correct brightness range.
shader.append(R"(
float3 NormalizeLuminance(float3 xyz) {
float ootfGain = pow(xyz.y / 1000.0, -0.2 / 1.2);
- return xyz * ootfGain / 203.0;
+ return xyz * ootfGain / 264.96;
}
)");
break;
diff --git a/services/surfaceflinger/ScreenCaptureOutput.cpp b/services/surfaceflinger/ScreenCaptureOutput.cpp
index b70b53d05a..09dac23410 100644
--- a/services/surfaceflinger/ScreenCaptureOutput.cpp
+++ b/services/surfaceflinger/ScreenCaptureOutput.cpp
@@ -94,6 +94,16 @@ ScreenCaptureOutput::generateClientCompositionRequests(
}
}
+ if (outputDataspace == ui::Dataspace::BT2020_HLG) {
+ for (auto& layer : clientCompositionLayers) {
+ auto transfer = layer.sourceDataspace & ui::Dataspace::TRANSFER_MASK;
+ if (transfer != static_cast<int32_t>(ui::Dataspace::TRANSFER_HLG) &&
+ transfer != static_cast<int32_t>(ui::Dataspace::TRANSFER_ST2084)) {
+ layer.whitePointNits *= (1000.0f / 203.0f);
+ }
+ }
+ }
+
Rect sourceCrop = mRenderArea.getSourceCrop();
compositionengine::LayerFE::LayerSettings fillLayer;
fillLayer.source.buffer.buffer = nullptr;