Fix caching runtime toggle
1. When caching is disabled, the override info must be cleared before
repainting the screen. Otherwise, ignored layers may persist in HWC.
2. Dispatch the caching toggle on the main thread, to de-risk threading
issues.
Bug: 188611599
Test: adb shell service call SurfaceFlinger i32 1040 0, then check
dumpsys
Change-Id: I6926e69fb9762209c958beceb2679cd7a5806306
Merged-In: I6926e69fb9762209c958beceb2679cd7a5806306
diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
index 11736d1..6677f40 100644
--- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
+++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
@@ -259,6 +259,27 @@
EXPECT_FALSE(mOutput->plannerEnabled());
}
+TEST_F(OutputTest, setLayerCachingEnabled_disablesCachingAndResetsOverrideInfo) {
+ renderengine::mock::RenderEngine renderEngine;
+ const auto kSize = ui::Size(1, 1);
+ EXPECT_CALL(*mRenderSurface, getSize()).WillRepeatedly(ReturnRef(kSize));
+ mOutput->setLayerCachingEnabled(true);
+
+ // Inject some layers
+ InjectedLayer layer;
+ layer.outputLayerState.overrideInfo.buffer = std::make_shared<
+ renderengine::ExternalTexture>(new GraphicBuffer(), renderEngine,
+ renderengine::ExternalTexture::Usage::READABLE |
+ renderengine::ExternalTexture::Usage::WRITEABLE);
+ injectOutputLayer(layer);
+ // inject a null layer to check for null exceptions
+ injectNullOutputLayer();
+
+ EXPECT_NE(nullptr, layer.outputLayerState.overrideInfo.buffer);
+ mOutput->setLayerCachingEnabled(false);
+ EXPECT_EQ(nullptr, layer.outputLayerState.overrideInfo.buffer);
+}
+
/*
* Output::setProjection()
*/