shader: bind dispatch spans while keeping GPU record counts native

Co-authored-by: TheCruZ <thecruzwtf@gmail.com>
This commit is contained in:
nmzik
2026-10-04 10:13:35 +04:00
parent cd9fc6ff2d
commit 8b05b6730e
11 changed files with 207 additions and 16 deletions
@@ -805,7 +805,8 @@ void RenderExecutor::PrepareBindings(const ShaderStageRuntime& runtime,
}
}
void RenderExecutor::FindBuffers(PreparedBindings& prepared) {
void RenderExecutor::FindBuffers(PreparedBindings& prepared, uint64_t dispatch_threads_x,
uint32_t group_size_x) {
KYTY_PROFILER_FUNCTION();
EXIT_IF(prepared.runtime == nullptr || !*prepared.runtime);
const auto& program = *prepared.runtime->program;
@@ -822,8 +823,23 @@ void RenderExecutor::FindBuffers(PreparedBindings& prepared) {
for (const auto resource: resources) {
auto descriptor = DecodeNativeDescriptor<ShaderBufferResource>(snapshot.buffers[resource]);
const auto address = descriptor.Base48();
const auto requested_size = descriptor.GetSize();
if (address == 0 || requested_size == 0) {
if (address == 0u) {
prepared.buffer_sources.push_back({});
continue;
}
auto requested_size = descriptor.GetSize();
const auto& buffer = program.info.buffers[resource];
if (buffer.dispatch_stride != 0u) {
if (dispatch_threads_x == 0u || dispatch_threads_x > uint64_t{UINT32_MAX} + 1u ||
buffer.dispatch_stride != group_size_x) {
EXIT("GPU-sized buffer requires a known matching X dispatch extent\n");
}
requested_size = (dispatch_threads_x - 1u) * descriptor.Stride() + buffer.max_byte_extent;
if (requested_size > uint64_t{UINT32_MAX} + 1u) {
EXIT("GPU-sized buffer dispatch wraps its 32-bit byte address\n");
}
}
if (requested_size == 0) {
prepared.buffer_sources.push_back({});
continue;
}
+3 -1
View File
@@ -161,7 +161,9 @@ public:
uint32_t mode);
void PrepareBindings(const ShaderStageRuntime& runtime, PreparedBindings& prepared);
void FindBuffers(PreparedBindings& bindings);
void FindBuffers(PreparedBindings& bindings,
uint64_t dispatch_threads_x = 0,
uint32_t group_size_x = 0);
void RebindBuffers(PreparedBindings& bindings);
void RebindImages(PreparedBindings& bindings);
void CommitBindings(CommandBuffer& buffer, vk::PipelineBindPoint pipeline_bind_point,
@@ -306,7 +306,10 @@ void RenderExecutor::DispatchDirect(uint64_t submit_id, CommandBuffer& buffer,
std::copy(std::begin(input_info.dispatch_threads_num), std::end(input_info.dispatch_threads_num),
bindings.shader_data.begin() + program.bindings.dispatch_thread_dword);
}
FindBuffers(bindings);
const auto dispatch_threads_x = use_thread_dimensions
? uint64_t{input_info.dispatch_threads_num[0]}
: uint64_t{thread_group_x} * input_info.threads_num[0];
FindBuffers(bindings, dispatch_threads_x, input_info.threads_num[0]);
if (program.info.uses_dma) {
m_context.PrepareBda();
}