diff options
| author | 2021-04-07 21:42:09 +0800 | |
|---|---|---|
| committer | 2021-04-09 12:13:28 +0800 | |
| commit | 413d46aedd5d77c659e9662e64ef66033dba76b4 (patch) | |
| tree | 05680fcf62b39e1791282775925aa6723817adc1 | |
| parent | 87f1e3fe07ac72cb6e8d94fe0ccf551bbcc5b2f2 (diff) | |
SF: Restore geometry state when it had been overridden
The geometry state of a flattened layer was overridden when layer cache
was applied. When the layer cache is invalid, it is necessary to restore
the geometry state back to original.
Bug: 184729207
Test: libcompositionengine_test
Test: Enable SF cache with smooth display
Change-Id: Id721cd451209ab50e5cd8badf5f3e0917506e728
3 files changed, 11 insertions, 5 deletions
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayerCompositionState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayerCompositionState.h index 4c065ec112..48a54d6c66 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayerCompositionState.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayerCompositionState.h @@ -115,6 +115,9 @@ struct OutputLayerCompositionState { // The buffer cache for this layer. This is used to lower the // cost of sending reused buffers to the HWC. HwcBufferCache hwcBufferCache; + + // Set to true when overridden info has been sent to HW composer + bool stateOverridden = false; }; // The HWC state is optional, and is only set up if there is any potential diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index aed3be93c3..e42be17319 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -722,10 +722,7 @@ void Output::writeCompositionState(const compositionengine::CompositionRefreshAr previousOverride = layer->getState().overrideInfo.buffer; } - // TODO(b/181172795): We now update geometry for all flattened layers. We should update it - // only when the geometry actually changes - const bool includeGeometry = refreshArgs.updatingGeometryThisFrame || - layer->getState().overrideInfo.buffer != nullptr || skipLayer; + const bool includeGeometry = refreshArgs.updatingGeometryThisFrame; layer->writeStateToHWC(includeGeometry, skipLayer); } } diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp index 3f36a8feea..f640f85bca 100644 --- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp +++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp @@ -333,7 +333,11 @@ void OutputLayer::writeStateToHWC(bool includeGeometry, bool skipLayer) { auto requestedCompositionType = outputIndependentState->compositionType; - if (includeGeometry) { + // TODO(b/181172795): We now update geometry for all flattened layers. We should update it + // only when the geometry actually changes + const bool isOverridden = state.overrideInfo.buffer != nullptr; + const bool prevOverridden = state.hwc->stateOverridden; + if (isOverridden || prevOverridden || skipLayer || includeGeometry) { writeOutputDependentGeometryStateToHWC(hwcLayer.get(), requestedCompositionType); writeOutputIndependentGeometryStateToHWC(hwcLayer.get(), *outputIndependentState, skipLayer); @@ -346,6 +350,8 @@ void OutputLayer::writeStateToHWC(bool includeGeometry, bool skipLayer) { // Always set the layer color after setting the composition type. writeSolidColorStateToHWC(hwcLayer.get(), *outputIndependentState); + + editState().hwc->stateOverridden = isOverridden; } void OutputLayer::writeOutputDependentGeometryStateToHWC( |