From f7be0f87476b2664fc04ee13084db22e0324b3f9 Mon Sep 17 00:00:00 2001 From: Simon Fels Date: Tue, 8 Nov 2016 09:47:15 +0100 Subject: [PATCH] Reuse existing window when a layer with the same package already exists --- .../libs/libOpenglRender/LayerManager.cpp | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/external/android-emugl/host/libs/libOpenglRender/LayerManager.cpp b/external/android-emugl/host/libs/libOpenglRender/LayerManager.cpp index 891dbf5..e5e65fb 100644 --- a/external/android-emugl/host/libs/libOpenglRender/LayerManager.cpp +++ b/external/android-emugl/host/libs/libOpenglRender/LayerManager.cpp @@ -19,6 +19,8 @@ #include +#include + namespace { std::string get_package_name(const std::string &name) { return name; @@ -37,6 +39,23 @@ bool is_layer_blacklisted(const std::string &name) { }; return std::find(blacklist.begin(), blacklist.end(), name) != blacklist.end(); } + +struct ActivityInfo { + ActivityInfo(const std::string &name) : + name(name) { + std::vector parts; + boost::split(parts, name, boost::is_any_of("/")); + if (parts.size() > 1) + package = parts[0]; + } + + std::string package; + std::string name; +}; + +bool from_same_package(const std::string &a, const std::string &b) { + return ActivityInfo(a).package == ActivityInfo(b).package; +} } std::shared_ptr LayerManager::get() { @@ -57,11 +76,11 @@ void LayerManager::post_layer(const LayerInfo &layer) { } FrameBufferWindow *window = nullptr; - auto l = layers_.find(layer.name); - if (l != layers_.end()) { - printf("Using existing layer '%s'\n", layer.name.c_str()); - window = l->second.window; - l->second.updated = true; + for (auto &l : layers_) { + if (l.first == layer.name || from_same_package(l.first, layer.name)) { + window = l.second.window; + l.second.updated = true; + } } else { printf("New layer '%s' {%d,%d,%d,%d}\n", layer.name.c_str());