diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc index a9a42ad35a5..d75db4942bb 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk.cc @@ -119,11 +119,9 @@ size_t ContextVK::ChooseThreadCountForWorkers(size_t hardware_concurrency) { } namespace { -thread_local uint64_t tls_context_count = 0; +std::atomic_uint64_t 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; + return context_count.fetch_add(1); } } // namespace diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk_unittests.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk_unittests.cc index 3de93ec63e5..61c0d2bee16 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk_unittests.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/context_vk_unittests.cc @@ -392,5 +392,21 @@ TEST(ContextVKTest, AHBSwapchainCapabilitiesCanBeMissing) { } // namespace impeller +TEST(ContextVKTest, HashIsUniqueAcrossThreads) { + uint64_t hash1, hash2; + std::thread thread1([&]() { + auto context = MockVulkanContextBuilder().Build(); + hash1 = context->GetHash(); + }); + std::thread thread2([&]() { + auto context = MockVulkanContextBuilder().Build(); + hash2 = context->GetHash(); + }); + thread1.join(); + thread2.join(); + + EXPECT_NE(hash1, hash2); +} + } // namespace testing } // namespace impeller