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

Commit ec2d9855 authored by Chia-I Wu's avatar Chia-I Wu
Browse files

surfaceflinger: fix traverseLayersInDisplay

Ignore top-level relative layers in the loop since they are and
should be traversed by Layer::traverseInZOrder.

Test: SurfaceFlinger_test
Change-Id: Ibd82298257b057b564e4985686d40c10f618e1d9
parent cdd71a52
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -4762,7 +4762,8 @@ void SurfaceFlinger::traverseLayersInDisplay(const sp<const DisplayDevice>& hw,
            continue;
        }
        const Layer::State& state(layer->getDrawingState());
        if (state.z < minLayerZ || state.z > maxLayerZ) {
        // relative layers are traversed in Layer::traverseInZOrder
        if (state.zOrderRelativeOf != nullptr || state.z < minLayerZ || state.z > maxLayerZ) {
            continue;
        }
        layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
+20 −0
Original line number Diff line number Diff line
@@ -702,6 +702,26 @@ TEST_F(LayerTransactionTest, SetRelativeZBasic) {
    }
}

TEST_F(LayerTransactionTest, SetRelativeZNegative) {
    sp<SurfaceControl> layerR;
    sp<SurfaceControl> layerG;
    sp<SurfaceControl> layerB;
    ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32));
    ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerR, Color::RED));
    ASSERT_NO_FATAL_FAILURE(layerG = createLayer("test G", 32, 32));
    ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerG, Color::GREEN));
    ASSERT_NO_FATAL_FAILURE(layerB = createLayer("test B", 32, 32));
    ASSERT_NO_FATAL_FAILURE(fillLayerColor(layerB, Color::BLUE));

    // layerR = mLayerZBase, layerG = layerR - 1, layerB = -2
    Transaction().setRelativeLayer(layerG, layerR->getHandle(), -1).setLayer(layerB, -2).apply();

    sp<ScreenCapture> screenshot;
    // only layerB is in this range
    ScreenCapture::captureScreen(&screenshot, -2, -1);
    screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE);
}

TEST_F(LayerTransactionTest, SetRelativeZGroup) {
    sp<SurfaceControl> layerR;
    sp<SurfaceControl> layerG;