Loading services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -134,6 +134,9 @@ public: // this output allows that. // this output allows that. virtual bool belongsInOutput(std::optional<uint32_t> layerStackId, bool internalOnly) const = 0; virtual bool belongsInOutput(std::optional<uint32_t> layerStackId, bool internalOnly) const = 0; // Determines if a layer belongs to the output. virtual bool belongsInOutput(const compositionengine::Layer*) const = 0; // Returns a pointer to the output layer corresponding to the given layer on // Returns a pointer to the output layer corresponding to the given layer on // this output, or nullptr if the layer does not have one // this output, or nullptr if the layer does not have one virtual OutputLayer* getOutputLayerForLayer(Layer*) const = 0; virtual OutputLayer* getOutputLayerForLayer(Layer*) const = 0; Loading services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -63,6 +63,7 @@ public: Region getDirtyRegion(bool repaintEverything) const override; Region getDirtyRegion(bool repaintEverything) const override; bool belongsInOutput(std::optional<uint32_t>, bool) const override; bool belongsInOutput(std::optional<uint32_t>, bool) const override; bool belongsInOutput(const compositionengine::Layer*) const override; compositionengine::OutputLayer* getOutputLayerForLayer( compositionengine::OutputLayer* getOutputLayerForLayer( compositionengine::Layer*) const override; compositionengine::Layer*) const override; Loading services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -60,6 +60,7 @@ public: MOCK_CONST_METHOD1(getDirtyRegion, Region(bool)); MOCK_CONST_METHOD1(getDirtyRegion, Region(bool)); MOCK_CONST_METHOD2(belongsInOutput, bool(std::optional<uint32_t>, bool)); MOCK_CONST_METHOD2(belongsInOutput, bool(std::optional<uint32_t>, bool)); MOCK_CONST_METHOD1(belongsInOutput, bool(const compositionengine::Layer*)); MOCK_CONST_METHOD1(getOutputLayerForLayer, MOCK_CONST_METHOD1(getOutputLayerForLayer, compositionengine::OutputLayer*(compositionengine::Layer*)); compositionengine::OutputLayer*(compositionengine::Layer*)); Loading services/surfaceflinger/CompositionEngine/src/Output.cpp +9 −0 Original line number Original line Diff line number Diff line Loading @@ -219,6 +219,15 @@ bool Output::belongsInOutput(std::optional<uint32_t> layerStackId, bool internal (!internalOnly || mState.layerStackInternal); (!internalOnly || mState.layerStackInternal); } } bool Output::belongsInOutput(const compositionengine::Layer* layer) const { if (!layer) { return false; } const auto& layerFEState = layer->getState().frontEnd; return belongsInOutput(layerFEState.layerStackId, layerFEState.internalOnly); } compositionengine::OutputLayer* Output::getOutputLayerForLayer( compositionengine::OutputLayer* Output::getOutputLayerForLayer( compositionengine::Layer* layer) const { compositionengine::Layer* layer) const { for (const auto& outputLayer : mOutputLayersOrderedByZ) { for (const auto& outputLayer : mOutputLayersOrderedByZ) { Loading services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +65 −0 Original line number Original line Diff line number Diff line Loading @@ -376,6 +376,71 @@ TEST_F(OutputTest, belongsInOutputFiltersAsExpected) { EXPECT_FALSE(mOutput.belongsInOutput(layerStack2, false)); EXPECT_FALSE(mOutput.belongsInOutput(layerStack2, false)); } } TEST_F(OutputTest, belongsInOutputFiltersLayersAsExpected) { StrictMock<mock::Layer> layer; impl::LayerCompositionState layerState; EXPECT_CALL(layer, getState()).WillRepeatedly(ReturnRef(layerState)); const uint32_t layerStack1 = 123u; const uint32_t layerStack2 = 456u; // If the output accepts layerStack1 and internal-only layers.... mOutput.setLayerStackFilter(layerStack1, true); // A null layer pointer does not belong to the output EXPECT_FALSE(mOutput.belongsInOutput(nullptr)); // A layer with no layerStack does not belong to it, internal-only or not. layerState.frontEnd.layerStackId = std::nullopt; layerState.frontEnd.internalOnly = false; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = std::nullopt; layerState.frontEnd.internalOnly = true; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); // Any layer with layerStack1 belongs to it, internal-only or not. layerState.frontEnd.layerStackId = layerStack1; layerState.frontEnd.internalOnly = false; EXPECT_TRUE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack1; layerState.frontEnd.internalOnly = true; EXPECT_TRUE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack2; layerState.frontEnd.internalOnly = true; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack2; layerState.frontEnd.internalOnly = false; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); // If the output accepts layerStack1 but not internal-only layers... mOutput.setLayerStackFilter(layerStack1, false); // A null layer pointer does not belong to the output EXPECT_FALSE(mOutput.belongsInOutput(nullptr)); // Only non-internal layers with layerStack1 belong to it. layerState.frontEnd.layerStackId = layerStack1; layerState.frontEnd.internalOnly = false; EXPECT_TRUE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack1; layerState.frontEnd.internalOnly = true; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack2; layerState.frontEnd.internalOnly = true; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack2; layerState.frontEnd.internalOnly = false; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); } /* /* * Output::getOutputLayerForLayer() * Output::getOutputLayerForLayer() */ */ Loading Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -134,6 +134,9 @@ public: // this output allows that. // this output allows that. virtual bool belongsInOutput(std::optional<uint32_t> layerStackId, bool internalOnly) const = 0; virtual bool belongsInOutput(std::optional<uint32_t> layerStackId, bool internalOnly) const = 0; // Determines if a layer belongs to the output. virtual bool belongsInOutput(const compositionengine::Layer*) const = 0; // Returns a pointer to the output layer corresponding to the given layer on // Returns a pointer to the output layer corresponding to the given layer on // this output, or nullptr if the layer does not have one // this output, or nullptr if the layer does not have one virtual OutputLayer* getOutputLayerForLayer(Layer*) const = 0; virtual OutputLayer* getOutputLayerForLayer(Layer*) const = 0; Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -63,6 +63,7 @@ public: Region getDirtyRegion(bool repaintEverything) const override; Region getDirtyRegion(bool repaintEverything) const override; bool belongsInOutput(std::optional<uint32_t>, bool) const override; bool belongsInOutput(std::optional<uint32_t>, bool) const override; bool belongsInOutput(const compositionengine::Layer*) const override; compositionengine::OutputLayer* getOutputLayerForLayer( compositionengine::OutputLayer* getOutputLayerForLayer( compositionengine::Layer*) const override; compositionengine::Layer*) const override; Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -60,6 +60,7 @@ public: MOCK_CONST_METHOD1(getDirtyRegion, Region(bool)); MOCK_CONST_METHOD1(getDirtyRegion, Region(bool)); MOCK_CONST_METHOD2(belongsInOutput, bool(std::optional<uint32_t>, bool)); MOCK_CONST_METHOD2(belongsInOutput, bool(std::optional<uint32_t>, bool)); MOCK_CONST_METHOD1(belongsInOutput, bool(const compositionengine::Layer*)); MOCK_CONST_METHOD1(getOutputLayerForLayer, MOCK_CONST_METHOD1(getOutputLayerForLayer, compositionengine::OutputLayer*(compositionengine::Layer*)); compositionengine::OutputLayer*(compositionengine::Layer*)); Loading
services/surfaceflinger/CompositionEngine/src/Output.cpp +9 −0 Original line number Original line Diff line number Diff line Loading @@ -219,6 +219,15 @@ bool Output::belongsInOutput(std::optional<uint32_t> layerStackId, bool internal (!internalOnly || mState.layerStackInternal); (!internalOnly || mState.layerStackInternal); } } bool Output::belongsInOutput(const compositionengine::Layer* layer) const { if (!layer) { return false; } const auto& layerFEState = layer->getState().frontEnd; return belongsInOutput(layerFEState.layerStackId, layerFEState.internalOnly); } compositionengine::OutputLayer* Output::getOutputLayerForLayer( compositionengine::OutputLayer* Output::getOutputLayerForLayer( compositionengine::Layer* layer) const { compositionengine::Layer* layer) const { for (const auto& outputLayer : mOutputLayersOrderedByZ) { for (const auto& outputLayer : mOutputLayersOrderedByZ) { Loading
services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +65 −0 Original line number Original line Diff line number Diff line Loading @@ -376,6 +376,71 @@ TEST_F(OutputTest, belongsInOutputFiltersAsExpected) { EXPECT_FALSE(mOutput.belongsInOutput(layerStack2, false)); EXPECT_FALSE(mOutput.belongsInOutput(layerStack2, false)); } } TEST_F(OutputTest, belongsInOutputFiltersLayersAsExpected) { StrictMock<mock::Layer> layer; impl::LayerCompositionState layerState; EXPECT_CALL(layer, getState()).WillRepeatedly(ReturnRef(layerState)); const uint32_t layerStack1 = 123u; const uint32_t layerStack2 = 456u; // If the output accepts layerStack1 and internal-only layers.... mOutput.setLayerStackFilter(layerStack1, true); // A null layer pointer does not belong to the output EXPECT_FALSE(mOutput.belongsInOutput(nullptr)); // A layer with no layerStack does not belong to it, internal-only or not. layerState.frontEnd.layerStackId = std::nullopt; layerState.frontEnd.internalOnly = false; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = std::nullopt; layerState.frontEnd.internalOnly = true; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); // Any layer with layerStack1 belongs to it, internal-only or not. layerState.frontEnd.layerStackId = layerStack1; layerState.frontEnd.internalOnly = false; EXPECT_TRUE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack1; layerState.frontEnd.internalOnly = true; EXPECT_TRUE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack2; layerState.frontEnd.internalOnly = true; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack2; layerState.frontEnd.internalOnly = false; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); // If the output accepts layerStack1 but not internal-only layers... mOutput.setLayerStackFilter(layerStack1, false); // A null layer pointer does not belong to the output EXPECT_FALSE(mOutput.belongsInOutput(nullptr)); // Only non-internal layers with layerStack1 belong to it. layerState.frontEnd.layerStackId = layerStack1; layerState.frontEnd.internalOnly = false; EXPECT_TRUE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack1; layerState.frontEnd.internalOnly = true; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack2; layerState.frontEnd.internalOnly = true; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); layerState.frontEnd.layerStackId = layerStack2; layerState.frontEnd.internalOnly = false; EXPECT_FALSE(mOutput.belongsInOutput(&layer)); } /* /* * Output::getOutputLayerForLayer() * Output::getOutputLayerForLayer() */ */ Loading