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

Commit 66eaf4a3 authored by Galia Peycheva's avatar Galia Peycheva
Browse files

Dynamically disable blurs when tunnel mode is used

Tunnel mode allows applications to stream video content directly to the
hardware composer, bypassing surface flinger. This is done for
performance.

Since the content bypasses surface flinger, the respective layer is empty.
So when we try to compute a blur on top of such a layer, the output is
a black surface. To avoid this empty surface, we want to make
surfaceflinger disable blurs whenever there is a layer that has tunnel
mode.

When tunnel mode is used, the respective layer is given a handle to a
sideband stream, which is how surface flinger recognises that tunnel
mode is in use.

This CL adds logic to compute when there is a sideband stream in one of
the layers in composition engine and then instructs
Layer::prepareClientComposition to not set backgroundBlurRadius or
blurRegions.

Bug: 171457637
Test: m && flash && check that requesting blur on top of a tunnel mode
layer does not make the screen black

Change-Id: I40a206f6ad4e805c66756317cbea1cf69db32dfc
parent 6df72d72
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -108,6 +108,9 @@ public:
        // If set to true, change the layer settings to render a clear output.
        // This may be requested by the HWC
        const bool clearContent;

        // If set to true, change the layer settings to not use any blurs.
        const bool disableBlurs;
    };

    // A superset of LayerSettings required by RenderEngine to compose a layer
