diff options
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 0709a13c30..3b66fa9cd1 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2765,7 +2765,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). @@ -2833,7 +2833,6 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) }); } - /* * Perform our own transaction if needed */ @@ -3138,7 +3137,8 @@ void SurfaceFlinger::invalidateHwcGeometry() status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBinder>& handle, const sp<IGraphicBufferProducer>& gbc, const sp<Layer>& lbc, const sp<IBinder>& parentHandle, - const sp<Layer>& parentLayer, bool addToCurrentState) { + const sp<Layer>& parentLayer, bool addToCurrentState, + uint32_t* outTransformHint) { // add this layer to the current state list { Mutex::Autolock _l(mStateLock); @@ -3179,6 +3179,14 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBind mGraphicBufferProducerList.size(), mMaxGraphicBufferProducerListSize, mNumLayers.load()); } + + if (const auto display = getDefaultDisplayDeviceLocked()) { + lbc->updateTransformHint(display); + } + if (outTransformHint) { + *outTransformHint = lbc->getTransformHint(); + } + mLayersAdded = true; } @@ -3680,7 +3688,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) { @@ -3777,6 +3785,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 @@ -3864,7 +3877,8 @@ status_t SurfaceFlinger::mirrorLayer(const sp<Client>& client, const sp<IBinder> 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>& client, uint32_t w, @@ -3909,7 +3923,7 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& 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. @@ -3947,7 +3961,7 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie bool addToCurrentState = callingThreadHasUnscopedSurfaceFlingerAccess(); result = addClientLayer(client, *handle, *gbp, layer, parentHandle, parentLayer, - addToCurrentState); + addToCurrentState, outTransformHint); if (result != NO_ERROR) { return result; } @@ -4024,14 +4038,11 @@ status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client, std::s status_t SurfaceFlinger::createBufferStateLayer(const sp<Client>& client, std::string name, uint32_t w, uint32_t h, uint32_t flags, LayerMetadata metadata, sp<IBinder>* handle, - uint32_t* outTransformHint, sp<Layer>* outLayer) { + sp<Layer>* outLayer) { LayerCreationArgs args(this, client, std::move(name), w, h, flags, std::move(metadata)); args.displayDevice = getDefaultDisplayDevice(); args.textureName = getNewTexture(); sp<BufferStateLayer> layer = getFactory().createBufferStateLayer(args); - if (outTransformHint) { - *outTransformHint = layer->getTransformHint(); - } *handle = layer->getHandle(); *outLayer = layer; |