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

Commit b4814de1 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
parent ce9c53fe
Loading
Loading
Loading
Loading
+24 −14
Original line number Diff line number Diff line
@@ -7678,6 +7678,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);
@@ -7729,16 +7730,24 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
                    pickBestDataspace(requestedDataspace, display, captureResults.capturedHdrLayers,
                                      renderArea->getHintForSeamlessTransition());
            sdrWhitePointNits = state.sdrWhitePointNits;

             // TODO(b/298219334): Clean this up once we verify this doesn't break anything
             static constexpr bool kScreenshotsDontDim = true;

            if (kScreenshotsDontDim && !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) {
@@ -7746,6 +7755,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
                }
            }
        }
    }

    captureResults.buffer = capturedBuffer->getBuffer();