+14 −3
Original line number Diff line number Diff line
@@ -669,8 +669,14 @@ void Output::updateAndWriteCompositionState(
compositionengine::OutputLayer* Output::findLayerRequestingBackgroundComposition() const {
    compositionengine::OutputLayer* layerRequestingBgComposition = nullptr;
    for (auto* layer : getOutputLayersOrderedByZ()) {
        if (layer->getLayerFE().getCompositionState()->backgroundBlurRadius > 0 ||
            layer->getLayerFE().getCompositionState()->blurRegions.size() > 0) {
        auto* compState = layer->getLayerFE().getCompositionState();

        // If any layer has a sideband stream, we will disable blurs. In that case, we don't
        // want to force client composition because of the blur.
        if (compState->sidebandStream != nullptr) {
            return nullptr;
        }
        if (compState->backgroundBlurRadius > 0 || compState->blurRegions.size() > 0) {
            layerRequestingBgComposition = layer;
        }
    }
@@ -1022,6 +1028,8 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
    // Used when a layer clears part of the buffer.
    Region stubRegion;

    bool disableBlurs = false;

    for (auto* layer : getOutputLayersOrderedByZ()) {
        const auto& layerState = layer->getState();
        const auto* layerFEState = layer->getLayerFE().getCompositionState();
@@ -1035,6 +1043,8 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
            continue;
        }

        disableBlurs |= layerFEState->sidebandStream != nullptr;

        const bool clientComposition = layer->requiresClientComposition();

        // We clear the client target for non-client composed layers if
@@ -1063,7 +1073,8 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
                                   .viewport = outputState.layerStackSpace.content,
                                   .dataspace = outputDataspace,
                                   .realContentIsVisible = realContentIsVisible,
                                   .clearContent = !clientComposition};
                                   .clearContent = !clientComposition,
                                   .disableBlurs = disableBlurs};
            std::vector<LayerFE::LayerSettings> results =
                    layerFE.prepareClientCompositionList(targetSettings);
            if (realContentIsVisible && !results.empty()) {
+21 −0
Original line number Diff line number Diff line
@@ -3688,6 +3688,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, clearsHWCLayersIfOpaqu
            kDisplayDataspace,
            false /* realContentIsVisible */,
            true /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
            Region(kDisplayFrame),
@@ -3699,6 +3700,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, clearsHWCLayersIfOpaqu
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    LayerFE::LayerSettings mBlackoutSettings = mLayers[1].mLayerSettings;
@@ -3742,6 +3744,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
            Region(Rect(0, 0, 30, 30)),
@@ -3753,6 +3756,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
            Region(Rect(0, 0, 40, 201)),
@@ -3764,6 +3768,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3795,6 +3800,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
            Region(kDisplayFrame),
@@ -3806,6 +3812,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
            Region(kDisplayFrame),
@@ -3817,6 +3824,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3848,6 +3856,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,

    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
@@ -3860,6 +3869,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
            Region(kDisplayFrame),
@@ -3871,6 +3881,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3901,6 +3912,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
            Region(kDisplayFrame),
@@ -3912,6 +3924,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
            Region(kDisplayFrame),
@@ -3923,6 +3936,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -3951,6 +3965,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer1TargetSettings{
            Region(kDisplayFrame),
@@ -3962,6 +3977,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };
    compositionengine::LayerFE::ClientCompositionTargetSettings layer2TargetSettings{
            Region(kDisplayFrame),
@@ -3973,6 +3989,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    EXPECT_CALL(mLayers[0].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer0TargetSettings))))
@@ -4092,6 +4109,7 @@ TEST_F(GenerateClientCompositionRequestsTest, handlesLandscapeModeSplitScreenReq
            kOutputDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    EXPECT_CALL(leftLayer.mOutputLayer, requiresClientComposition()).WillRepeatedly(Return(true));
@@ -4109,6 +4127,7 @@ TEST_F(GenerateClientCompositionRequestsTest, handlesLandscapeModeSplitScreenReq
            kOutputDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    EXPECT_CALL(rightLayer.mOutputLayer, requiresClientComposition()).WillRepeatedly(Return(true));
@@ -4142,6 +4161,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            false /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    LayerFE::LayerSettings mShadowSettings;
@@ -4187,6 +4207,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers,
            kDisplayDataspace,
            true /* realContentIsVisible */,
            false /* clearContent */,
            false /* disabledBlurs */,
    };

    EXPECT_CALL(mLayers[0].mOutputLayer, requiresClientComposition()).WillOnce(Return(false));
+5 −3
Original line number Diff line number Diff line
@@ -627,7 +627,7 @@ const char* Layer::getDebugName() const {
// ---------------------------------------------------------------------------

std::optional<compositionengine::LayerFE::LayerSettings> Layer::prepareClientComposition(
        compositionengine::LayerFE::ClientCompositionTargetSettings& /* targetSettings */) {
        compositionengine::LayerFE::ClientCompositionTargetSettings& targetSettings) {
    if (!getCompositionState()) {
        return {};
    }
@@ -649,8 +649,10 @@ std::optional<compositionengine::LayerFE::LayerSettings> Layer::prepareClientCom

    layerSettings.alpha = alpha;
    layerSettings.sourceDataspace = getDataSpace();
    if (!targetSettings.disableBlurs) {
        layerSettings.backgroundBlurRadius = getBackgroundBlurRadius();
        layerSettings.blurRegions = getBlurRegions();
    }
    return layerSettings;
}

+7 −1
Original line number Diff line number Diff line
@@ -5795,7 +5795,10 @@ status_t SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea,
    const auto display = renderArea.getDisplayDevice();
    std::vector<Layer*> renderedLayers;
    Region clearRegion = Region::INVALID_REGION;
    bool disableBlurs = false;
    traverseLayers([&](Layer* layer) {
        disableBlurs |= layer->getCurrentState().sidebandStream != nullptr;

        Region clip(renderArea.getBounds());
        compositionengine::LayerFE::ClientCompositionTargetSettings targetSettings{
                clip,
@@ -5808,6 +5811,7 @@ status_t SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea,
                clientCompositionDisplay.outputDataspace,
                true, /* realContentIsVisible */
                false, /* clearContent */
                disableBlurs,
        };
        std::vector<compositionengine::LayerFE::LayerSettings> results =
                layer->prepareClientCompositionList(targetSettings);
@@ -5822,11 +5826,13 @@ status_t SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea,
                    settings.backgroundBlurRadius = 0;
                }
            }

            clientCompositionLayers.insert(clientCompositionLayers.end(),
                                           std::make_move_iterator(results.begin()),
                                           std::make_move_iterator(results.end()));
            renderedLayers.push_back(layer);
        }

    });

    std::vector<const renderengine::LayerSettings*> clientCompositionLayerPointers(