diff options
| author | 2022-10-20 17:38:46 +0000 | |
|---|---|---|
| committer | 2022-10-20 17:38:46 +0000 | |
| commit | b7458aeec6d575bd06e33a83ab26ebd41c3eaa63 (patch) | |
| tree | e6a3f0ccc52dee14774b583563d7c157a0021a36 | |
| parent | 5cb1b5e360d762433cb2317a36e81ddd76c24f60 (diff) | |
| parent | afd527ab1d841df22073f3b8c77ac3349c0e49e1 (diff) | |
Merge "SF: Update transform hint when reparenting layers"
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 6cd57c4e53..100ad43f32 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -84,6 +84,7 @@ #include <ui/DisplayState.h> #include <ui/DynamicDisplayInfo.h> #include <ui/GraphicBufferAllocator.h> +#include <ui/LayerStack.h> #include <ui/PixelFormat.h> #include <ui/StaticDisplayInfo.h> #include <utils/StopWatch.h> @@ -4115,6 +4116,8 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime return 0; } + ui::LayerStack oldLayerStack = layer->getLayerStack(); + // Only set by BLAST adapter layers if (what & layer_state_t::eProducerDisconnect) { layer->onDisconnect(); @@ -4379,6 +4382,12 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime if (layer->setTransactionCompletedListeners(callbackHandles)) flags |= eTraversalNeeded; // Do not put anything that updates layer state or modifies flags after // setTransactionCompletedListener + + // if the layer has been parented on to a new display, update its transform hint. + if (((flags & eTransformHintUpdateNeeded) == 0) && oldLayerStack != layer->getLayerStack()) { + flags |= eTransformHintUpdateNeeded; + } + return flags; } @@ -6877,7 +6886,20 @@ void SurfaceFlinger::handleLayerCreatedLocked(const LayerCreatedState& state, Vs parent->addChild(layer); } - layer->updateTransformHint(mActiveDisplayTransformHint); + ui::LayerStack layerStack = layer->getLayerStack(); + sp<const DisplayDevice> hintDisplay; + // Find the display that includes the layer. + for (const auto& [token, display] : mDisplays) { + if (display->getLayerStack() == layerStack) { + hintDisplay = display; + break; + } + } + + if (hintDisplay) { + layer->updateTransformHint(hintDisplay->getTransformHint()); + } + if (mTransactionTracing) { mTransactionTracing->onLayerAddedToDrawingState(layer->getSequence(), vsyncId.value); } |