summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alec Mouri <alecmouri@google.com> 2021-05-20 23:58:28 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-05-20 23:58:28 +0000
commit0b0a068ae0eb1a0de01d6a1c8576ea318d1de7f9 (patch)
tree3ee6900550f6cf8921e95493efd61ff523000fb1
parent5d5f7a741e70e4c5af63d0c42061d1907706d98c (diff)
parent54f4a4e9e14738e1798cc81b7166e43281fd2028 (diff)
Merge "Don't re-render CachedSets" into sc-dev
-rw-r--r--services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/CachedSet.h1
-rw-r--r--services/surfaceflinger/CompositionEngine/src/planner/Flattener.cpp7
-rw-r--r--services/surfaceflinger/CompositionEngine/tests/planner/CachedSetTest.cpp1
-rw-r--r--services/surfaceflinger/CompositionEngine/tests/planner/FlattenerTest.cpp40
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