From 6213bd900145b9189c7d87aec8a2714a66c8d057 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Fri, 8 May 2020 17:42:25 -0700 Subject: Provide a fixed transform hint if the layer is in a fixed orientation 1/2 The transform hint is used to prevent allocating a buffer of a different size when a layer is rotated. The producer can choose to consume the hint and allocate the buffer with the same size. Provide the graphic producer a transform hint if the layer and its children are in an orientation different from the display's orientation. The caller is responsible for clearing this transform hint if the layer is no longer in a fixed orientation. Bug: 152919661 Test: atest VulkanPreTransformTest Test: confirm with winscope trace, buffers are allocated taking into account the transform hint in fixed orientation scenarios Test: go/wm-smoke Change-Id: Iea9dcf909921802a5be5c44dd61be3274f36bbd8 --- services/surfaceflinger/SurfaceFlinger.cpp | 33 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'services/surfaceflinger/SurfaceFlinger.cpp') diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 4ca2074ad5..a2e9e2f6da 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2764,7 +2764,7 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) processDisplayHotplugEventsLocked(); } - if (transactionFlags & (eDisplayLayerStackChanged|eDisplayTransactionNeeded)) { + if (transactionFlags & (eTransformHintUpdateNeeded | eDisplayTransactionNeeded)) { // The transform hint might have changed for some layers // (either because a display has changed, or because a layer // as changed). @@ -2832,7 +2832,6 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) }); } - /* * Perform our own transaction if needed */ @@ -3137,7 +3136,8 @@ void SurfaceFlinger::invalidateHwcGeometry() status_t SurfaceFlinger::addClientLayer(const sp& client, const sp& handle, const sp& gbc, const sp& lbc, const sp& parentHandle, - const sp& parentLayer, bool addToCurrentState) { + const sp& parentLayer, bool addToCurrentState, + uint32_t* outTransformHint) { // add this layer to the current state list { Mutex::Autolock _l(mStateLock); @@ -3178,6 +3178,14 @@ status_t SurfaceFlinger::addClientLayer(const sp& client, const spupdateTransformHint(display); + } + if (outTransformHint) { + *outTransformHint = lbc->getTransformHint(); + } + mLayersAdded = true; } @@ -3679,7 +3687,7 @@ uint32_t SurfaceFlinger::setClientStateLocked( mCurrentState.layersSortedByZ.add(layer); // we need traversal (state changed) // AND transaction (list changed) - flags |= eTransactionNeeded|eTraversalNeeded|eDisplayLayerStackChanged; + flags |= eTransactionNeeded | eTraversalNeeded | eTransformHintUpdateNeeded; } } if (what & layer_state_t::eDeferTransaction_legacy) { @@ -3776,6 +3784,11 @@ uint32_t SurfaceFlinger::setClientStateLocked( flags |= eTraversalNeeded; } } + if (what & layer_state_t::eFixedTransformHintChanged) { + if (layer->setFixedTransformHint(s.fixedTransformHint)) { + flags |= eTraversalNeeded | eTransformHintUpdateNeeded; + } + } // This has to happen after we reparent children because when we reparent to null we remove // child layers from current state and remove its relative z. If the children are reparented in // the same transaction, then we have to make sure we reparent the children first so we do not @@ -3863,7 +3876,8 @@ status_t SurfaceFlinger::mirrorLayer(const sp& client, const sp mirrorLayer->mClonedChild = mirrorFrom->createClone(); } - return addClientLayer(client, *outHandle, nullptr, mirrorLayer, nullptr, nullptr, false); + return addClientLayer(client, *outHandle, nullptr, mirrorLayer, nullptr, nullptr, false, + nullptr /* outTransformHint */); } status_t SurfaceFlinger::createLayer(const String8& name, const sp& client, uint32_t w, @@ -3908,7 +3922,7 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp& clie break; case ISurfaceComposerClient::eFXSurfaceBufferState: result = createBufferStateLayer(client, std::move(uniqueName), w, h, flags, - std::move(metadata), handle, outTransformHint, &layer); + std::move(metadata), handle, &layer); break; case ISurfaceComposerClient::eFXSurfaceEffect: // check if buffer size is set for color layer. @@ -3946,7 +3960,7 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp& clie bool addToCurrentState = callingThreadHasUnscopedSurfaceFlingerAccess(); result = addClientLayer(client, *handle, *gbp, layer, parentHandle, parentLayer, - addToCurrentState); + addToCurrentState, outTransformHint); if (result != NO_ERROR) { return result; } @@ -4023,14 +4037,11 @@ status_t SurfaceFlinger::createBufferQueueLayer(const sp& client, std::s status_t SurfaceFlinger::createBufferStateLayer(const sp& client, std::string name, uint32_t w, uint32_t h, uint32_t flags, LayerMetadata metadata, sp* handle, - uint32_t* outTransformHint, sp* outLayer) { + sp* outLayer) { LayerCreationArgs args(this, client, std::move(name), w, h, flags, std::move(metadata)); args.displayDevice = getDefaultDisplayDevice(); args.textureName = getNewTexture(); sp layer = getFactory().createBufferStateLayer(args); - if (outTransformHint) { - *outTransformHint = layer->getTransformHint(); - } *handle = layer->getHandle(); *outLayer = layer; -- cgit v1.2.3-59-g8ed1b