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

Commit 66c20c4d authored by Lloyd Pique's avatar Lloyd Pique
Browse files

SF: Cleanup Layer membership test

Rather than passing the individual data for the layer (stack id,
primaryOnly flag), pass the entire layer, and have the Output class look
for the right data.

This makes it easier to change the membership logic later if desired.

Test: atest libsurfaceflinger_unittest libcompositionengine_test
Test: go/wm-smoke
Bug: 121291683
Change-Id: Ieccb3986dd4f045b68329825a7e3e05734811cc0
parent 5f90ed61
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -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;
+1 −0
Original line number Original line Diff line number Diff line
@@ -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;
+1 −0
Original line number Original line Diff line number Diff line
@@ -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*));
+9 −0
Original line number Original line Diff line number Diff line
@@ -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) {
+65 −0
Original line number Original line Diff line number Diff line
@@ -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