diff options
author | 2017-04-02 13:52:40 +0000 | |
---|---|---|
committer | 2017-04-02 13:52:41 +0000 | |
commit | c3bae03442d8e7e9f46b3cf754d51a738a40f4a9 (patch) | |
tree | 84e82b6234b41557ff14667169ed0083fefcd57a | |
parent | 041e0ad6545eb8bf4a6e3cfba655baaadc4d7bda (diff) | |
parent | bc7552874052ee33f1b35b4474e20c003d216391 (diff) |
Merge "surfaceflinger: Generate unique layer names" into oc-dev
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 30 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger_hwc1.cpp | 30 |
3 files changed, 58 insertions, 4 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 04358dc76b..834c1c4b99 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2840,15 +2840,17 @@ status_t SurfaceFlinger::createLayer( sp<Layer> layer; + String8 uniqueName = getUniqueLayerName(name); + switch (flags & ISurfaceComposerClient::eFXSurfaceMask) { case ISurfaceComposerClient::eFXSurfaceNormal: result = createNormalLayer(client, - name, w, h, flags, format, + uniqueName, w, h, flags, format, handle, gbp, &layer); break; case ISurfaceComposerClient::eFXSurfaceDim: result = createDimLayer(client, - name, w, h, flags, + uniqueName, w, h, flags, handle, gbp, &layer); break; default: @@ -2872,6 +2874,30 @@ status_t SurfaceFlinger::createLayer( return result; } +String8 SurfaceFlinger::getUniqueLayerName(const String8& name) +{ + bool matchFound = true; + uint32_t dupeCounter = 0; + + // Tack on our counter whether there is a hit or not, so everyone gets a tag + String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str()); + + // Loop over layers until we're sure there is no matching name + while (matchFound) { + matchFound = false; + mDrawingState.traverseInZOrder([&](Layer* layer) { + if (layer->getName() == uniqueName) { + matchFound = true; + uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str()); + } + }); + } + + ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str()); + + return uniqueName; +} + status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client, const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format, sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer) diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 581bbfdede..4ecbddd9a2 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -364,6 +364,8 @@ private: uint32_t w, uint32_t h, uint32_t flags, sp<IBinder>* outHandle, sp<IGraphicBufferProducer>* outGbp, sp<Layer>* outLayer); + String8 getUniqueLayerName(const String8& name); + // called in response to the window-manager calling // ISurfaceComposerClient::destroySurface() status_t onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle); diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp index c26847f927..a6c0b9c686 100644 --- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp +++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp @@ -2637,15 +2637,17 @@ status_t SurfaceFlinger::createLayer( sp<Layer> layer; + String8 uniqueName = getUniqueLayerName(name); + switch (flags & ISurfaceComposerClient::eFXSurfaceMask) { case ISurfaceComposerClient::eFXSurfaceNormal: result = createNormalLayer(client, - name, w, h, flags, format, + uniqueName, w, h, flags, format, handle, gbp, &layer); break; case ISurfaceComposerClient::eFXSurfaceDim: result = createDimLayer(client, - name, w, h, flags, + uniqueName, w, h, flags, handle, gbp, &layer); break; default: @@ -2669,6 +2671,30 @@ status_t SurfaceFlinger::createLayer( return result; } +String8 SurfaceFlinger::getUniqueLayerName(const String8& name) +{ + bool matchFound = true; + uint32_t dupeCounter = 0; + + // Tack on our counter whether there is a hit or not, so everyone gets a tag + String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str()); + + // Loop over layers until we're sure there is no matching name + while (matchFound) { + matchFound = false; + mDrawingState.traverseInZOrder([&](Layer* layer) { + if (layer->getName() == uniqueName) { + matchFound = true; + uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str()); + } + }); + } + + ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str()); + + return uniqueName; +} + status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client, const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format, sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer) |