diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/command_encoder_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/command_encoder_vk.cc index 9bc2637745..de7e82b28f 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/command_encoder_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/command_encoder_vk.cc @@ -284,12 +284,14 @@ bool CommandEncoderVK::IsTracking( } std::optional CommandEncoderVK::AllocateDescriptorSet( - const vk::DescriptorSetLayout& layout) { + const vk::DescriptorSetLayout& layout, + size_t command_count) { if (!IsValid()) { return std::nullopt; } - return tracked_objects_->GetDescriptorPool().AllocateDescriptorSet(layout); + return tracked_objects_->GetDescriptorPool().AllocateDescriptorSet( + layout, command_count); } void CommandEncoderVK::PushDebugGroup(const char* label) const { diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/command_encoder_vk.h b/engine/src/flutter/impeller/renderer/backend/vulkan/command_encoder_vk.h index 4b912165e3..5402a6ad3c 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/command_encoder_vk.h +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/command_encoder_vk.h @@ -79,7 +79,8 @@ class CommandEncoderVK { void InsertDebugMarker(const char* label) const; std::optional AllocateDescriptorSet( - const vk::DescriptorSetLayout& layout); + const vk::DescriptorSetLayout& layout, + size_t command_count); private: friend class ContextVK; diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/compute_pass_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/compute_pass_vk.cc index ebd12dedf4..563b084515 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/compute_pass_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/compute_pass_vk.cc @@ -69,10 +69,11 @@ static bool UpdateBindingLayouts(const std::vector& commands, static bool AllocateAndBindDescriptorSets(const ContextVK& context, const ComputeCommand& command, CommandEncoderVK& encoder, - const ComputePipelineVK& pipeline) { + const ComputePipelineVK& pipeline, + size_t command_count) { auto desc_set = pipeline.GetDescriptor().GetDescriptorSetLayouts(); - auto vk_desc_set = - encoder.AllocateDescriptorSet(pipeline.GetDescriptorSetLayout()); + auto vk_desc_set = encoder.AllocateDescriptorSet( + pipeline.GetDescriptorSetLayout(), command_count); if (!vk_desc_set) { return false; } @@ -82,7 +83,6 @@ static bool AllocateAndBindDescriptorSets(const ContextVK& context, std::unordered_map buffers; std::unordered_map images; std::vector writes; - auto bind_images = [&encoder, // &images, // &writes, // @@ -241,10 +241,11 @@ bool ComputePassVK::OnEncodeCommands(const Context& context, cmd_buffer.bindPipeline(vk::PipelineBindPoint::eCompute, pipeline_vk.GetPipeline()); - if (!AllocateAndBindDescriptorSets(vk_context, // - command, // - *encoder, // - pipeline_vk // + if (!AllocateAndBindDescriptorSets(vk_context, // + command, // + *encoder, // + pipeline_vk, // + commands_.size() // )) { return false; } diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/descriptor_pool_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/descriptor_pool_vk.cc index 8c58ddfff1..e94aee75ba 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/descriptor_pool_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/descriptor_pool_vk.cc @@ -23,10 +23,7 @@ static vk::UniqueDescriptorPool CreatePool(const vk::Device& device, std::vector pools = { {vk::DescriptorType::eCombinedImageSampler, pool_count}, {vk::DescriptorType::eUniformBuffer, pool_count}, - {vk::DescriptorType::eStorageBuffer, pool_count}, - {vk::DescriptorType::eSampledImage, pool_count}, - {vk::DescriptorType::eSampler, pool_count}, - }; + {vk::DescriptorType::eStorageBuffer, pool_count}}; vk::DescriptorPoolCreateInfo pool_info; pool_info.setMaxSets(pools.size() * pool_count); @@ -39,6 +36,15 @@ static vk::UniqueDescriptorPool CreatePool(const vk::Device& device, return std::move(pool); } +std::optional DescriptorPoolVK::AllocateDescriptorSet( + const vk::DescriptorSetLayout& layout, + size_t command_count) { + if (pools_.empty()) { + pool_size_ = command_count; + } + return AllocateDescriptorSet(layout); +} + std::optional DescriptorPoolVK::AllocateDescriptorSet( const vk::DescriptorSetLayout& layout) { auto pool = GetDescriptorPool(); diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/descriptor_pool_vk.h b/engine/src/flutter/impeller/renderer/backend/vulkan/descriptor_pool_vk.h index 72b2da3840..24309276fc 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/descriptor_pool_vk.h +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/descriptor_pool_vk.h @@ -33,9 +33,13 @@ class DescriptorPoolVK { ~DescriptorPoolVK(); std::optional AllocateDescriptorSet( - const vk::DescriptorSetLayout& layout); + const vk::DescriptorSetLayout& layout, + size_t command_count); private: + std::optional AllocateDescriptorSet( + const vk::DescriptorSetLayout& layout); + std::weak_ptr device_holder_; uint32_t pool_size_ = 31u; std::queue pools_; diff --git a/engine/src/flutter/impeller/renderer/backend/vulkan/render_pass_vk.cc b/engine/src/flutter/impeller/renderer/backend/vulkan/render_pass_vk.cc index 4107abdd00..c7d84b4afe 100644 --- a/engine/src/flutter/impeller/renderer/backend/vulkan/render_pass_vk.cc +++ b/engine/src/flutter/impeller/renderer/backend/vulkan/render_pass_vk.cc @@ -284,11 +284,12 @@ static bool UpdateBindingLayouts(const std::vector& commands, static bool AllocateAndBindDescriptorSets(const ContextVK& context, const Command& command, CommandEncoderVK& encoder, - const PipelineVK& pipeline) { + const PipelineVK& pipeline, + size_t command_count) { auto desc_set = pipeline.GetDescriptor().GetVertexDescriptor()->GetDescriptorSetLayouts(); - auto vk_desc_set = - encoder.AllocateDescriptorSet(pipeline.GetDescriptorSetLayout()); + auto vk_desc_set = encoder.AllocateDescriptorSet( + pipeline.GetDescriptorSetLayout(), command_count); if (!vk_desc_set) { return false; } @@ -445,7 +446,8 @@ static bool EncodeCommand(const Context& context, const Command& command, CommandEncoderVK& encoder, PassBindingsCache& command_buffer_cache, - const ISize& target_size) { + const ISize& target_size, + size_t command_count) { if (command.vertex_count == 0u || command.instance_count == 0u) { return true; } @@ -465,7 +467,8 @@ static bool EncodeCommand(const Context& context, if (!AllocateAndBindDescriptorSets(ContextVK::Cast(context), // command, // encoder, // - pipeline_vk // + pipeline_vk, // + command_count // )) { return false; } @@ -628,7 +631,7 @@ bool RenderPassVK::OnEncodeCommands(const Context& context) const { } if (!EncodeCommand(context, command, *encoder, pass_bindings_cache_, - target_size)) { + target_size, commands_.size())) { return false; } }