diff options
| -rw-r--r-- | libs/gui/LayerState.cpp | 2 | ||||
| -rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/Transaction_test.cpp | 47 |
3 files changed, 51 insertions, 0 deletions
diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp index 075bb52e3c..6066421faf 100644 --- a/libs/gui/LayerState.cpp +++ b/libs/gui/LayerState.cpp @@ -245,6 +245,7 @@ void layer_state_t::merge(const layer_state_t& other) { } if (other.what & eLayerChanged) { what |= eLayerChanged; + what &= ~eRelativeLayerChanged; z = other.z; } if (other.what & eSizeChanged) { @@ -303,6 +304,7 @@ void layer_state_t::merge(const layer_state_t& other) { } if (other.what & eRelativeLayerChanged) { what |= eRelativeLayerChanged; + what &= ~eLayerChanged; z = other.z; relativeLayerHandle = other.relativeLayerHandle; } diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 1033d3d214..d6f88fc7a4 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -611,6 +611,7 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setLayer return *this; } s->what |= layer_state_t::eLayerChanged; + s->what &= ~layer_state_t::eRelativeLayerChanged; s->z = z; registerSurfaceControlForCallback(sc); @@ -624,6 +625,7 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setRelat mStatus = BAD_INDEX; } s->what |= layer_state_t::eRelativeLayerChanged; + s->what &= ~layer_state_t::eLayerChanged; s->relativeLayerHandle = relativeTo; s->z = z; diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp index d03c25df70..ec1ac4b229 100644 --- a/services/surfaceflinger/tests/Transaction_test.cpp +++ b/services/surfaceflinger/tests/Transaction_test.cpp @@ -1056,6 +1056,53 @@ TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) { screenshot->expectColor(Rect(0, 0, 32, 32), Color::BLUE); } +TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) { + sp<SurfaceControl> parent = + LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor); + + sp<SurfaceControl> childLayer; + ASSERT_NO_FATAL_FAILURE( + childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */, + 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor, + parent.get())); + Transaction() + .setColor(childLayer, half3{1.0f, 0.0f, 0.0f}) + .setColor(parent, half3{0.0f, 0.0f, 0.0f}) + .show(childLayer) + .show(parent) + .setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)) + .setCrop_legacy(childLayer, Rect(0, 0, 20, 30)) + .apply(); + + Transaction() + .setRelativeLayer(childLayer, parent->getHandle(), -1) + .setLayer(childLayer, 1) + .apply(); + + { + SCOPED_TRACE("setLayer above"); + // Set layer should get applied and place the child above. + std::unique_ptr<ScreenCapture> screenshot; + ScreenCapture::captureScreen(&screenshot); + screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED); + } + + Transaction() + .setLayer(childLayer, 1) + .setRelativeLayer(childLayer, parent->getHandle(), -1) + .apply(); + + { + SCOPED_TRACE("setRelative below"); + // Set relative layer should get applied and place the child below. + std::unique_ptr<ScreenCapture> screenshot; + ScreenCapture::captureScreen(&screenshot); + screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK); + } +} + void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) { sp<SurfaceControl> layerR; sp<SurfaceControl> layerG; |