From 5c8a885da7b418af6647ddffc4f961c139489761 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 23 Aug 2023 12:53:10 -0700 Subject: [PATCH 1/2] [Impeller] combine uniform and buffer slots. --- .../backend/gles/buffer_bindings_gles.cc | 4 ++-- .../renderer/backend/metal/compute_pass_mtl.mm | 2 +- .../renderer/backend/metal/render_pass_mtl.mm | 2 +- .../renderer/backend/vulkan/compute_pass_vk.cc | 10 +++++----- .../renderer/backend/vulkan/render_pass_vk.cc | 10 +++++----- impeller/renderer/command.cc | 16 ++++++++-------- impeller/renderer/command.h | 9 +++++++-- impeller/renderer/compute_command.cc | 3 +-- 8 files changed, 30 insertions(+), 26 deletions(-) diff --git a/impeller/renderer/backend/gles/buffer_bindings_gles.cc b/impeller/renderer/backend/gles/buffer_bindings_gles.cc index b373271cbd69a..e0db2a551cc35 100644 --- a/impeller/renderer/backend/gles/buffer_bindings_gles.cc +++ b/impeller/renderer/backend/gles/buffer_bindings_gles.cc @@ -145,12 +145,12 @@ bool BufferBindingsGLES::BindUniformData( const Bindings& vertex_bindings, const Bindings& fragment_bindings) const { for (const auto& buffer : vertex_bindings.buffers) { - if (!BindUniformBuffer(gl, transients_allocator, buffer.second)) { + if (!BindUniformBuffer(gl, transients_allocator, buffer.second.view)) { return false; } } for (const auto& buffer : fragment_bindings.buffers) { - if (!BindUniformBuffer(gl, transients_allocator, buffer.second)) { + if (!BindUniformBuffer(gl, transients_allocator, buffer.second.view)) { return false; } } diff --git a/impeller/renderer/backend/metal/compute_pass_mtl.mm b/impeller/renderer/backend/metal/compute_pass_mtl.mm index 68cd3f47b4082..e22821485d97d 100644 --- a/impeller/renderer/backend/metal/compute_pass_mtl.mm +++ b/impeller/renderer/backend/metal/compute_pass_mtl.mm @@ -225,7 +225,7 @@ static bool Bind(ComputePassBindingsCache& pass, for (const auto& buffer : command.bindings.buffers) { if (!Bind(pass_bindings, *allocator, buffer.first, - buffer.second.resource)) { + buffer.second.view.resource)) { return false; } } diff --git a/impeller/renderer/backend/metal/render_pass_mtl.mm b/impeller/renderer/backend/metal/render_pass_mtl.mm index 6be8298e3385c..236941977fcf4 100644 --- a/impeller/renderer/backend/metal/render_pass_mtl.mm +++ b/impeller/renderer/backend/metal/render_pass_mtl.mm @@ -409,7 +409,7 @@ static bool Bind(PassBindingsCache& pass, ShaderStage stage) -> bool { for (const auto& buffer : bindings.buffers) { if (!Bind(pass_bindings, *allocator, stage, buffer.first, - buffer.second.resource)) { + buffer.second.view.resource)) { return false; } } diff --git a/impeller/renderer/backend/vulkan/compute_pass_vk.cc b/impeller/renderer/backend/vulkan/compute_pass_vk.cc index d750e0d0ecb4f..2899fee6c005a 100644 --- a/impeller/renderer/backend/vulkan/compute_pass_vk.cc +++ b/impeller/renderer/backend/vulkan/compute_pass_vk.cc @@ -125,8 +125,8 @@ static bool AllocateAndBindDescriptorSets(const ContextVK& context, &desc_set, // &vk_desc_set // ](const Bindings& bindings) -> bool { - for (const auto& [buffer_index, view] : bindings.buffers) { - const auto& buffer_view = view.resource.buffer; + for (const auto& [buffer_index, data] : bindings.buffers) { + const auto& buffer_view = data.view.resource.buffer; auto device_buffer = buffer_view->GetDeviceBuffer(allocator); if (!device_buffer) { @@ -143,14 +143,14 @@ static bool AllocateAndBindDescriptorSets(const ContextVK& context, return false; } - uint32_t offset = view.resource.range.offset; + uint32_t offset = data.view.resource.range.offset; vk::DescriptorBufferInfo buffer_info; buffer_info.buffer = buffer; buffer_info.offset = offset; - buffer_info.range = view.resource.range.length; + buffer_info.range = data.view.resource.range.length; - const ShaderUniformSlot& uniform = bindings.uniforms.at(buffer_index); + const ShaderUniformSlot& uniform = data.slot; auto layout_it = std::find_if(desc_set.begin(), desc_set.end(), [&uniform](DescriptorSetLayout& layout) { return layout.binding == uniform.binding; diff --git a/impeller/renderer/backend/vulkan/render_pass_vk.cc b/impeller/renderer/backend/vulkan/render_pass_vk.cc index a981c75658853..0a9f020ef6e59 100644 --- a/impeller/renderer/backend/vulkan/render_pass_vk.cc +++ b/impeller/renderer/backend/vulkan/render_pass_vk.cc @@ -368,8 +368,8 @@ static bool AllocateAndBindDescriptorSets(const ContextVK& context, &desc_set, // &vk_desc_set // ](const Bindings& bindings) -> bool { - for (const auto& [buffer_index, view] : bindings.buffers) { - const auto& buffer_view = view.resource.buffer; + for (const auto& [buffer_index, data] : bindings.buffers) { + const auto& buffer_view = data.view.resource.buffer; auto device_buffer = buffer_view->GetDeviceBuffer(allocator); if (!device_buffer) { @@ -391,14 +391,14 @@ static bool AllocateAndBindDescriptorSets(const ContextVK& context, return false; } - uint32_t offset = view.resource.range.offset; + uint32_t offset = data.view.resource.range.offset; vk::DescriptorBufferInfo buffer_info; buffer_info.buffer = buffer; buffer_info.offset = offset; - buffer_info.range = view.resource.range.length; + buffer_info.range = data.view.resource.range.length; - const ShaderUniformSlot& uniform = bindings.uniforms.at(buffer_index); + const ShaderUniformSlot& uniform = data.slot; auto layout_it = std::find_if(desc_set.begin(), desc_set.end(), [&uniform](DescriptorSetLayout& layout) { return layout.binding == uniform.binding; diff --git a/impeller/renderer/command.cc b/impeller/renderer/command.cc index 091906cea0733..d83c9387a6911 100644 --- a/impeller/renderer/command.cc +++ b/impeller/renderer/command.cc @@ -18,8 +18,8 @@ bool Command::BindVertices(const VertexBuffer& buffer) { return false; } - vertex_bindings.buffers[VertexDescriptor::kReservedVertexBufferIndex] = { - nullptr, buffer.vertex_buffer}; + vertex_bindings.buffers[VertexDescriptor::kReservedVertexBufferIndex] = + BufferAndUniformSlot{.slot = {}, .view = {nullptr, buffer.vertex_buffer}}; index_buffer = buffer.index_buffer; vertex_count = buffer.vertex_count; index_type = buffer.index_type; @@ -30,7 +30,7 @@ BufferView Command::GetVertexBuffer() const { auto found = vertex_bindings.buffers.find( VertexDescriptor::kReservedVertexBufferIndex); if (found != vertex_bindings.buffers.end()) { - return found->second.resource; + return found->second.view.resource; } return {}; } @@ -61,13 +61,13 @@ bool Command::DoBindResource(ShaderStage stage, switch (stage) { case ShaderStage::kVertex: - vertex_bindings.uniforms[slot.ext_res_0] = slot; - vertex_bindings.buffers[slot.ext_res_0] = BufferResource(metadata, view); + vertex_bindings.buffers[slot.ext_res_0] = { + .slot = slot, .view = BufferResource(metadata, view)}; return true; case ShaderStage::kFragment: - fragment_bindings.uniforms[slot.ext_res_0] = slot; - fragment_bindings.buffers[slot.ext_res_0] = - BufferResource(metadata, view); + fragment_bindings.buffers[slot.ext_res_0] = { + .slot = slot, .view = BufferResource(metadata, view)}; + BufferResource(metadata, view); return true; case ShaderStage::kCompute: VALIDATION_LOG << "Use ComputeCommands for compute shader stages."; diff --git a/impeller/renderer/command.h b/impeller/renderer/command.h index 2485cbd73bb35..040bbf64c7bb8 100644 --- a/impeller/renderer/command.h +++ b/impeller/renderer/command.h @@ -68,10 +68,15 @@ struct TextureAndSampler { SamplerResource sampler; }; +/// @brief combines the buffer resource and its uniform slot information. +struct BufferAndUniformSlot { + ShaderUniformSlot slot; + BufferResource view; +}; + struct Bindings { - std::map uniforms; std::map sampled_images; - std::map buffers; + std::map buffers; }; //------------------------------------------------------------------------------ diff --git a/impeller/renderer/compute_command.cc b/impeller/renderer/compute_command.cc index ad6131f05a6d5..2672d4230e8eb 100644 --- a/impeller/renderer/compute_command.cc +++ b/impeller/renderer/compute_command.cc @@ -23,8 +23,7 @@ bool ComputeCommand::BindResource(ShaderStage stage, return false; } - bindings.uniforms[slot.ext_res_0] = slot; - bindings.buffers[slot.ext_res_0] = {&metadata, view}; + bindings.buffers[slot.ext_res_0] = {.slot = slot, .view = {&metadata, view}}; return true; } From 5de08f0307b9f79184d3e64767eee0fd8ee9eded Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 23 Aug 2023 13:24:02 -0700 Subject: [PATCH 2/2] typo --- impeller/renderer/command.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/impeller/renderer/command.cc b/impeller/renderer/command.cc index d83c9387a6911..af565db97a9b5 100644 --- a/impeller/renderer/command.cc +++ b/impeller/renderer/command.cc @@ -67,7 +67,6 @@ bool Command::DoBindResource(ShaderStage stage, case ShaderStage::kFragment: fragment_bindings.buffers[slot.ext_res_0] = { .slot = slot, .view = BufferResource(metadata, view)}; - BufferResource(metadata, view); return true; case ShaderStage::kCompute: VALIDATION_LOG << "Use ComputeCommands for compute shader stages.";