Loading services/surfaceflinger/Layer.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -1231,6 +1231,14 @@ bool Layer::isHiddenByPolicy() const { if (parent != nullptr && parent->isHiddenByPolicy()) { return true; } if (usingRelativeZ(LayerVector::StateSet::Drawing)) { auto zOrderRelativeOf = mDrawingState.zOrderRelativeOf.promote(); if (zOrderRelativeOf != nullptr) { if (zOrderRelativeOf->isHiddenByPolicy()) { return true; } } } return s.flags & layer_state_t::eLayerHidden; } Loading Loading @@ -1612,7 +1620,7 @@ int32_t Layer::getZ() const { return mDrawingState.z; } bool Layer::usingRelativeZ(LayerVector::StateSet stateSet) { bool Layer::usingRelativeZ(LayerVector::StateSet stateSet) const { const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; const State& state = useDrawing ? mDrawingState : mCurrentState; return state.zOrderRelativeOf != nullptr; Loading services/surfaceflinger/Layer.h +1 −1 Original line number Diff line number Diff line Loading @@ -824,7 +824,7 @@ public: protected: // ----------------------------------------------------------------------- bool usingRelativeZ(LayerVector::StateSet stateSet); bool usingRelativeZ(LayerVector::StateSet stateSet) const; bool mPremultipliedAlpha{true}; String8 mName; Loading services/surfaceflinger/tests/Transaction_test.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -1115,6 +1115,56 @@ TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) { } } TEST_P(LayerTypeTransactionTest, HideRelativeParentHidesLayer) { sp<SurfaceControl> parent = LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */, ISurfaceComposerClient::eFXSurfaceColor); sp<SurfaceControl> relativeParent = LayerTransactionTest::createLayer("RelativeParent", 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}) .setColor(relativeParent, half3{0.0f, 1.0f, 0.0f}) .show(childLayer) .show(parent) .show(relativeParent) .setLayer(parent, mLayerZBase - 1) .setLayer(relativeParent, mLayerZBase) .apply(); Transaction() .setRelativeLayer(childLayer, relativeParent->getHandle(), 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() .hide(relativeParent) .apply(); { SCOPED_TRACE("hide relative parent"); // The relative should no longer be visible. 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; Loading Loading
services/surfaceflinger/Layer.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -1231,6 +1231,14 @@ bool Layer::isHiddenByPolicy() const { if (parent != nullptr && parent->isHiddenByPolicy()) { return true; } if (usingRelativeZ(LayerVector::StateSet::Drawing)) { auto zOrderRelativeOf = mDrawingState.zOrderRelativeOf.promote(); if (zOrderRelativeOf != nullptr) { if (zOrderRelativeOf->isHiddenByPolicy()) { return true; } } } return s.flags & layer_state_t::eLayerHidden; } Loading Loading @@ -1612,7 +1620,7 @@ int32_t Layer::getZ() const { return mDrawingState.z; } bool Layer::usingRelativeZ(LayerVector::StateSet stateSet) { bool Layer::usingRelativeZ(LayerVector::StateSet stateSet) const { const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; const State& state = useDrawing ? mDrawingState : mCurrentState; return state.zOrderRelativeOf != nullptr; Loading
services/surfaceflinger/Layer.h +1 −1 Original line number Diff line number Diff line Loading @@ -824,7 +824,7 @@ public: protected: // ----------------------------------------------------------------------- bool usingRelativeZ(LayerVector::StateSet stateSet); bool usingRelativeZ(LayerVector::StateSet stateSet) const; bool mPremultipliedAlpha{true}; String8 mName; Loading
services/surfaceflinger/tests/Transaction_test.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -1115,6 +1115,56 @@ TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) { } } TEST_P(LayerTypeTransactionTest, HideRelativeParentHidesLayer) { sp<SurfaceControl> parent = LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */, ISurfaceComposerClient::eFXSurfaceColor); sp<SurfaceControl> relativeParent = LayerTransactionTest::createLayer("RelativeParent", 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}) .setColor(relativeParent, half3{0.0f, 1.0f, 0.0f}) .show(childLayer) .show(parent) .show(relativeParent) .setLayer(parent, mLayerZBase - 1) .setLayer(relativeParent, mLayerZBase) .apply(); Transaction() .setRelativeLayer(childLayer, relativeParent->getHandle(), 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() .hide(relativeParent) .apply(); { SCOPED_TRACE("hide relative parent"); // The relative should no longer be visible. 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; Loading