From aec065b800674d48a4bcd996f3c27194ec77a16a Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 25 Apr 2023 11:47:54 -0700 Subject: [PATCH] [Impeller] removed collisions of dead command pools between tests. --- impeller/renderer/backend/vulkan/command_pool_vk.cc | 10 ++++++---- impeller/renderer/backend/vulkan/context_vk.cc | 11 ++++++++++- impeller/renderer/backend/vulkan/context_vk.h | 3 +++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/impeller/renderer/backend/vulkan/command_pool_vk.cc b/impeller/renderer/backend/vulkan/command_pool_vk.cc index 0ccac93548fe4..46d48c31852e3 100644 --- a/impeller/renderer/backend/vulkan/command_pool_vk.cc +++ b/impeller/renderer/backend/vulkan/command_pool_vk.cc @@ -14,9 +14,11 @@ namespace impeller { -using CommandPoolMap = - std::map>; +using CommandPoolMap = std::map>; +// TODO(tbd): This is storing tons of CommandPoolVK's in the test runner since +// many contexts are created on the same thread. We need to come up +// with a different way to clean these up. FML_THREAD_LOCAL fml::ThreadLocalUniquePtr tls_command_pool; static Mutex g_all_pools_mutex; @@ -33,7 +35,7 @@ std::shared_ptr CommandPoolVK::GetThreadLocal( tls_command_pool.reset(new CommandPoolMap()); } CommandPoolMap& pool_map = *tls_command_pool.get(); - auto found = pool_map.find(context); + auto found = pool_map.find(context->GetHash()); if (found != pool_map.end() && found->second->IsValid()) { return found->second; } @@ -41,7 +43,7 @@ std::shared_ptr CommandPoolVK::GetThreadLocal( if (!pool->IsValid()) { return nullptr; } - pool_map[context] = pool; + pool_map[context->GetHash()] = pool; { Lock pool_lock(g_all_pools_mutex); g_all_pools[context].push_back(pool); diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index 157aa76f6370b..d41ccd0a5fa5a 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -95,7 +95,16 @@ std::shared_ptr ContextVK::Create(Settings settings) { return context; } -ContextVK::ContextVK() = default; +namespace { +thread_local uint64_t tls_context_count = 0; +uint64_t CalculateHash(void* ptr) { + // You could make a context once per nanosecond for 584 years on one thread + // before this overflows. + return ++tls_context_count; +} +} // namespace + +ContextVK::ContextVK() : hash_(CalculateHash(this)) {} ContextVK::~ContextVK() { if (device_) { diff --git a/impeller/renderer/backend/vulkan/context_vk.h b/impeller/renderer/backend/vulkan/context_vk.h index 9b95214f83466..cc1376649bbbd 100644 --- a/impeller/renderer/backend/vulkan/context_vk.h +++ b/impeller/renderer/backend/vulkan/context_vk.h @@ -46,6 +46,8 @@ class ContextVK final : public Context, public BackendCast { static std::shared_ptr Create(Settings settings); + uint64_t GetHash() const { return hash_; } + // |Context| ~ContextVK() override; @@ -134,6 +136,7 @@ class ContextVK final : public Context, public BackendCast { std::shared_ptr device_capabilities_; std::shared_ptr fence_waiter_; std::string device_name_; + const uint64_t hash_; bool is_valid_ = false;