diff options
8 files changed, 82 insertions, 40 deletions
diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index ed45cabb87..4eeaba154f 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -132,6 +132,20 @@ status_t BufferStateLayer::addReleaseFence(const sp<CallbackHandle>& ch, // Interface implementation for Layer // ----------------------------------------------------------------------- void BufferStateLayer::onLayerDisplayed(const sp<Fence>& releaseFence) { + + // If a layer has been displayed again we may need to clear + // the mLastClientComposition fence that we use for early release in setBuffer + // (as we now have a new fence which won't pass through the client composition path in some cases + // e.g. screenshot). We expect one call to onLayerDisplayed after receiving the GL comp fence + // from a single composition cycle, and want to clear on the second call + // (which we track with mLastClientCompositionDisplayed) + if (mLastClientCompositionDisplayed) { + mLastClientCompositionFence = nullptr; + mLastClientCompositionDisplayed = false; + } else if (mLastClientCompositionFence) { + mLastClientCompositionDisplayed = true; + } + if (!releaseFence->isValid()) { return; } @@ -474,6 +488,13 @@ bool BufferStateLayer::setBuffer(const BufferData& bufferData, nsecs_t postTime, addSurfaceFrameDroppedForBuffer(mDrawingState.bufferSurfaceFrameTX); mDrawingState.bufferSurfaceFrameTX.reset(); } + } else if (mLastClientCompositionFence != nullptr) { + callReleaseBufferCallback(mDrawingState.releaseBufferListener, + mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber, + mLastClientCompositionFence, mTransformHint, + mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate( + mOwnerUid)); + mLastClientCompositionFence = nullptr; } } diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h index 6d1017f678..f7b71cf9fe 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h @@ -161,6 +161,7 @@ public: // Whether the layer should be rendered with rounded corners. virtual bool hasRoundedCorners() const = 0; + virtual void setWasClientComposed(const sp<Fence>&) {} }; // TODO(b/121291683): Specialize std::hash<> for sp<T> so these and others can diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h index a33b57d668..73770b7779 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h @@ -286,7 +286,8 @@ protected: virtual bool getSkipColorTransform() const = 0; virtual FrameFences presentAndGetFrameFences() = 0; virtual std::vector<LayerFE::LayerSettings> generateClientCompositionRequests( - bool supportsProtectedContent, ui::Dataspace outputDataspace) = 0; + bool supportsProtectedContent, ui::Dataspace outputDataspace, + std::vector<LayerFE*> &outLayerRef) = 0; virtual void appendRegionFlashRequests( const Region& flashRegion, std::vector<LayerFE::LayerSettings>& clientCompositionLayers) = 0; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h index 6d49ce6965..844876a997 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h @@ -113,7 +113,8 @@ protected: bool getSkipColorTransform() const override; compositionengine::Output::FrameFences presentAndGetFrameFences() override; std::vector<LayerFE::LayerSettings> generateClientCompositionRequests( - bool supportsProtectedContent, ui::Dataspace outputDataspace) override; + bool supportsProtectedContent, ui::Dataspace outputDataspace, + std::vector<LayerFE*> &outLayerFEs) override; void appendRegionFlashRequests(const Region&, std::vector<LayerFE::LayerSettings>&) override; void setExpensiveRenderingExpected(bool enabled) override; void dumpBase(std::string&) const; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h index 344b2f9456..7b0d028c11 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h @@ -114,8 +114,8 @@ public: MOCK_METHOD1(renderCachedSets, void(const CompositionRefreshArgs&)); MOCK_METHOD0(presentAndGetFrameFences, compositionengine::Output::FrameFences()); - MOCK_METHOD2(generateClientCompositionRequests, - std::vector<LayerFE::LayerSettings>(bool, ui::Dataspace)); + MOCK_METHOD3(generateClientCompositionRequests, + std::vector<LayerFE::LayerSettings>(bool, ui::Dataspace, std::vector<compositionengine::LayerFE*>&)); MOCK_METHOD2(appendRegionFlashRequests, void(const Region&, std::vector<LayerFE::LayerSettings>&)); MOCK_METHOD1(setExpensiveRenderingExpected, void(bool)); diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index eb3f3b1f8a..048d7c2b4a 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -1064,9 +1064,11 @@ std::optional<base::unique_fd> Output::composeSurfaces( } // Generate the client composition requests for the layers on this output. + std::vector<LayerFE*> clientCompositionLayersFE; std::vector<LayerFE::LayerSettings> clientCompositionLayers = generateClientCompositionRequests(supportsProtectedContent, - clientCompositionDisplay.outputDataspace); + clientCompositionDisplay.outputDataspace, + clientCompositionLayersFE); appendRegionFlashRequests(debugRegion, clientCompositionLayers); // Check if the client composition requests were rendered into the provided graphic buffer. If @@ -1131,11 +1133,18 @@ std::optional<base::unique_fd> Output::composeSurfaces( new Fence(dup(drawFence.get())))); } + if (clientCompositionLayersFE.size() > 0) { + sp<Fence> clientCompFence = new Fence(dup(drawFence.get())); + for (auto clientComposedLayer : clientCompositionLayersFE) { + clientComposedLayer->setWasClientComposed(clientCompFence); + } + } + return std::move(drawFence); } std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests( - bool supportsProtectedContent, ui::Dataspace outputDataspace) { + bool supportsProtectedContent, ui::Dataspace outputDataspace, std::vector<LayerFE*>& outLayerFEs) { std::vector<LayerFE::LayerSettings> clientCompositionLayers; ALOGV("Rendering client layers"); @@ -1214,6 +1223,7 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests( } } + outLayerFEs.push_back(&layerFE); clientCompositionLayers.insert(clientCompositionLayers.end(), std::make_move_iterator(results.begin()), std::make_move_iterator(results.end())); diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp index bec747908f..8f0028c399 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp @@ -2973,8 +2973,8 @@ struct OutputComposeSurfacesTest : public testing::Test { // Sets up the helper functions called by the function under test to use // mock implementations. MOCK_CONST_METHOD0(getSkipColorTransform, bool()); - MOCK_METHOD2(generateClientCompositionRequests, - std::vector<LayerFE::LayerSettings>(bool, ui::Dataspace)); + MOCK_METHOD3(generateClientCompositionRequests, + std::vector<LayerFE::LayerSettings>(bool, ui::Dataspace, std::vector<LayerFE*>&)); MOCK_METHOD2(appendRegionFlashRequests, void(const Region&, std::vector<LayerFE::LayerSettings>&)); MOCK_METHOD1(setExpensiveRenderingExpected, void(bool)); @@ -3123,7 +3123,7 @@ TEST_F(OutputComposeSurfacesTest, handlesZeroCompositionRequests) { EXPECT_CALL(*mDisplayColorProfile, hasWideColorGamut()).WillRepeatedly(Return(true)); EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillRepeatedly(Return(std::vector<LayerFE::LayerSettings>{})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) .WillRepeatedly(Return()); @@ -3151,7 +3151,7 @@ TEST_F(OutputComposeSurfacesTest, buildsAndRendersRequestList) { EXPECT_CALL(*mDisplayColorProfile, hasWideColorGamut()).WillRepeatedly(Return(true)); EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillRepeatedly(Return(std::vector<LayerFE::LayerSettings>{r1})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) .WillRepeatedly( @@ -3186,7 +3186,7 @@ TEST_F(OutputComposeSurfacesTest, EXPECT_CALL(*mDisplayColorProfile, hasWideColorGamut()).WillRepeatedly(Return(true)); EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillRepeatedly(Return(std::vector<LayerFE::LayerSettings>{r1})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) .WillRepeatedly( @@ -3220,7 +3220,7 @@ TEST_F(OutputComposeSurfacesTest, renderDuplicateClientCompositionRequestsWithou EXPECT_CALL(*mDisplayColorProfile, hasWideColorGamut()).WillRepeatedly(Return(true)); EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillRepeatedly(Return(std::vector<LayerFE::LayerSettings>{r1, r2})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) .WillRepeatedly(Return()); @@ -3252,7 +3252,7 @@ TEST_F(OutputComposeSurfacesTest, skipDuplicateClientCompositionRequests) { EXPECT_CALL(*mDisplayColorProfile, hasWideColorGamut()).WillRepeatedly(Return(true)); EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillRepeatedly(Return(std::vector<LayerFE::LayerSettings>{r1, r2})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) .WillRepeatedly(Return()); @@ -3282,7 +3282,7 @@ TEST_F(OutputComposeSurfacesTest, clientCompositionIfBufferChanges) { EXPECT_CALL(*mDisplayColorProfile, hasWideColorGamut()).WillRepeatedly(Return(true)); EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillRepeatedly(Return(std::vector<LayerFE::LayerSettings>{r1, r2})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) .WillRepeatedly(Return()); @@ -3323,7 +3323,7 @@ TEST_F(OutputComposeSurfacesTest, clientCompositionIfRequestChanges) { EXPECT_CALL(*mDisplayColorProfile, hasWideColorGamut()).WillRepeatedly(Return(true)); EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillOnce(Return(std::vector<LayerFE::LayerSettings>{r1, r2})) .WillOnce(Return(std::vector<LayerFE::LayerSettings>{r1, r3})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) @@ -3348,7 +3348,7 @@ struct OutputComposeSurfacesTest_UsesExpectedDisplaySettings : public OutputComp OutputComposeSurfacesTest_UsesExpectedDisplaySettings() { EXPECT_CALL(mRenderEngine, supportsProtectedContent()).WillRepeatedly(Return(false)); EXPECT_CALL(mRenderEngine, isProtected()).WillRepeatedly(Return(false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillRepeatedly(Return(std::vector<LayerFE::LayerSettings>{})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) .WillRepeatedly(Return()); @@ -3479,7 +3479,7 @@ struct OutputComposeSurfacesTest_HandlesProtectedContent : public OutputComposeS EXPECT_CALL(*mDisplayColorProfile, hasWideColorGamut()).WillRepeatedly(Return(true)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, _)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, _, _)) .WillRepeatedly(Return(std::vector<LayerFE::LayerSettings>{})); EXPECT_CALL(mOutput, appendRegionFlashRequests(RegionEq(kDebugRegion), _)) .WillRepeatedly(Return()); @@ -3609,7 +3609,7 @@ struct OutputComposeSurfacesTest_SetsExpensiveRendering : public OutputComposeSu TEST_F(OutputComposeSurfacesTest_SetsExpensiveRendering, IfExepensiveOutputDataspaceIsUsed) { mOutput.mState.dataspace = kExpensiveOutputDataspace; - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kExpensiveOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kExpensiveOutputDataspace, _)) .WillOnce(Return(std::vector<LayerFE::LayerSettings>{})); // For this test, we also check the call order of key functions. @@ -3634,7 +3634,7 @@ struct OutputComposeSurfacesTest_SetsExpensiveRendering_ForBlur EXPECT_CALL(mLayer.outputLayer, writeStateToHWC(/*includeGeometry*/ false, /*skipLayer*/ false, 0, /*zIsOverridden*/ false, /*isPeekingThrough*/ false)); - EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace)) + EXPECT_CALL(mOutput, generateClientCompositionRequests(_, kDefaultOutputDataspace, _)) .WillOnce(Return(std::vector<LayerFE::LayerSettings>{})); EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, false, _)) .WillOnce(Return(ByMove(futureOf<renderengine::RenderEngineResult>( @@ -3675,10 +3675,11 @@ TEST_F(OutputComposeSurfacesTest_SetsExpensiveRendering_ForBlur, IfBlursAreNotEx struct GenerateClientCompositionRequestsTest : public testing::Test { struct OutputPartialMock : public OutputPartialMockBase { // compositionengine::Output overrides - std::vector<LayerFE::LayerSettings> generateClientCompositionRequests( - bool supportsProtectedContent, ui::Dataspace dataspace) override { + std::vector<LayerFE::LayerSettings> generateClientCompositionRequestsHelper( + bool supportsProtectedContent, ui::Dataspace dataspace) { + std::vector<LayerFE*> ignore; return impl::Output::generateClientCompositionRequests(supportsProtectedContent, - dataspace); + dataspace, ignore); } }; @@ -3762,7 +3763,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, handlesNoClientCompost EXPECT_CALL(mLayers[1].mOutputLayer, requiresClientComposition()).WillOnce(Return(false)); EXPECT_CALL(mLayers[2].mOutputLayer, requiresClientComposition()).WillOnce(Return(false)); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); EXPECT_EQ(0u, requests.size()); } @@ -3772,7 +3773,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, requiresVisibleRegionA mLayers[1].mOutputLayerState.visibleRegion = Region(Rect(4000, 0, 4010, 10)); mLayers[2].mOutputLayerState.visibleRegion = Region(Rect(-10, -10, 0, 0)); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); EXPECT_EQ(0u, requests.size()); } @@ -3789,7 +3790,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, gathersClientCompositi .WillOnce(Return(std::vector<LayerFE::LayerSettings>( {mShadowSettings, mLayers[2].mLayerSettings}))); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); ASSERT_EQ(3u, requests.size()); EXPECT_EQ(mLayers[1].mLayerSettings, requests[0]); @@ -3826,7 +3827,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, overridesBlur) { .WillOnce(Return(std::vector<LayerFE::LayerSettings>( {mShadowSettings, mLayers[2].mLayerSettings}))); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); ASSERT_EQ(3u, requests.size()); EXPECT_EQ(mLayers[1].mLayerSettings, requests[0]); @@ -3856,7 +3857,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, EXPECT_CALL(*mLayers[2].mLayerFE, prepareClientCompositionList(_)) .WillOnce(Return(std::vector<LayerFE::LayerSettings>({mLayers[2].mLayerSettings}))); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); ASSERT_EQ(1u, requests.size()); EXPECT_EQ(mLayers[2].mLayerSettings, requests[0]); @@ -3879,7 +3880,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, EXPECT_CALL(*mLayers[2].mLayerFE, prepareClientCompositionList(_)) .WillOnce(Return(std::vector<LayerFE::LayerSettings>({mLayers[2].mLayerSettings}))); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); ASSERT_EQ(1u, requests.size()); EXPECT_EQ(mLayers[2].mLayerSettings, requests[0]); @@ -3938,7 +3939,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, clearsHWCLayersIfOpaqu EXPECT_CALL(*mLayers[2].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer2TargetSettings)))) .WillOnce(Return(std::vector<LayerFE::LayerSettings>({mLayers[2].mLayerSettings}))); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); ASSERT_EQ(2u, requests.size()); @@ -3996,7 +3997,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, .WillOnce(Return(std::vector<LayerFE::LayerSettings>())); static_cast<void>( - mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace)); } @@ -4047,8 +4048,8 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, .WillOnce(Return(std::vector<LayerFE::LayerSettings>())); static_cast<void>( - mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, - kDisplayDataspace)); + mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, + kDisplayDataspace)); } TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, @@ -4099,8 +4100,8 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, .WillOnce(Return(std::vector<LayerFE::LayerSettings>())); static_cast<void>( - mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, - kDisplayDataspace)); + mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, + kDisplayDataspace)); } TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, @@ -4149,8 +4150,8 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, .WillOnce(Return(std::vector<LayerFE::LayerSettings>())); static_cast<void>( - mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, - kDisplayDataspace)); + mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, + kDisplayDataspace)); } TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, @@ -4197,7 +4198,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, EXPECT_CALL(*mLayers[2].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer2TargetSettings)))) .WillOnce(Return(std::vector<LayerFE::LayerSettings>())); - static_cast<void>(mOutput.generateClientCompositionRequests(true /* supportsProtectedContent */, + static_cast<void>(mOutput.generateClientCompositionRequestsHelper(true /* supportsProtectedContent */, kDisplayDataspace)); } @@ -4381,7 +4382,7 @@ TEST_F(GenerateClientCompositionRequestsTest, handlesLandscapeModeSplitScreenReq constexpr bool supportsProtectedContent = true; auto requests = - mOutput.generateClientCompositionRequests(supportsProtectedContent, kOutputDataspace); + mOutput.generateClientCompositionRequestsHelper(supportsProtectedContent, kOutputDataspace); ASSERT_EQ(2u, requests.size()); EXPECT_EQ(leftLayer.mLayerSettings, requests[0]); EXPECT_EQ(rightLayer.mLayerSettings, requests[1]); @@ -4417,7 +4418,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, EXPECT_CALL(*mLayers[2].mLayerFE, prepareClientCompositionList(Eq(ByRef(layer2Settings)))) .WillOnce(Return(std::vector<LayerFE::LayerSettings>({mShadowSettings}))); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); ASSERT_EQ(1u, requests.size()); @@ -4456,7 +4457,7 @@ TEST_F(GenerateClientCompositionRequestsTest_ThreeLayers, .WillOnce(Return(std::vector<LayerFE::LayerSettings>( {mShadowSettings, mLayers[2].mLayerSettings}))); - auto requests = mOutput.generateClientCompositionRequests(false /* supportsProtectedContent */, + auto requests = mOutput.generateClientCompositionRequestsHelper(false /* supportsProtectedContent */, kDisplayDataspace); ASSERT_EQ(2u, requests.size()); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index f29ebde66b..d17c05b3fa 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -623,6 +623,11 @@ public: std::vector<compositionengine::LayerFE::LayerSettings> prepareClientCompositionList( compositionengine::LayerFE::ClientCompositionTargetSettings&) override; void onLayerDisplayed(const sp<Fence>& releaseFence) override; + + void setWasClientComposed(const sp<Fence>& fence) override { + mLastClientCompositionFence = fence; + } + const char* getDebugName() const override; bool setShadowRadius(float shadowRadius); @@ -1028,6 +1033,8 @@ protected: mutable bool mDrawingStateModified = false; + sp<Fence> mLastClientCompositionFence; + bool mLastClientCompositionDisplayed = false; private: virtual void setTransformHint(ui::Transform::RotationFlags) {} |