Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93a12837 authored by Alec Mouri's avatar Alec Mouri
Browse files

Don't dim screenshots when there's no HDR on-screen.

Dimming the screenshot:
* Is incorrect for screenshots that leave the device
* For transitions, requires disabling dimming which reports to DisplayManager that the screenshot is HDR, which costs power.

Bug: 293560925
Bug: 298492174
Bug: 299055884
Flag: Exempt
Test: screen rotation with and without HDR
Test: systemui jank suite
Change-Id: Id6de2c8d3987300a1c24bf79dc5b523f40420174
(cherry picked from commit b4814de1)
Merged-In: Id6de2c8d3987300a1c24bf79dc5b523f40420174
parent 61a7b125
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -7373,6 +7373,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
    ATRACE_CALL();

    auto layers = getLayerSnapshots();

    for (auto& [_, layerFE] : layers) {
        frontend::LayerSnapshot* snapshot = layerFE->mSnapshot.get();
        captureResults.capturedSecureLayers |= (snapshot->isVisible && snapshot->isSecure);
@@ -7424,16 +7425,22 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
                    pickBestDataspace(requestedDataspace, display, captureResults.capturedHdrLayers,
                                      renderArea->getHintForSeamlessTransition());
            sdrWhitePointNits = state.sdrWhitePointNits;

            if (!captureResults.capturedHdrLayers) {
                displayBrightnessNits = sdrWhitePointNits;
            } else {
                displayBrightnessNits = state.displayBrightnessNits;
                // Only clamp the display brightness if this is not a seamless transition. Otherwise
                // for seamless transitions it's important to match the current display state as the
            // buffer will be shown under these same conditions, and we want to avoid any flickers
                // buffer will be shown under these same conditions, and we want to avoid any
                // flickers
                if (sdrWhitePointNits > 1.0f && !renderArea->getHintForSeamlessTransition()) {
                    // 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);
                    displayBrightnessNits = std::min(sdrWhitePointNits * kMaxScreenshotHeadroom,
                                                     displayBrightnessNits);
                }
            }

            if (requestedDataspace == ui::Dataspace::UNKNOWN) {