Allow latch unsignaled if there are no flag changes
Instead of checking the change flags, check if the value
of the flags changed instead.
Change-Id: I0999609666ff78a3af8ba55c88835a9a5a74e8bc
Test: presubmit
Fixes: 340362109
diff --git a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
index 5631fac..db515e1 100644
--- a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
+++ b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
@@ -588,23 +588,22 @@
const uint64_t deniedFlags = layer_state_t::eProducerDisconnect | layer_state_t::eLayerChanged |
layer_state_t::eRelativeLayerChanged | layer_state_t::eTransparentRegionChanged |
- layer_state_t::eFlagsChanged | layer_state_t::eBlurRegionsChanged |
- layer_state_t::eLayerStackChanged | layer_state_t::eReparent |
+ layer_state_t::eBlurRegionsChanged | layer_state_t::eLayerStackChanged |
+ layer_state_t::eReparent |
(FlagManager::getInstance().latch_unsignaled_with_auto_refresh_changed()
? 0
- : layer_state_t::eAutoRefreshChanged);
+ : (layer_state_t::eAutoRefreshChanged | layer_state_t::eFlagsChanged));
if (s.what & deniedFlags) {
ATRACE_FORMAT_INSTANT("%s: false [has denied flags 0x%" PRIx64 "]", __func__,
s.what & deniedFlags);
return false;
}
- bool changedFlags = diff(s);
- static constexpr auto deniedChanges = layer_state_t::ePositionChanged |
- layer_state_t::eAlphaChanged | layer_state_t::eColorTransformChanged |
- layer_state_t::eBackgroundColorChanged | layer_state_t::eMatrixChanged |
- layer_state_t::eCornerRadiusChanged | layer_state_t::eBackgroundBlurRadiusChanged |
- layer_state_t::eBufferTransformChanged |
+ const uint64_t changedFlags = diff(s);
+ const uint64_t deniedChanges = layer_state_t::ePositionChanged | layer_state_t::eAlphaChanged |
+ layer_state_t::eColorTransformChanged | layer_state_t::eBackgroundColorChanged |
+ layer_state_t::eMatrixChanged | layer_state_t::eCornerRadiusChanged |
+ layer_state_t::eBackgroundBlurRadiusChanged | layer_state_t::eBufferTransformChanged |
layer_state_t::eTransformToDisplayInverseChanged | layer_state_t::eCropChanged |
layer_state_t::eDataspaceChanged | layer_state_t::eHdrMetadataChanged |
layer_state_t::eSidebandStreamChanged | layer_state_t::eColorSpaceAgnosticChanged |
@@ -612,10 +611,13 @@
layer_state_t::eTrustedOverlayChanged | layer_state_t::eStretchChanged |
layer_state_t::eBufferCropChanged | layer_state_t::eDestinationFrameChanged |
layer_state_t::eDimmingEnabledChanged | layer_state_t::eExtendedRangeBrightnessChanged |
- layer_state_t::eDesiredHdrHeadroomChanged;
+ layer_state_t::eDesiredHdrHeadroomChanged |
+ (FlagManager::getInstance().latch_unsignaled_with_auto_refresh_changed()
+ ? layer_state_t::eFlagsChanged
+ : 0);
if (changedFlags & deniedChanges) {
ATRACE_FORMAT_INSTANT("%s: false [has denied changes flags 0x%" PRIx64 "]", __func__,
- s.what & deniedChanges);
+ changedFlags & deniedChanges);
return false;
}
diff --git a/services/surfaceflinger/tests/unittests/LayerLifecycleManagerTest.cpp b/services/surfaceflinger/tests/unittests/LayerLifecycleManagerTest.cpp
index cfc8e99..97bd79f 100644
--- a/services/surfaceflinger/tests/unittests/LayerLifecycleManagerTest.cpp
+++ b/services/surfaceflinger/tests/unittests/LayerLifecycleManagerTest.cpp
@@ -592,4 +592,41 @@
mLifecycleManager.commitChanges();
}
+TEST_F(LayerLifecycleManagerTest, isSimpleBufferUpdate) {
+ auto layer = rootLayer(1);
+
+ // no buffer changes
+ EXPECT_FALSE(layer->isSimpleBufferUpdate({}));
+
+ {
+ layer_state_t state;
+ state.what = layer_state_t::eBufferChanged;
+ EXPECT_TRUE(layer->isSimpleBufferUpdate(state));
+ }
+
+ {
+ layer_state_t state;
+ state.what = layer_state_t::eReparent | layer_state_t::eBufferChanged;
+ EXPECT_FALSE(layer->isSimpleBufferUpdate(state));
+ }
+
+ {
+ layer_state_t state;
+ state.what = layer_state_t::ePositionChanged | layer_state_t::eBufferChanged;
+ state.x = 9;
+ state.y = 10;
+ EXPECT_FALSE(layer->isSimpleBufferUpdate(state));
+ }
+
+ {
+ layer->x = 9;
+ layer->y = 10;
+ layer_state_t state;
+ state.what = layer_state_t::ePositionChanged | layer_state_t::eBufferChanged;
+ state.x = 9;
+ state.y = 10;
+ EXPECT_TRUE(layer->isSimpleBufferUpdate(state));
+ }
+}
+
} // namespace android::surfaceflinger::frontend