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

Commit 7f7ad2c3 authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

Transform transparentRegion into output space

Although "outputSpaceBlockingRegionHint" claims to be in the output
space, unlike "outputSpaceVisibleRegion", we never transformed it to the
output space. This meant that HWC did not know how to apply it properly
when the device was rotated. Fix this.

Add outputSpaceBlockingRegionHint to the dumpsys.

Fixes: 224484888
Test: libcompositionengine_test
Change-Id: I1378c96f4d5af57fb7d9835182427017064e89e5
parent 32d9f66b
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -684,7 +684,9 @@ void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE,
            visibleNonShadowRegion.intersect(outputState.layerStackSpace.getContent()));
    outputLayerState.shadowRegion = shadowRegion;
    outputLayerState.outputSpaceBlockingRegionHint =
            layerFEState->compositionType == Composition::DISPLAY_DECORATION ? transparentRegion
            layerFEState->compositionType == Composition::DISPLAY_DECORATION
            ? outputState.transform.transform(
                      transparentRegion.intersect(outputState.layerStackSpace.getContent()))
            : Region();
}

+3 −0
Original line number Diff line number Diff line
@@ -60,6 +60,9 @@ void OutputLayerCompositionState::dump(std::string& out) const {
    out.append("      ");
    dumpVal(out, "shadowRegion", shadowRegion);

    out.append("      ");
    dumpVal(out, "outputSpaceBlockingRegionHint", outputSpaceBlockingRegionHint);

    out.append("      ");
    dumpVal(out, "forceClientComposition", forceClientComposition);
    dumpVal(out, "clearClientTarget", clearClientTarget);
+22 −1
Original line number Diff line number Diff line
@@ -1310,6 +1310,7 @@ struct OutputEnsureOutputLayerIfVisibleTest : public testing::Test {
    static const Region kLowerHalfBoundsNoRotation;
    static const Region kFullBounds90Rotation;
    static const Region kTransparentRegionHint;
    static const Region kTransparentRegionHint90Rotation;

    StrictMock<OutputPartialMock> mOutput;
    LayerFESet mGeomSnapshots;
@@ -1328,7 +1329,9 @@ const Region OutputEnsureOutputLayerIfVisibleTest::kLowerHalfBoundsNoRotation =
const Region OutputEnsureOutputLayerIfVisibleTest::kFullBounds90Rotation =
        Region(Rect(0, 0, 200, 100));
const Region OutputEnsureOutputLayerIfVisibleTest::kTransparentRegionHint =
        Region(Rect(0, 0, 100, 100));
        Region(Rect(25, 20, 50, 75));
const Region OutputEnsureOutputLayerIfVisibleTest::kTransparentRegionHint90Rotation =
        Region(Rect(125, 25, 180, 50));

TEST_F(OutputEnsureOutputLayerIfVisibleTest, performsGeomLatchBeforeCheckingIfLayerIncluded) {
    EXPECT_CALL(mOutput, includesLayer(sp<LayerFE>(mLayer.layerFE))).WillOnce(Return(false));
@@ -1779,6 +1782,24 @@ TEST_F(OutputEnsureOutputLayerIfVisibleTest, normalLayersDoNotSetBlockingRegion)
    EXPECT_THAT(mLayer.outputLayerState.outputSpaceBlockingRegionHint, RegionEq(Region()));
}

TEST_F(OutputEnsureOutputLayerIfVisibleTest, blockingRegionIsInOutputSpace) {
    mLayer.layerFEState.isOpaque = false;
    mLayer.layerFEState.contentDirty = true;
    mLayer.layerFEState.compositionType =
            aidl::android::hardware::graphics::composer3::Composition::DISPLAY_DECORATION;

    mOutput.mState.layerStackSpace.setContent(Rect(0, 0, 300, 200));
    mOutput.mState.transform = ui::Transform(TR_ROT_90, 200, 300);

    EXPECT_CALL(mOutput, getOutputLayerCount()).WillOnce(Return(0u));
    EXPECT_CALL(mOutput, ensureOutputLayer(Eq(std::nullopt), Eq(mLayer.layerFE)))
            .WillOnce(Return(&mLayer.outputLayer));
    ensureOutputLayerIfVisible();

    EXPECT_THAT(mLayer.outputLayerState.outputSpaceBlockingRegionHint,
                RegionEq(kTransparentRegionHint90Rotation));
}

/*
 * Output::present()
 */