From bc7552874052ee33f1b35b4474e20c003d216391 Mon Sep 17 00:00:00 2001 From: Cody Northrop Date: Fri, 31 Mar 2017 12:00:08 -0600 Subject: surfaceflinger: Generate unique layer names Add a counter to layer names to make it clear when there are duplicates. layer foo#0 layer foo#1 layer bar#0 layer bar#1 layer bar#2 Bug: b/32543755 Test: Build, install, run game with duplicate layers, see unique names. Change-Id: I915531d7adbdc506c429b86a685665fb6c56d25e --- services/surfaceflinger/SurfaceFlinger.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'services/surfaceflinger/SurfaceFlinger.cpp') diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index f82b363cb5..0f6b39713e 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2839,15 +2839,17 @@ status_t SurfaceFlinger::createLayer( sp 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: @@ -2871,6 +2873,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, const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format, sp* handle, sp* gbp, sp* outLayer) -- cgit v1.2.3-59-g8ed1b