33// found in the LICENSE file.
44
55#include " impeller/renderer/backend/vulkan/context_vk.h"
6+ #include < thread>
7+ #include < unordered_map>
68
79#include " fml/concurrent_message_loop.h"
810#include " impeller/renderer/backend/vulkan/command_queue_vk.h"
11+ #include " impeller/renderer/backend/vulkan/descriptor_pool_vk.h"
912#include " impeller/renderer/backend/vulkan/render_pass_builder_vk.h"
1013#include " impeller/renderer/render_target.h"
1114
3033#include " impeller/renderer/backend/vulkan/command_pool_vk.h"
3134#include " impeller/renderer/backend/vulkan/command_queue_vk.h"
3235#include " impeller/renderer/backend/vulkan/debug_report_vk.h"
36+ #include " impeller/renderer/backend/vulkan/descriptor_pool_vk.h"
3337#include " impeller/renderer/backend/vulkan/fence_waiter_vk.h"
3438#include " impeller/renderer/backend/vulkan/gpu_tracer_vk.h"
3539#include " impeller/renderer/backend/vulkan/resource_manager_vk.h"
@@ -497,8 +501,22 @@ std::shared_ptr<CommandBuffer> ContextVK::CreateCommandBuffer() const {
497501 return nullptr ;
498502 }
499503
504+ // look up a cached descriptor pool for the current frame and reuse it
505+ // if it exists, otherwise create a new pool.
506+ DescriptorPoolMap::iterator current_pool =
507+ cached_descriptor_pool_.find (std::this_thread::get_id ());
508+ std::shared_ptr<DescriptorPoolVK> descriptor_pool;
509+ if (current_pool == cached_descriptor_pool_.end ()) {
510+ descriptor_pool =
511+ (cached_descriptor_pool_[std::this_thread::get_id ()] =
512+ std::make_shared<DescriptorPoolVK>(weak_from_this ()));
513+ } else {
514+ descriptor_pool = current_pool->second ;
515+ }
516+
500517 auto tracked_objects = std::make_shared<TrackedObjectsVK>(
501- weak_from_this (), std::move (tls_pool), GetGPUTracer ()->CreateGPUProbe ());
518+ weak_from_this (), std::move (tls_pool), std::move (descriptor_pool),
519+ GetGPUTracer ()->CreateGPUProbe ());
502520 auto queue = GetGraphicsQueue ();
503521
504522 if (!tracked_objects || !tracked_objects->IsValid () || !queue) {
@@ -517,10 +535,9 @@ std::shared_ptr<CommandBuffer> ContextVK::CreateCommandBuffer() const {
517535 tracked_objects->GetCommandBuffer ());
518536
519537 return std::shared_ptr<CommandBufferVK>(new CommandBufferVK (
520- shared_from_this (), //
521- GetDeviceHolder (), //
522- std::move (tracked_objects), //
523- GetFenceWaiter () //
538+ shared_from_this (), //
539+ GetDeviceHolder (), //
540+ std::move (tracked_objects) //
524541 ));
525542}
526543
@@ -651,6 +668,7 @@ void ContextVK::InitializeCommonlyUsedShadersIfNeeded() const {
651668}
652669
653670void ContextVK::DisposeThreadLocalCachedResources () {
671+ cached_descriptor_pool_.erase (std::this_thread::get_id ());
654672 command_pool_recycler_->Dispose ();
655673}
656674
0 commit comments