renderer: bind prepared buffer descriptors without copying

This commit is contained in:
nmzik
2026-10-09 01:49:18 +02:00
parent dbe5353f3a
commit 97fda7b10f
2 changed files with 6 additions and 12 deletions
@@ -973,7 +973,6 @@ void RenderExecutor::CommitBindings(CommandBuffer& buffer,
std::span<PreparedBindings* const> prepared_bindings) { std::span<PreparedBindings* const> prepared_bindings) {
KYTY_PROFILER_FUNCTION(); KYTY_PROFILER_FUNCTION();
auto vk_buffer = buffer.Handle(); auto vk_buffer = buffer.Handle();
size_t descriptor_count = 0;
size_t image_descriptor_count = 0; size_t image_descriptor_count = 0;
size_t write_count = 0; size_t write_count = 0;
ShaderRecompiler::IR::PushData push_data; ShaderRecompiler::IR::PushData push_data;
@@ -992,7 +991,6 @@ void RenderExecutor::CommitBindings(CommandBuffer& buffer,
for (auto mask = program.bindings.descriptor_mask; mask != 0; mask &= mask - 1) { for (auto mask = program.bindings.descriptor_mask; mask != 0; mask &= mask - 1) {
const auto index = std::countr_zero(mask); const auto index = std::countr_zero(mask);
const auto count = program.bindings.descriptor_counts[index]; const auto count = program.bindings.descriptor_counts[index];
descriptor_count += count;
if (index >= ShaderRecompiler::IR::FirstImageBinding && if (index >= ShaderRecompiler::IR::FirstImageBinding &&
index <= static_cast<size_t>(BindingKind::Samplers)) { index <= static_cast<size_t>(BindingKind::Samplers)) {
image_descriptor_count += count; image_descriptor_count += count;
@@ -1039,12 +1037,11 @@ void RenderExecutor::CommitBindings(CommandBuffer& buffer,
} }
} }
} }
m_descriptor_buffers.clear();
m_descriptor_images.resize(image_descriptor_count); m_descriptor_images.resize(image_descriptor_count);
m_descriptor_writes.clear(); m_descriptor_writes.clear();
m_descriptor_buffers.reserve(descriptor_count);
m_descriptor_writes.reserve(write_count); m_descriptor_writes.reserve(write_count);
size_t image_cursor = 0; size_t image_cursor = 0;
std::array<vk::DescriptorBufferInfo, 2> address_buffers;
for (auto* prepared: prepared_bindings) { for (auto* prepared: prepared_bindings) {
const auto& program = *prepared->runtime->program; const auto& program = *prepared->runtime->program;
@@ -1117,7 +1114,6 @@ void RenderExecutor::CommitBindings(CommandBuffer& buffer,
write.dstBinding = ShaderRecompiler::IR::NativeBinding(program.stage, kind); write.dstBinding = ShaderRecompiler::IR::NativeBinding(program.stage, kind);
write.descriptorType = NativeDescriptorType(kind); write.descriptorType = NativeDescriptorType(kind);
write.descriptorCount = program.bindings.descriptor_counts[index]; write.descriptorCount = program.bindings.descriptor_counts[index];
const auto buffer_start = m_descriptor_buffers.size();
const auto image_start = image_cursor; const auto image_start = image_cursor;
if (ShaderRecompiler::IR::ImageBindingResourceClass(kind) != if (ShaderRecompiler::IR::ImageBindingResourceClass(kind) !=
ShaderRecompiler::IR::ImageResourceClass::None) { ShaderRecompiler::IR::ImageResourceClass::None) {
@@ -1129,8 +1125,8 @@ void RenderExecutor::CommitBindings(CommandBuffer& buffer,
EXIT_IF(descriptors.buffers.size() != write.descriptorCount); EXIT_IF(descriptors.buffers.size() != write.descriptorCount);
for (const auto& view: descriptors.buffers) { for (const auto& view: descriptors.buffers) {
EXIT_IF(view.buffer == nullptr); EXIT_IF(view.buffer == nullptr);
m_descriptor_buffers.push_back(view);
} }
write.pBufferInfo = descriptors.buffers.data();
break; break;
case BindingKind::BdaPagetable: case BindingKind::BdaPagetable:
case BindingKind::FaultBuffer: { case BindingKind::FaultBuffer: {
@@ -1138,7 +1134,9 @@ void RenderExecutor::CommitBindings(CommandBuffer& buffer,
const auto* bda_buffer = kind == BindingKind::BdaPagetable const auto* bda_buffer = kind == BindingKind::BdaPagetable
? cache.GetBdaPageTableBuffer() ? cache.GetBdaPageTableBuffer()
: cache.GetFaultBuffer(); : cache.GetFaultBuffer();
m_descriptor_buffers.emplace_back(bda_buffer->Handle(), 0, bda_buffer->Size()); auto& view = address_buffers[kind == BindingKind::FaultBuffer];
view = {bda_buffer->Handle(), 0, bda_buffer->Size()};
write.pBufferInfo = &view;
break; break;
} }
case BindingKind::FlattenedSrt: case BindingKind::FlattenedSrt:
@@ -1154,7 +1152,7 @@ void RenderExecutor::CommitBindings(CommandBuffer& buffer,
view = &descriptors.shared_memory; view = &descriptors.shared_memory;
} }
EXIT_IF(view->buffer == nullptr); EXIT_IF(view->buffer == nullptr);
m_descriptor_buffers.push_back(*view); write.pBufferInfo = view;
break; break;
} }
case BindingKind::Samplers: case BindingKind::Samplers:
@@ -1166,9 +1164,6 @@ void RenderExecutor::CommitBindings(CommandBuffer& buffer,
case BindingKind::Count: EXIT("invalid descriptor binding kind"); case BindingKind::Count: EXIT("invalid descriptor binding kind");
} }
} }
if (m_descriptor_buffers.size() != buffer_start) {
write.pBufferInfo = m_descriptor_buffers.data() + buffer_start;
}
if (image_cursor != image_start) { if (image_cursor != image_start) {
write.pImageInfo = m_descriptor_images.data() + image_start; write.pImageInfo = m_descriptor_images.data() + image_start;
} }
-1
View File
@@ -213,7 +213,6 @@ private:
GraphicsBindings m_graphics_bindings; GraphicsBindings m_graphics_bindings;
PreparedBindings m_compute_bindings; PreparedBindings m_compute_bindings;
std::vector<ImageId> m_bound_images; std::vector<ImageId> m_bound_images;
std::vector<vk::DescriptorBufferInfo> m_descriptor_buffers;
std::vector<vk::DescriptorImageInfo> m_descriptor_images; std::vector<vk::DescriptorImageInfo> m_descriptor_images;
std::vector<vk::WriteDescriptorSet> m_descriptor_writes; std::vector<vk::WriteDescriptorSet> m_descriptor_writes;