diff options
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 35 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 15 |
2 files changed, 24 insertions, 26 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 8d7221c1dc..48c3c108c1 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -3356,8 +3356,7 @@ bool SurfaceFlinger::latchBuffers() { 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 addToRoot, + const wp<Layer>& parent, bool addToRoot, uint32_t* outTransformHint) { if (mNumLayers >= ISurfaceComposer::MAX_LAYERS) { ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers.load(), @@ -3369,7 +3368,7 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBind if (gbc != nullptr) { initialProducer = IInterface::asBinder(gbc); } - setLayerCreatedState(handle, lbc, parentHandle, parentLayer, initialProducer, addToRoot); + setLayerCreatedState(handle, lbc, parent, initialProducer, addToRoot); // Create a transaction includes the initial parent and producer. Vector<ComposerState> states; @@ -4227,7 +4226,7 @@ status_t SurfaceFlinger::mirrorLayer(const sp<Client>& client, const sp<IBinder> } *outLayerId = mirrorLayer->sequence; - return addClientLayer(client, *outHandle, nullptr, mirrorLayer, nullptr, nullptr, false, + return addClientLayer(client, *outHandle, nullptr, mirrorLayer, nullptr, false, nullptr /* outTransformHint */); } @@ -4296,8 +4295,15 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie } bool addToRoot = callingThreadHasUnscopedSurfaceFlingerAccess(); - result = addClientLayer(client, *handle, *gbp, layer, parentHandle, parentLayer, addToRoot, - outTransformHint); + wp<Layer> parent(parentHandle != nullptr ? fromHandle(parentHandle) : parentLayer); + if (parentHandle != nullptr && parent == nullptr) { + ALOGE("Invalid parent handle %p.", parentHandle.get()); + addToRoot = false; + } + if (parentLayer != nullptr) { + addToRoot = false; + } + result = addClientLayer(client, *handle, *gbp, layer, parent, addToRoot, outTransformHint); if (result != NO_ERROR) { return result; } @@ -6777,11 +6783,11 @@ void TransactionState::traverseStatesWithBuffers( } void SurfaceFlinger::setLayerCreatedState(const sp<IBinder>& handle, const wp<Layer>& layer, - const sp<IBinder>& parent, const wp<Layer> parentLayer, - const wp<IBinder>& producer, bool addToRoot) { + const wp<Layer> parent, const wp<IBinder>& producer, + bool addToRoot) { Mutex::Autolock lock(mCreatedLayersLock); mCreatedLayers[handle->localBinder()] = - std::make_unique<LayerCreatedState>(layer, parent, parentLayer, producer, addToRoot); + std::make_unique<LayerCreatedState>(layer, parent, producer, addToRoot); } auto SurfaceFlinger::getLayerCreatedState(const sp<IBinder>& handle) { @@ -6819,19 +6825,14 @@ sp<Layer> SurfaceFlinger::handleLayerCreatedLocked(const sp<IBinder>& handle) { } sp<Layer> parent; - bool allowAddRoot = state->addToRoot; if (state->initialParent != nullptr) { - parent = fromHandle(state->initialParent).promote(); + parent = state->initialParent.promote(); if (parent == nullptr) { - ALOGE("Invalid parent %p", state->initialParent.get()); - allowAddRoot = false; + ALOGE("Invalid parent %p", state->initialParent.unsafe_get()); } - } else if (state->initialParentLayer != nullptr) { - parent = state->initialParentLayer.promote(); - allowAddRoot = false; } - if (parent == nullptr && allowAddRoot) { + if (parent == nullptr && state->addToRoot) { layer->setIsAtRoot(true); mCurrentState.layersSortedByZ.add(layer); } else if (parent == nullptr) { diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 276c7f6bfe..a1e431b54f 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -795,8 +795,8 @@ private: // add a layer to SurfaceFlinger status_t 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 addToRoot, uint32_t* outTransformHint); + const wp<Layer>& parentLayer, bool addToRoot, + uint32_t* outTransformHint); // Traverse through all the layers and compute and cache its bounds. void computeLayerBounds(); @@ -1345,18 +1345,16 @@ private: GUARDED_BY(mStateLock); mutable Mutex mCreatedLayersLock; struct LayerCreatedState { - LayerCreatedState(const wp<Layer>& layer, const sp<IBinder>& parent, - const wp<Layer> parentLayer, const wp<IBinder>& producer, bool addToRoot) + LayerCreatedState(const wp<Layer>& layer, const wp<Layer> parent, + const wp<IBinder>& producer, bool addToRoot) : layer(layer), initialParent(parent), - initialParentLayer(parentLayer), initialProducer(producer), addToRoot(addToRoot) {} wp<Layer> layer; // Indicates the initial parent of the created layer, only used for creating layer in // SurfaceFlinger. If nullptr, it may add the created layer into the current root layers. - sp<IBinder> initialParent; - wp<Layer> initialParentLayer; + wp<Layer> initialParent; // Indicates the initial graphic buffer producer of the created layer, only used for // creating layer in SurfaceFlinger. wp<IBinder> initialProducer; @@ -1370,8 +1368,7 @@ private: // thread. std::unordered_map<BBinder*, std::unique_ptr<LayerCreatedState>> mCreatedLayers; void setLayerCreatedState(const sp<IBinder>& handle, const wp<Layer>& layer, - const sp<IBinder>& parent, const wp<Layer> parentLayer, - const wp<IBinder>& producer, bool addToRoot); + const wp<Layer> parent, const wp<IBinder>& producer, bool addToRoot); auto getLayerCreatedState(const sp<IBinder>& handle); sp<Layer> handleLayerCreatedLocked(const sp<IBinder>& handle) REQUIRES(mStateLock); |