From afd527ab1d841df22073f3b8c77ac3349c0e49e1 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Tue, 18 Oct 2022 08:56:10 -0700 Subject: SF: Update transform hint when reparenting layers A layer might be reparented to another display. When that happens, update the transform hint for the layer. Also, use the correct display when creating a layer. Bug: 251360251 Test: move app between displays, rotate, check final buffer transforms Change-Id: I742c15319d09804a5d7a4c1aac383893d7a67d53 --- services/surfaceflinger/SurfaceFlinger.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index a04ceefaf4..e0119bea2f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -84,6 +84,7 @@ #include #include #include +#include #include #include #include @@ -4116,6 +4117,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(); @@ -4380,6 +4383,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; } @@ -6876,7 +6885,20 @@ void SurfaceFlinger::handleLayerCreatedLocked(const LayerCreatedState& state, Vs parent->addChild(layer); } - layer->updateTransformHint(mActiveDisplayTransformHint); + ui::LayerStack layerStack = layer->getLayerStack(); + sp 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); } -- cgit v1.2.3-59-g8ed1b