diff options
| author | 2021-05-20 23:58:28 +0000 | |
|---|---|---|
| committer | 2021-05-20 23:58:28 +0000 | |
| commit | 0b0a068ae0eb1a0de01d6a1c8576ea318d1de7f9 (patch) | |
| tree | 3ee6900550f6cf8921e95493efd61ff523000fb1 | |
| parent | 5d5f7a741e70e4c5af63d0c42061d1907706d98c (diff) | |
| parent | 54f4a4e9e14738e1798cc81b7166e43281fd2028 (diff) | |
Merge "Don't re-render CachedSets" into sc-dev
4 files changed, 48 insertions, 1 deletions
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h index dc6eab4e34..fdcd6abe65 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h @@ -78,6 +78,7 @@ public: size_t getDisplayCost() const; bool hasBufferUpdate() const; + bool hasRenderedBuffer() const { return mTexture != nullptr; } bool hasReadyBuffer() const; // Decomposes this CachedSet into a vector of its layers as individual CachedSets diff --git a/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp b/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp index 294ec4bcb4..fdd73afebc 100644 --- a/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp +++ b/services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp @@ -91,7 +91,7 @@ NonBufferHash Flattener::flattenLayers(const std::vector<const LayerState*>& lay void Flattener::renderCachedSets(renderengine::RenderEngine& renderEngine, const OutputCompositionState& outputState) { - if (!mNewCachedSet) { + if (!mNewCachedSet || mNewCachedSet->hasRenderedBuffer()) { return; } @@ -393,6 +393,11 @@ void Flattener::buildCachedSets(time_point now) { return; } + // Don't try to build a new cached set if we already have a new one in progress + if (mNewCachedSet) { + return; + } + std::vector<Run> runs = findCandidateRuns(now); std::optional<Run> bestRun = findBestRun(runs); diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp index 488f64da23..8f44677676 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp @@ -134,6 +134,7 @@ void expectReadyBuffer(const CachedSet& cachedSet) { EXPECT_NE(nullptr, cachedSet.getBuffer()); EXPECT_NE(nullptr, cachedSet.getDrawFence()); EXPECT_TRUE(cachedSet.hasReadyBuffer()); + EXPECT_TRUE(cachedSet.hasRenderedBuffer()); } TEST_F(CachedSetTest, createFromLayer) { diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp index 42096f3fdb..7ec2c98bc1 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp @@ -786,5 +786,45 @@ TEST_F(FlattenerTest, flattenLayers_flattenSkipsLayerWithBlurBehind) { EXPECT_EQ(overrideBuffer3, overrideBuffer4); } +TEST_F(FlattenerTest, flattenLayers_renderCachedSets_doesNotRenderTwice) { + auto& layerState1 = mTestLayers[0]->layerState; + auto& layerState2 = mTestLayers[1]->layerState; + const auto& overrideBuffer1 = layerState1->getOutputLayer()->getState().overrideInfo.buffer; + const auto& overrideBuffer2 = layerState2->getOutputLayer()->getState().overrideInfo.buffer; + + const std::vector<const LayerState*> layers = { + layerState1.get(), + layerState2.get(), + }; + + initializeFlattener(layers); + + // Mark the layers inactive + mTime += 200ms; + // layers would be flattened but the buffer would not be overridden + EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).WillOnce(Return(NO_ERROR)); + + initializeOverrideBuffer(layers); + EXPECT_EQ(getNonBufferHash(layers), + mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); + + EXPECT_EQ(nullptr, overrideBuffer1); + EXPECT_EQ(nullptr, overrideBuffer2); + + // Simulate attempting to render prior to merging the new cached set with the layer stack. + // Here we should not try to re-render. + EXPECT_CALL(mRenderEngine, drawLayers(_, _, _, _, _, _)).Times(0); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); + + // We provide the override buffer now that it's rendered + EXPECT_NE(getNonBufferHash(layers), + mFlattener->flattenLayers(layers, getNonBufferHash(layers), mTime)); + mFlattener->renderCachedSets(mRenderEngine, mOutputState); + + EXPECT_NE(nullptr, overrideBuffer1); + EXPECT_EQ(overrideBuffer2, overrideBuffer1); +} + } // namespace } // namespace android::compositionengine |