summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vishnu Nair <vishnun@google.com> 2023-08-30 21:41:46 -0700
committer Vishnu Nair <vishnun@google.com> 2023-08-30 21:43:24 -0700
commit61ff12ae241b7423e76a76d8f63d2d6ae00c7efd (patch)
tree1476cefbe4a4dd5ba817c3e8c44967bb09c73c82
parentf486c070103c658259651b04c09b5cbcae88d3cd (diff)
[sf-newfe] set visible regions flag when layer opacity changes
Bug: 298114008 Test: crystalball Change-Id: Ic81b9a3cdd1e1df1de1de4ab154539e96eed86f8
-rw-r--r--services/surfaceflinger/FrontEnd/RequestedLayerState.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
index 453b51e917..de3295130a 100644
--- a/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
+++ b/services/surfaceflinger/FrontEnd/RequestedLayerState.cpp
@@ -150,6 +150,8 @@ void RequestedLayerState::merge(const ResolvedComposerState& resolvedComposerSta
? ui::Size(externalTexture->getWidth(), externalTexture->getHeight())
: ui::Size();
const uint64_t oldUsageFlags = hadBuffer ? externalTexture->getUsage() : 0;
+ const bool oldBufferFormatOpaque = LayerSnapshot::isOpaqueFormat(
+ externalTexture ? externalTexture->getPixelFormat() : PIXEL_FORMAT_NONE);
const bool hadSideStream = sidebandStream != nullptr;
const layer_state_t& clientState = resolvedComposerState.state;
@@ -160,7 +162,7 @@ void RequestedLayerState::merge(const ResolvedComposerState& resolvedComposerSta
LLOGV(layerId, "requested=%" PRIu64 "flags=%" PRIu64, clientState.what, clientChanges);
if (clientState.what & layer_state_t::eFlagsChanged) {
- if ((oldFlags ^ flags) & layer_state_t::eLayerHidden) {
+ if ((oldFlags ^ flags) & (layer_state_t::eLayerHidden | layer_state_t::eLayerOpaque)) {
changes |= RequestedLayerState::Changes::Visibility |
RequestedLayerState::Changes::VisibleRegion;
}
@@ -214,6 +216,13 @@ void RequestedLayerState::merge(const ResolvedComposerState& resolvedComposerSta
barrierProducerId = std::max(bufferData->producerId, barrierProducerId);
barrierFrameNumber = std::max(bufferData->frameNumber, barrierFrameNumber);
}
+
+ const bool newBufferFormatOpaque = LayerSnapshot::isOpaqueFormat(
+ externalTexture ? externalTexture->getPixelFormat() : PIXEL_FORMAT_NONE);
+ if (newBufferFormatOpaque != oldBufferFormatOpaque) {
+ changes |= RequestedLayerState::Changes::Visibility |
+ RequestedLayerState::Changes::VisibleRegion;
+ }
}
if (clientState.what & layer_state_t::eSidebandStreamChanged) {