From 536007a420c472e0d9c7481d42b1cb021817c0dd Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 17 Oct 2024 16:39:37 -0700 Subject: [PATCH 1/6] [Impeller] one descriptor pool per frame. --- .../backend/vulkan/command_buffer_vk.cc | 6 ++--- .../backend/vulkan/command_buffer_vk.h | 4 +-- .../renderer/backend/vulkan/context_vk.cc | 26 ++++++++++++++----- .../backend/vulkan/surface_context_vk.cc | 2 +- .../backend/vulkan/tracked_objects_vk.cc | 5 ++-- .../backend/vulkan/tracked_objects_vk.h | 3 ++- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/impeller/renderer/backend/vulkan/command_buffer_vk.cc b/impeller/renderer/backend/vulkan/command_buffer_vk.cc index abe4971298c28..3d432f3576ee3 100644 --- a/impeller/renderer/backend/vulkan/command_buffer_vk.cc +++ b/impeller/renderer/backend/vulkan/command_buffer_vk.cc @@ -22,12 +22,10 @@ namespace impeller { CommandBufferVK::CommandBufferVK( std::weak_ptr context, std::weak_ptr device_holder, - std::shared_ptr tracked_objects, - std::shared_ptr fence_waiter) + std::shared_ptr tracked_objects) : CommandBuffer(std::move(context)), device_holder_(std::move(device_holder)), - tracked_objects_(std::move(tracked_objects)), - fence_waiter_(std::move(fence_waiter)) {} + tracked_objects_(std::move(tracked_objects)) {} CommandBufferVK::~CommandBufferVK() = default; diff --git a/impeller/renderer/backend/vulkan/command_buffer_vk.h b/impeller/renderer/backend/vulkan/command_buffer_vk.h index 6a78787f1dce5..aee53db409a58 100644 --- a/impeller/renderer/backend/vulkan/command_buffer_vk.h +++ b/impeller/renderer/backend/vulkan/command_buffer_vk.h @@ -87,12 +87,10 @@ class CommandBufferVK final std::weak_ptr device_holder_; std::shared_ptr tracked_objects_; - std::shared_ptr fence_waiter_; CommandBufferVK(std::weak_ptr context, std::weak_ptr device_holder, - std::shared_ptr tracked_objects, - std::shared_ptr fence_waiter); + std::shared_ptr tracked_objects); // |CommandBuffer| void SetLabel(std::string_view label) const override; diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index 222646983fb6f..46e582a49b7b1 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -6,6 +6,7 @@ #include "fml/concurrent_message_loop.h" #include "impeller/renderer/backend/vulkan/command_queue_vk.h" +#include "impeller/renderer/backend/vulkan/descriptor_pool_vk.h" #include "impeller/renderer/backend/vulkan/render_pass_builder_vk.h" #include "impeller/renderer/render_target.h" @@ -489,15 +490,28 @@ std::shared_ptr ContextVK::GetPipelineLibrary() const { return pipeline_library_; } +// DescriptorPool Lifecycle: +// 1. End of frame will reset the descriptor pool (clearing this on a thread). +// There will still be references to the descriptor pool from the uncompleted +// command buffers. +// 2. The last reference to the descriptor pool will be released from the fence +// waiter thread, which will schedule a task on the resource +// manager thread, which in turn will reset the command pool and make it +// available for reuse ("recycle"). +static thread_local std::shared_ptr tls_descriptor_pool; + std::shared_ptr ContextVK::CreateCommandBuffer() const { const auto& recycler = GetCommandPoolRecycler(); auto tls_pool = recycler->Get(); if (!tls_pool) { return nullptr; } - + if (!tls_descriptor_pool) { + tls_descriptor_pool = std::make_shared(weak_from_this()); + } auto tracked_objects = std::make_shared( - weak_from_this(), std::move(tls_pool), GetGPUTracer()->CreateGPUProbe()); + weak_from_this(), std::move(tls_pool), tls_descriptor_pool, + GetGPUTracer()->CreateGPUProbe()); auto queue = GetGraphicsQueue(); if (!tracked_objects || !tracked_objects->IsValid() || !queue) { @@ -516,10 +530,9 @@ std::shared_ptr ContextVK::CreateCommandBuffer() const { tracked_objects->GetCommandBuffer()); return std::shared_ptr(new CommandBufferVK( - shared_from_this(), // - GetDeviceHolder(), // - std::move(tracked_objects), // - GetFenceWaiter() // + shared_from_this(), // + GetDeviceHolder(), // + std::move(tracked_objects) // )); } @@ -631,6 +644,7 @@ void ContextVK::InitializeCommonlyUsedShadersIfNeeded() const { void ContextVK::DisposeThreadLocalCachedResources() { command_pool_recycler_->Dispose(); + tls_descriptor_pool.reset(); } const std::shared_ptr& diff --git a/impeller/renderer/backend/vulkan/surface_context_vk.cc b/impeller/renderer/backend/vulkan/surface_context_vk.cc index 912c74b03c056..b5ddd61a04e01 100644 --- a/impeller/renderer/backend/vulkan/surface_context_vk.cc +++ b/impeller/renderer/backend/vulkan/surface_context_vk.cc @@ -86,7 +86,7 @@ std::unique_ptr SurfaceContextVK::AcquireNextSurface() { impeller::PipelineLibraryVK::Cast(*pipeline_library) .DidAcquireSurfaceFrame(); } - parent_->GetCommandPoolRecycler()->Dispose(); + DisposeThreadLocalCachedResources(); parent_->GetResourceAllocator()->DebugTraceMemoryStatistics(); return surface; } diff --git a/impeller/renderer/backend/vulkan/tracked_objects_vk.cc b/impeller/renderer/backend/vulkan/tracked_objects_vk.cc index 47b8477309dcb..4bbaf94319d8c 100644 --- a/impeller/renderer/backend/vulkan/tracked_objects_vk.cc +++ b/impeller/renderer/backend/vulkan/tracked_objects_vk.cc @@ -11,8 +11,9 @@ namespace impeller { TrackedObjectsVK::TrackedObjectsVK( const std::weak_ptr& context, const std::shared_ptr& pool, + std::shared_ptr descriptor_pool, std::unique_ptr probe) - : desc_pool_(context), probe_(std::move(probe)) { + : desc_pool_(std::move(descriptor_pool)), probe_(std::move(probe)) { if (!pool) { return; } @@ -78,7 +79,7 @@ vk::CommandBuffer TrackedObjectsVK::GetCommandBuffer() const { } DescriptorPoolVK& TrackedObjectsVK::GetDescriptorPool() { - return desc_pool_; + return *desc_pool_; } GPUProbe& TrackedObjectsVK::GetGPUProbe() const { diff --git a/impeller/renderer/backend/vulkan/tracked_objects_vk.h b/impeller/renderer/backend/vulkan/tracked_objects_vk.h index b502eac1a2b20..8305f51160380 100644 --- a/impeller/renderer/backend/vulkan/tracked_objects_vk.h +++ b/impeller/renderer/backend/vulkan/tracked_objects_vk.h @@ -20,6 +20,7 @@ class TrackedObjectsVK { public: explicit TrackedObjectsVK(const std::weak_ptr& context, const std::shared_ptr& pool, + std::shared_ptr descriptor_pool, std::unique_ptr probe); ~TrackedObjectsVK(); @@ -43,7 +44,7 @@ class TrackedObjectsVK { GPUProbe& GetGPUProbe() const; private: - DescriptorPoolVK desc_pool_; + std::shared_ptr desc_pool_; // `shared_ptr` since command buffers have a link to the command pool. std::shared_ptr pool_; vk::UniqueCommandBuffer buffer_; From 6ab44605f94dea34eed5b44fb1debdad46b70fac Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 17 Oct 2024 17:02:17 -0700 Subject: [PATCH 2/6] add unit test. --- .../backend/vulkan/command_buffer_vk.cc | 4 ++++ .../backend/vulkan/command_buffer_vk.h | 4 ++++ .../vulkan/descriptor_pool_vk_unittests.cc | 23 +++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/impeller/renderer/backend/vulkan/command_buffer_vk.cc b/impeller/renderer/backend/vulkan/command_buffer_vk.cc index 3d432f3576ee3..e8341a352c8f9 100644 --- a/impeller/renderer/backend/vulkan/command_buffer_vk.cc +++ b/impeller/renderer/backend/vulkan/command_buffer_vk.cc @@ -210,4 +210,8 @@ void CommandBufferVK::InsertDebugMarker(std::string_view label) const { } } +DescriptorPoolVK& CommandBufferVK::GetDescriptorPool() const { + return tracked_objects_->GetDescriptorPool(); +} + } // namespace impeller diff --git a/impeller/renderer/backend/vulkan/command_buffer_vk.h b/impeller/renderer/backend/vulkan/command_buffer_vk.h index aee53db409a58..ef9dba2494975 100644 --- a/impeller/renderer/backend/vulkan/command_buffer_vk.h +++ b/impeller/renderer/backend/vulkan/command_buffer_vk.h @@ -8,6 +8,7 @@ #include "fml/status_or.h" #include "impeller/base/backend_cast.h" #include "impeller/renderer/backend/vulkan/command_queue_vk.h" +#include "impeller/renderer/backend/vulkan/descriptor_pool_vk.h" #include "impeller/renderer/backend/vulkan/device_holder_vk.h" #include "impeller/renderer/backend/vulkan/texture_source_vk.h" #include "impeller/renderer/backend/vulkan/tracked_objects_vk.h" @@ -81,6 +82,9 @@ class CommandBufferVK final // Visible for testing. bool IsTracking(const std::shared_ptr& texture) const; + // Visible for testing. + DescriptorPoolVK& GetDescriptorPool() const; + private: friend class ContextVK; friend class CommandQueueVK; diff --git a/impeller/renderer/backend/vulkan/descriptor_pool_vk_unittests.cc b/impeller/renderer/backend/vulkan/descriptor_pool_vk_unittests.cc index 2deb9b3453642..fea47418dcdac 100644 --- a/impeller/renderer/backend/vulkan/descriptor_pool_vk_unittests.cc +++ b/impeller/renderer/backend/vulkan/descriptor_pool_vk_unittests.cc @@ -5,6 +5,7 @@ #include "flutter/testing/testing.h" // IWYU pragma: keep. #include "fml/closure.h" #include "fml/synchronization/waitable_event.h" +#include "impeller/renderer/backend/vulkan/command_buffer_vk.h" #include "impeller/renderer/backend/vulkan/descriptor_pool_vk.h" #include "impeller/renderer/backend/vulkan/resource_manager_vk.h" #include "impeller/renderer/backend/vulkan/test/mock_vulkan.h" @@ -123,5 +124,27 @@ TEST(DescriptorPoolRecyclerVKTest, ReclaimDropsDescriptorPoolIfSizeIsExceeded) { context->Shutdown(); } +TEST(DescriptorPoolRecyclerVKTest, MultipleCommandBuffersShareDescriptorPool) { + auto const context = MockVulkanContextBuilder().Build(); + + auto cmd_buffer_1 = context->CreateCommandBuffer(); + auto cmd_buffer_2 = context->CreateCommandBuffer(); + + CommandBufferVK& vk_1 = CommandBufferVK::Cast(*cmd_buffer_1); + CommandBufferVK& vk_2 = CommandBufferVK::Cast(*cmd_buffer_2); + + EXPECT_EQ(&vk_1.GetDescriptorPool(), &vk_2.GetDescriptorPool()); + + // Resetting resources creates a new pool. + context->DisposeThreadLocalCachedResources(); + + auto cmd_buffer_3 = context->CreateCommandBuffer(); + CommandBufferVK& vk_3 = CommandBufferVK::Cast(*cmd_buffer_3); + + EXPECT_NE(&vk_1.GetDescriptorPool(), &vk_3.GetDescriptorPool()); + + context->Shutdown(); +} + } // namespace testing } // namespace impeller From 8432312dc17b189653d83677bbd97a0ae2bad9c7 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 17 Oct 2024 17:03:32 -0700 Subject: [PATCH 3/6] fix comment. --- impeller/renderer/backend/vulkan/context_vk.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index 46e582a49b7b1..8bb17e9d10ad5 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -490,13 +490,13 @@ std::shared_ptr ContextVK::GetPipelineLibrary() const { return pipeline_library_; } -// DescriptorPool Lifecycle: +// DescriptorPool Lifecycle (Same as CommandPool lifecycle) // 1. End of frame will reset the descriptor pool (clearing this on a thread). // There will still be references to the descriptor pool from the uncompleted // command buffers. // 2. The last reference to the descriptor pool will be released from the fence // waiter thread, which will schedule a task on the resource -// manager thread, which in turn will reset the command pool and make it +// manager thread, which in turn will reset the descriptor pool and make it // available for reuse ("recycle"). static thread_local std::shared_ptr tls_descriptor_pool; From d973b2c1f8c9a1cf512b86e152fa261c051643b7 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 17 Oct 2024 18:22:27 -0700 Subject: [PATCH 4/6] hook into existing TLS storage. --- .../backend/vulkan/command_pool_vk.cc | 87 ++++++++++++++----- .../renderer/backend/vulkan/command_pool_vk.h | 20 +++++ .../renderer/backend/vulkan/context_vk.cc | 19 ++-- impeller/renderer/backend/vulkan/context_vk.h | 2 - .../vulkan/test/mock_vulkan_unittests.cc | 1 + .../backend/vulkan/tracked_objects_vk.cc | 1 + .../backend/vulkan/tracked_objects_vk.h | 2 + 7 files changed, 93 insertions(+), 39 deletions(-) diff --git a/impeller/renderer/backend/vulkan/command_pool_vk.cc b/impeller/renderer/backend/vulkan/command_pool_vk.cc index 9bb3d9d898621..c49dcfadd1e9c 100644 --- a/impeller/renderer/backend/vulkan/command_pool_vk.cc +++ b/impeller/renderer/backend/vulkan/command_pool_vk.cc @@ -9,6 +9,7 @@ #include #include "impeller/renderer/backend/vulkan/context_vk.h" +#include "impeller/renderer/backend/vulkan/descriptor_pool_vk.h" #include "impeller/renderer/backend/vulkan/resource_manager_vk.h" #include "impeller/renderer/backend/vulkan/vk.h" // IWYU pragma: keep. @@ -155,10 +156,6 @@ void CommandPoolVK::Destroy() { collected_buffers_.clear(); } -// Associates a resource with a thread and context. -using CommandPoolMap = - std::unordered_map>; - // CommandPoolVK Lifecycle: // 1. End of frame will reset the command pool (clearing this on a thread). // There will still be references to the command pool from the uncompleted @@ -169,17 +166,47 @@ using CommandPoolMap = // available for reuse ("recycle"). static thread_local std::unique_ptr tls_command_pool_map; +struct WeakThreadLocalData { + std::weak_ptr command_pool; + std::weak_ptr descriptor_pool; +}; + // Map each context to a list of all thread-local command pools associated // with that context. static Mutex g_all_pools_map_mutex; -static std::unordered_map< - const ContextVK*, - std::vector>> g_all_pools_map +static std::unordered_map> g_all_pools_map IPLR_GUARDED_BY(g_all_pools_map_mutex); +std::shared_ptr CommandPoolRecyclerVK::GetDescriptorPool() { + const auto& strong_context = context_.lock(); + if (!strong_context) { + return nullptr; + } + + // If there is a resource in used for this thread and context, return it. + if (!tls_command_pool_map.get()) { + tls_command_pool_map.reset(new CommandPoolMap()); + } + CommandPoolMap& pool_map = *tls_command_pool_map.get(); + auto const hash = strong_context->GetHash(); + auto const it = pool_map.find(hash); + if (it != pool_map.end()) { + return it->second.descriptor_pool; + } + + const auto& result = + InitializeThreadLocalResources(strong_context, pool_map, hash); + if (result.has_value()) { + return result->descriptor_pool; + } + + return nullptr; +} + // TODO(matanlurey): Return a status_or<> instead of nullptr when we have one. std::shared_ptr CommandPoolRecyclerVK::Get() { - auto const strong_context = context_.lock(); + const auto& strong_context = context_.lock(); if (!strong_context) { return nullptr; } @@ -192,25 +219,40 @@ std::shared_ptr CommandPoolRecyclerVK::Get() { auto const hash = strong_context->GetHash(); auto const it = pool_map.find(hash); if (it != pool_map.end()) { - return it->second; + return it->second.command_pool; } - // Otherwise, create a new resource and return it. + const auto& result = + InitializeThreadLocalResources(strong_context, pool_map, hash); + if (result.has_value()) { + return result->command_pool; + } + + return nullptr; +} + +std::optional +CommandPoolRecyclerVK::InitializeThreadLocalResources( + const std::shared_ptr& context, + CommandPoolMap& pool_map, + uint64_t pool_key) { auto data = Create(); if (!data || !data->pool) { - return nullptr; + return std::nullopt; } - auto const resource = std::make_shared( + auto command_pool = std::make_shared( std::move(data->pool), std::move(data->buffers), context_); - pool_map.emplace(hash, resource); - + auto descriptor_pool = std::make_shared(context_); { Lock all_pools_lock(g_all_pools_map_mutex); - g_all_pools_map[strong_context.get()].push_back(resource); + g_all_pools_map[context.get()].push_back(WeakThreadLocalData{ + .command_pool = command_pool, .descriptor_pool = descriptor_pool}); } - return resource; + return pool_map[pool_key] = + ThreadLocalData{.command_pool = std::move(command_pool), + .descriptor_pool = std::move(descriptor_pool)}; } // TODO(matanlurey): Return a status_or<> instead of nullopt when we have one. @@ -293,14 +335,13 @@ void CommandPoolRecyclerVK::DestroyThreadLocalPools(const ContextVK* context) { Lock all_pools_lock(g_all_pools_map_mutex); auto found = g_all_pools_map.find(context); if (found != g_all_pools_map.end()) { - for (auto& weak_pool : found->second) { - auto pool = weak_pool.lock(); - if (!pool) { - continue; + for (auto& [command_pool, desc_pool] : found->second) { + const auto& strong_pool = command_pool.lock(); + if (strong_pool) { + // Delete all objects held by this pool. The destroyed pool will still + // remain in its thread's TLS map until that thread exits. + strong_pool->Destroy(); } - // Delete all objects held by this pool. The destroyed pool will still - // remain in its thread's TLS map until that thread exits. - pool->Destroy(); } g_all_pools_map.erase(found); } diff --git a/impeller/renderer/backend/vulkan/command_pool_vk.h b/impeller/renderer/backend/vulkan/command_pool_vk.h index dd60026b44f70..662d03422416f 100644 --- a/impeller/renderer/backend/vulkan/command_pool_vk.h +++ b/impeller/renderer/backend/vulkan/command_pool_vk.h @@ -10,6 +10,7 @@ #include #include "impeller/base/thread.h" +#include "impeller/renderer/backend/vulkan/descriptor_pool_vk.h" #include "impeller/renderer/backend/vulkan/vk.h" // IWYU pragma: keep. #include "vulkan/vulkan_handles.hpp" @@ -76,6 +77,15 @@ class CommandPoolVK final { pool_mutex_); }; +struct ThreadLocalData { + std::shared_ptr command_pool; + std::shared_ptr descriptor_pool; +}; + +// Associates a resource with a thread and context. +using CommandPoolMap = + std::unordered_map; + //------------------------------------------------------------------------------ /// @brief Creates and manages the lifecycle of |vk::CommandPool| objects. /// @@ -128,6 +138,11 @@ class CommandPoolRecyclerVK final /// @warning Returns a |nullptr| if a pool could not be created. std::shared_ptr Get(); + /// @brief Gets a descriptor pool for the current thread. + /// + /// @warning Returns a |nullptr| if a pool could not be created. + std::shared_ptr GetDescriptorPool(); + /// @brief Returns a command pool to be reset on a background thread. /// /// @param[in] pool The pool to recycler. @@ -153,6 +168,11 @@ class CommandPoolRecyclerVK final /// @returns Returns a |std::nullopt| if a pool was not available. std::optional Reuse(); + /// Create a DescriptorPoolVK and a CommandPoolVK and stash them in the TLS + /// map. + std::optional InitializeThreadLocalResources( + const std::shared_ptr& context, CommandPoolMap& pool_map, uint64_t pool_key); + CommandPoolRecyclerVK(const CommandPoolRecyclerVK&) = delete; CommandPoolRecyclerVK& operator=(const CommandPoolRecyclerVK&) = delete; diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index 8bb17e9d10ad5..9ce57fa19af36 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -490,27 +490,19 @@ std::shared_ptr ContextVK::GetPipelineLibrary() const { return pipeline_library_; } -// DescriptorPool Lifecycle (Same as CommandPool lifecycle) -// 1. End of frame will reset the descriptor pool (clearing this on a thread). -// There will still be references to the descriptor pool from the uncompleted -// command buffers. -// 2. The last reference to the descriptor pool will be released from the fence -// waiter thread, which will schedule a task on the resource -// manager thread, which in turn will reset the descriptor pool and make it -// available for reuse ("recycle"). -static thread_local std::shared_ptr tls_descriptor_pool; - std::shared_ptr ContextVK::CreateCommandBuffer() const { const auto& recycler = GetCommandPoolRecycler(); auto tls_pool = recycler->Get(); if (!tls_pool) { return nullptr; } - if (!tls_descriptor_pool) { - tls_descriptor_pool = std::make_shared(weak_from_this()); + auto tls_desc_pool = recycler->GetDescriptorPool(); + if (!tls_desc_pool) { + return nullptr; } + auto tracked_objects = std::make_shared( - weak_from_this(), std::move(tls_pool), tls_descriptor_pool, + weak_from_this(), std::move(tls_pool), tls_desc_pool, GetGPUTracer()->CreateGPUProbe()); auto queue = GetGraphicsQueue(); @@ -644,7 +636,6 @@ void ContextVK::InitializeCommonlyUsedShadersIfNeeded() const { void ContextVK::DisposeThreadLocalCachedResources() { command_pool_recycler_->Dispose(); - tls_descriptor_pool.reset(); } const std::shared_ptr& diff --git a/impeller/renderer/backend/vulkan/context_vk.h b/impeller/renderer/backend/vulkan/context_vk.h index fe7f4da002f91..5e7f134fab10a 100644 --- a/impeller/renderer/backend/vulkan/context_vk.h +++ b/impeller/renderer/backend/vulkan/context_vk.h @@ -10,10 +10,8 @@ #include "flutter/fml/concurrent_message_loop.h" #include "flutter/fml/mapping.h" #include "flutter/fml/unique_fd.h" -#include "fml/thread.h" #include "impeller/base/backend_cast.h" #include "impeller/core/formats.h" -#include "impeller/renderer/backend/vulkan/command_pool_vk.h" #include "impeller/renderer/backend/vulkan/device_holder_vk.h" #include "impeller/renderer/backend/vulkan/driver_info_vk.h" #include "impeller/renderer/backend/vulkan/pipeline_library_vk.h" diff --git a/impeller/renderer/backend/vulkan/test/mock_vulkan_unittests.cc b/impeller/renderer/backend/vulkan/test/mock_vulkan_unittests.cc index 2555994a8fd03..092e7c7da7e8f 100644 --- a/impeller/renderer/backend/vulkan/test/mock_vulkan_unittests.cc +++ b/impeller/renderer/backend/vulkan/test/mock_vulkan_unittests.cc @@ -5,6 +5,7 @@ #include "flutter/testing/testing.h" // IWYU pragma: keep #include "gtest/gtest.h" #include "impeller/renderer/backend/vulkan/test/mock_vulkan.h" +#include "impeller/renderer/backend/vulkan/command_pool_vk.h" #include "vulkan/vulkan_enums.hpp" namespace impeller { diff --git a/impeller/renderer/backend/vulkan/tracked_objects_vk.cc b/impeller/renderer/backend/vulkan/tracked_objects_vk.cc index 4bbaf94319d8c..249d2483b01b9 100644 --- a/impeller/renderer/backend/vulkan/tracked_objects_vk.cc +++ b/impeller/renderer/backend/vulkan/tracked_objects_vk.cc @@ -4,6 +4,7 @@ #include "impeller/renderer/backend/vulkan/tracked_objects_vk.h" +#include "impeller/renderer/backend/vulkan/command_pool_vk.h" #include "impeller/renderer/backend/vulkan/gpu_tracer_vk.h" namespace impeller { diff --git a/impeller/renderer/backend/vulkan/tracked_objects_vk.h b/impeller/renderer/backend/vulkan/tracked_objects_vk.h index 8305f51160380..4ac72bc886e43 100644 --- a/impeller/renderer/backend/vulkan/tracked_objects_vk.h +++ b/impeller/renderer/backend/vulkan/tracked_objects_vk.h @@ -14,6 +14,8 @@ namespace impeller { +class CommandPoolVK; + /// @brief A per-frame object used to track resource lifetimes and allocate /// command buffers and descriptor sets. class TrackedObjectsVK { From 0ae06a820834aa1722b4ee3b12e28368cd2c7e16 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 17 Oct 2024 18:22:49 -0700 Subject: [PATCH 5/6] ++ --- impeller/renderer/backend/vulkan/surface_context_vk.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impeller/renderer/backend/vulkan/surface_context_vk.cc b/impeller/renderer/backend/vulkan/surface_context_vk.cc index b5ddd61a04e01..912c74b03c056 100644 --- a/impeller/renderer/backend/vulkan/surface_context_vk.cc +++ b/impeller/renderer/backend/vulkan/surface_context_vk.cc @@ -86,7 +86,7 @@ std::unique_ptr SurfaceContextVK::AcquireNextSurface() { impeller::PipelineLibraryVK::Cast(*pipeline_library) .DidAcquireSurfaceFrame(); } - DisposeThreadLocalCachedResources(); + parent_->GetCommandPoolRecycler()->Dispose(); parent_->GetResourceAllocator()->DebugTraceMemoryStatistics(); return surface; } From a7398b93d0a263a56a23da5761eb037f570d2134 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 17 Oct 2024 18:24:55 -0700 Subject: [PATCH 6/6] ++ --- impeller/renderer/backend/vulkan/command_pool_vk.h | 7 ++++--- .../renderer/backend/vulkan/test/mock_vulkan_unittests.cc | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/impeller/renderer/backend/vulkan/command_pool_vk.h b/impeller/renderer/backend/vulkan/command_pool_vk.h index 662d03422416f..55fec9b35137c 100644 --- a/impeller/renderer/backend/vulkan/command_pool_vk.h +++ b/impeller/renderer/backend/vulkan/command_pool_vk.h @@ -83,8 +83,7 @@ struct ThreadLocalData { }; // Associates a resource with a thread and context. -using CommandPoolMap = - std::unordered_map; +using CommandPoolMap = std::unordered_map; //------------------------------------------------------------------------------ /// @brief Creates and manages the lifecycle of |vk::CommandPool| objects. @@ -171,7 +170,9 @@ class CommandPoolRecyclerVK final /// Create a DescriptorPoolVK and a CommandPoolVK and stash them in the TLS /// map. std::optional InitializeThreadLocalResources( - const std::shared_ptr& context, CommandPoolMap& pool_map, uint64_t pool_key); + const std::shared_ptr& context, + CommandPoolMap& pool_map, + uint64_t pool_key); CommandPoolRecyclerVK(const CommandPoolRecyclerVK&) = delete; diff --git a/impeller/renderer/backend/vulkan/test/mock_vulkan_unittests.cc b/impeller/renderer/backend/vulkan/test/mock_vulkan_unittests.cc index 092e7c7da7e8f..1688b12e49c46 100644 --- a/impeller/renderer/backend/vulkan/test/mock_vulkan_unittests.cc +++ b/impeller/renderer/backend/vulkan/test/mock_vulkan_unittests.cc @@ -4,8 +4,8 @@ #include "flutter/testing/testing.h" // IWYU pragma: keep #include "gtest/gtest.h" -#include "impeller/renderer/backend/vulkan/test/mock_vulkan.h" #include "impeller/renderer/backend/vulkan/command_pool_vk.h" +#include "impeller/renderer/backend/vulkan/test/mock_vulkan.h" #include "vulkan/vulkan_enums.hpp" namespace impeller {