mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 19:07:01 +02:00
renderer: bind prepared buffer descriptors without copying
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user