Module: Mesa Branch: main Commit: 0e7e1b64fcdaf2f1c7977a979d8744fe64650b82 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0e7e1b64fcdaf2f1c7977a979d8744fe64650b82
Author: Boris Brezillon <[email protected]> Date: Thu Sep 23 15:40:46 2021 +0200 panvk: Add support for storage/uniform buffers with dynamic offsets The idea of storing offsets in a separate UBO and lowering accesses to UBOs/SSBOs with a dynamic offset was not great. Let's apply the offset at UBO/SSBO emission time instead. Signed-off-by: Boris Brezillon <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15248> --- src/panfrost/vulkan/panvk_cmd_buffer.c | 50 ++++++++++++++++----------- src/panfrost/vulkan/panvk_descriptor_set.c | 33 +++++++++++------- src/panfrost/vulkan/panvk_private.h | 30 +++++++++------- src/panfrost/vulkan/panvk_vX_cmd_buffer.c | 23 +++++++----- src/panfrost/vulkan/panvk_vX_cs.c | 24 ++++++++----- src/panfrost/vulkan/panvk_vX_descriptor_set.c | 42 ++++++++++++++-------- src/panfrost/vulkan/panvk_vX_pipeline.c | 4 +-- src/panfrost/vulkan/panvk_vX_shader.c | 10 ++++-- 8 files changed, 135 insertions(+), 81 deletions(-) diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c index 0f432ff2595..0a4b3871a4d 100644 --- a/src/panfrost/vulkan/panvk_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_cmd_buffer.c @@ -66,7 +66,7 @@ panvk_CmdBindIndexBuffer(VkCommandBuffer commandBuffer, void panvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, - VkPipelineLayout _layout, + VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets, @@ -74,36 +74,46 @@ panvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, const uint32_t *pDynamicOffsets) { VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer); - VK_FROM_HANDLE(panvk_pipeline_layout, layout, _layout); + VK_FROM_HANDLE(panvk_pipeline_layout, playout, layout); struct panvk_descriptor_state *descriptors_state = &cmdbuf->bind_points[pipelineBindPoint].desc_state; + unsigned dynoffset_idx = 0; for (unsigned i = 0; i < descriptorSetCount; ++i) { unsigned idx = i + firstSet; VK_FROM_HANDLE(panvk_descriptor_set, set, pDescriptorSets[i]); - descriptors_state->sets[idx].set = set; - - if (layout->num_dynoffsets) { - assert(dynamicOffsetCount >= set->layout->num_dynoffsets); - - descriptors_state->sets[idx].dynoffsets = - pan_pool_alloc_aligned(&cmdbuf->desc_pool.base, - ALIGN(layout->num_dynoffsets, 4) * - sizeof(*pDynamicOffsets), - 16); - memcpy(descriptors_state->sets[idx].dynoffsets.cpu, - pDynamicOffsets, - sizeof(*pDynamicOffsets) * set->layout->num_dynoffsets); - dynamicOffsetCount -= set->layout->num_dynoffsets; - pDynamicOffsets += set->layout->num_dynoffsets; + descriptors_state->sets[idx] = set; + + if (set->layout->num_dyn_ssbos || set->layout->num_dyn_ubos) { + unsigned dyn_ubo_offset = playout->sets[idx].dyn_ubo_offset; + unsigned dyn_ssbo_offset = playout->sets[idx].dyn_ssbo_offset; + + for (unsigned b = 0; b < set->layout->binding_count; b++) { + for (unsigned e = 0; e < set->layout->bindings[b].array_size; e++) { + struct panvk_buffer_desc *bdesc = NULL; + + if (set->layout->bindings[b].type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) { + bdesc = &descriptors_state->dyn.ubos[dyn_ubo_offset++]; + *bdesc = set->dyn_ubos[set->layout->bindings[b].dyn_ubo_idx + e]; + } else if (set->layout->bindings[b].type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) { + bdesc = &descriptors_state->dyn.ssbos[dyn_ssbo_offset++]; + *bdesc = set->dyn_ssbos[set->layout->bindings[b].dyn_ssbo_idx + e]; + } + + if (bdesc) { + bdesc->offset += pDynamicOffsets[dynoffset_idx++]; + } + } + } } - if (set->layout->num_ssbos) + if (set->layout->num_ssbos || set->layout->num_dyn_ssbos) descriptors_state->dirty |= PANVK_DYNAMIC_SSBO; - if (set->layout->num_ubos || set->layout->num_ssbos || set->layout->num_dynoffsets) + if (set->layout->num_ubos || set->layout->num_dyn_ubos || + set->layout->num_ssbos || set->layout->num_dyn_ssbos) descriptors_state->ubos = 0; if (set->layout->num_textures) @@ -113,7 +123,7 @@ panvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, descriptors_state->samplers = 0; } - assert(!dynamicOffsetCount); + assert(dynoffset_idx == dynamicOffsetCount); } void diff --git a/src/panfrost/vulkan/panvk_descriptor_set.c b/src/panfrost/vulkan/panvk_descriptor_set.c index f8c182ea1d0..7c2957fe687 100644 --- a/src/panfrost/vulkan/panvk_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_descriptor_set.c @@ -87,7 +87,7 @@ panvk_CreateDescriptorSetLayout(VkDevice _device, set_layout->binding_count = num_bindings; unsigned sampler_idx = 0, tex_idx = 0, ubo_idx = 0, ssbo_idx = 0; - unsigned dynoffset_idx = 0, desc_idx = 0; + unsigned dyn_ubo_idx = 0, dyn_ssbo_idx = 0, desc_idx = 0; for (unsigned i = 0; i < pCreateInfo->bindingCount; i++) { const VkDescriptorSetLayoutBinding *binding = &bindings[i]; @@ -128,17 +128,17 @@ panvk_CreateDescriptorSetLayout(VkDevice _device, tex_idx += binding_layout->array_size; break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: - binding_layout->dynoffset_idx = dynoffset_idx; - dynoffset_idx += binding_layout->array_size; - FALLTHROUGH; + binding_layout->dyn_ubo_idx = dyn_ubo_idx; + dyn_ubo_idx += binding_layout->array_size; + break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: binding_layout->ubo_idx = ubo_idx; ubo_idx += binding_layout->array_size; break; case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: - binding_layout->dynoffset_idx = dynoffset_idx; - dynoffset_idx += binding_layout->array_size; - FALLTHROUGH; + binding_layout->dyn_ssbo_idx = dyn_ssbo_idx; + dyn_ssbo_idx += binding_layout->array_size; + break; case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: binding_layout->ssbo_idx = ssbo_idx; ssbo_idx += binding_layout->array_size; @@ -152,8 +152,9 @@ panvk_CreateDescriptorSetLayout(VkDevice _device, set_layout->num_samplers = sampler_idx; set_layout->num_textures = tex_idx; set_layout->num_ubos = ubo_idx; + set_layout->num_dyn_ubos = dyn_ubo_idx; set_layout->num_ssbos = ssbo_idx; - set_layout->num_dynoffsets = dynoffset_idx; + set_layout->num_dyn_ssbos = dyn_ssbo_idx; free(bindings); *pSetLayout = panvk_descriptor_set_layout_to_handle(set_layout); @@ -273,7 +274,8 @@ panvk_CreatePipelineLayout(VkDevice _device, layout->num_sets = pCreateInfo->setLayoutCount; _mesa_sha1_init(&ctx); - unsigned sampler_idx = 0, tex_idx = 0, ssbo_idx = 0, ubo_idx = 0, dynoffset_idx = 0; + unsigned sampler_idx = 0, tex_idx = 0, ssbo_idx = 0, ubo_idx = 0; + unsigned dyn_ubo_idx = 0, dyn_ssbo_idx = 0; for (unsigned set = 0; set < pCreateInfo->setLayoutCount; set++) { VK_FROM_HANDLE(panvk_descriptor_set_layout, set_layout, pCreateInfo->pSetLayouts[set]); @@ -281,13 +283,15 @@ panvk_CreatePipelineLayout(VkDevice _device, layout->sets[set].sampler_offset = sampler_idx; layout->sets[set].tex_offset = tex_idx; layout->sets[set].ubo_offset = ubo_idx; + layout->sets[set].dyn_ubo_offset = dyn_ubo_idx; layout->sets[set].ssbo_offset = ssbo_idx; - layout->sets[set].dynoffset_offset = dynoffset_idx; + layout->sets[set].dyn_ssbo_offset = dyn_ssbo_idx; sampler_idx += set_layout->num_samplers; tex_idx += set_layout->num_textures; - ubo_idx += set_layout->num_ubos + (set_layout->num_dynoffsets != 0); + ubo_idx += set_layout->num_ubos; + dyn_ubo_idx += set_layout->num_dyn_ubos; ssbo_idx += set_layout->num_ssbos; - dynoffset_idx += set_layout->num_dynoffsets; + dyn_ssbo_idx += set_layout->num_dyn_ssbos; for (unsigned b = 0; b < set_layout->binding_count; b++) { struct panvk_descriptor_set_binding_layout *binding_layout = @@ -320,8 +324,9 @@ panvk_CreatePipelineLayout(VkDevice _device, layout->num_samplers = sampler_idx; layout->num_textures = tex_idx; layout->num_ubos = ubo_idx; + layout->num_dyn_ubos = dyn_ubo_idx; layout->num_ssbos = ssbo_idx; - layout->num_dynoffsets = dynoffset_idx; + layout->num_dyn_ssbos = dyn_ssbo_idx; _mesa_sha1_final(&ctx, layout->sha1); @@ -436,7 +441,9 @@ panvk_descriptor_set_destroy(struct panvk_device *device, vk_free(&device->vk.alloc, set->textures); vk_free(&device->vk.alloc, set->samplers); vk_free(&device->vk.alloc, set->ubos); + vk_free(&device->vk.alloc, set->dyn_ubos); vk_free(&device->vk.alloc, set->ssbos); + vk_free(&device->vk.alloc, set->dyn_ssbos); vk_free(&device->vk.alloc, set->descs); vk_object_free(&device->vk, NULL, set); } diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h index e67b354a133..4648d4f9e60 100644 --- a/src/panfrost/vulkan/panvk_private.h +++ b/src/panfrost/vulkan/panvk_private.h @@ -357,7 +357,9 @@ struct panvk_descriptor_set { const struct panvk_descriptor_set_layout *layout; struct panvk_descriptor *descs; struct panvk_buffer_desc *ssbos; + struct panvk_buffer_desc *dyn_ssbos; void *ubos; + struct panvk_buffer_desc *dyn_ubos; void *samplers; void *textures; }; @@ -377,13 +379,11 @@ struct panvk_descriptor_set_binding_layout { unsigned sampler_idx; unsigned tex_idx; }; - struct { - union { - unsigned ssbo_idx; - unsigned ubo_idx; - }; - unsigned dynoffset_idx; - }; + unsigned ssbo_idx; + unsigned dyn_ssbo_idx; + unsigned ubo_idx; + unsigned dyn_ubo_idx; + unsigned img_idx; }; /* Shader stages affected by this set+binding */ @@ -405,8 +405,9 @@ struct panvk_descriptor_set_layout { unsigned num_samplers; unsigned num_textures; unsigned num_ubos; + unsigned num_dyn_ubos; unsigned num_ssbos; - unsigned num_dynoffsets; + unsigned num_dyn_ssbos; /* Number of bindings in this descriptor set */ uint32_t binding_count; @@ -422,8 +423,9 @@ struct panvk_pipeline_layout { unsigned num_samplers; unsigned num_textures; unsigned num_ubos; + unsigned num_dyn_ubos; unsigned num_ssbos; - unsigned num_dynoffsets; + unsigned num_dyn_ssbos; uint32_t num_sets; struct { @@ -436,8 +438,9 @@ struct panvk_pipeline_layout { unsigned sampler_offset; unsigned tex_offset; unsigned ubo_offset; + unsigned dyn_ubo_offset; unsigned ssbo_offset; - unsigned dynoffset_offset; + unsigned dyn_ssbo_offset; } sets[MAX_SETS]; }; @@ -491,10 +494,11 @@ enum panvk_dynamic_state_bits { struct panvk_descriptor_state { uint32_t dirty; + const struct panvk_descriptor_set *sets[MAX_SETS]; struct { - const struct panvk_descriptor_set *set; - struct panfrost_ptr dynoffsets; - } sets[MAX_SETS]; + struct panvk_buffer_desc ubos[MAX_DYNAMIC_UNIFORM_BUFFERS]; + struct panvk_buffer_desc ssbos[MAX_DYNAMIC_STORAGE_BUFFERS]; + } dyn; mali_ptr sysvals[MESA_SHADER_STAGES]; mali_ptr ubos; mali_ptr textures; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c index 2e50a897b0a..0a837428d33 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_buffer.c @@ -305,10 +305,14 @@ panvk_sysval_upload_ssbo_info(struct panvk_cmd_buffer *cmdbuf, for (unsigned s = 0; s < pipeline->layout->num_sets; s++) { unsigned ssbo_offset = pipeline->layout->sets[s].ssbo_offset; unsigned num_ssbos = pipeline->layout->sets[s].layout->num_ssbos; + unsigned dyn_ssbo_offset = pipeline->layout->sets[s].dyn_ssbo_offset + pipeline->layout->num_ssbos; + unsigned num_dyn_ssbos = pipeline->layout->sets[s].layout->num_dyn_ssbos; const struct panvk_buffer_desc *ssbo = NULL; if (ssbo_id >= ssbo_offset && ssbo_id < (ssbo_offset + num_ssbos)) - ssbo = &desc_state->sets[s].set->ssbos[ssbo_id - ssbo_offset]; + ssbo = &desc_state->sets[s]->ssbos[ssbo_id - ssbo_offset]; + else if (ssbo_id >= dyn_ssbo_offset && ssbo_id < (dyn_ssbo_offset + num_dyn_ssbos)) + ssbo = &desc_state->dyn.ssbos[ssbo_id - pipeline->layout->num_ssbos]; if (ssbo) { data->u64[0] = ssbo->buffer->bo->ptr.gpu + ssbo->offset; @@ -446,14 +450,14 @@ panvk_cmd_prepare_textures(struct panvk_cmd_buffer *cmdbuf, void *texture = textures.cpu; for (unsigned i = 0; i < ARRAY_SIZE(desc_state->sets); i++) { - if (!desc_state->sets[i].set) continue; + if (!desc_state->sets[i]) continue; memcpy(texture, - desc_state->sets[i].set->textures, - desc_state->sets[i].set->layout->num_textures * + desc_state->sets[i]->textures, + desc_state->sets[i]->layout->num_textures * tex_entry_size); - texture += desc_state->sets[i].set->layout->num_textures * + texture += desc_state->sets[i]->layout->num_textures * tex_entry_size; } @@ -479,14 +483,15 @@ panvk_cmd_prepare_samplers(struct panvk_cmd_buffer *cmdbuf, void *sampler = samplers.cpu; for (unsigned i = 0; i < ARRAY_SIZE(desc_state->sets); i++) { - if (!desc_state->sets[i].set) continue; + if (!desc_state->sets[i]) continue; memcpy(sampler, - desc_state->sets[i].set->samplers, - desc_state->sets[i].set->layout->num_samplers * + desc_state->sets[i]->samplers, + desc_state->sets[i]->layout->num_samplers * pan_size(SAMPLER)); - sampler += desc_state->sets[i].set->layout->num_samplers; + sampler += desc_state->sets[i]->layout->num_samplers * + pan_size(SAMPLER); } desc_state->samplers = samplers.gpu; diff --git a/src/panfrost/vulkan/panvk_vX_cs.c b/src/panfrost/vulkan/panvk_vX_cs.c index 4cea5cbf507..abba903b09d 100644 --- a/src/panfrost/vulkan/panvk_vX_cs.c +++ b/src/panfrost/vulkan/panvk_vX_cs.c @@ -352,25 +352,33 @@ panvk_per_arch(emit_ubos)(const struct panvk_pipeline *pipeline, for (unsigned i = 0; i < ARRAY_SIZE(state->sets); i++) { const struct panvk_descriptor_set_layout *set_layout = pipeline->layout->sets[i].layout; - const struct panvk_descriptor_set *set = state->sets[i].set; + const struct panvk_descriptor_set *set = state->sets[i]; unsigned offset = pipeline->layout->sets[i].ubo_offset; if (!set_layout) continue; if (!set) { - unsigned num_ubos = (set_layout->num_dynoffsets != 0) + set_layout->num_ubos; - memset(&ubos[offset], 0, num_ubos * sizeof(*ubos)); + memset(&ubos[offset], 0, set_layout->num_ubos * sizeof(*ubos)); } else { memcpy(&ubos[offset], set->ubos, set_layout->num_ubos * sizeof(*ubos)); - if (set_layout->num_dynoffsets) { - panvk_per_arch(emit_ubo)(state->sets[i].dynoffsets.gpu, - set->layout->num_dynoffsets * sizeof(uint32_t), - &ubos[offset + set_layout->num_ubos]); - } } } + unsigned offset = pipeline->layout->num_ubos; + for (unsigned i = 0; i < pipeline->layout->num_dyn_ubos; i++) { + const struct panvk_buffer_desc *bdesc = &state->dyn.ubos[i]; + size_t size = (bdesc->size == VK_WHOLE_SIZE && bdesc->buffer) ? + (bdesc->buffer->bo->size - bdesc->offset) : + bdesc->size; + mali_ptr address = bdesc->buffer ? bdesc->buffer->bo->ptr.gpu + bdesc->offset : 0; + + if (size) + panvk_per_arch(emit_ubo)(address, size, &ubos[offset + i]); + else + memset(&ubos[offset + i], 0, sizeof(*ubos)); + } + for (unsigned i = 0; i < ARRAY_SIZE(pipeline->sysvals); i++) { if (!pipeline->sysvals[i].ids.sysval_count) continue; diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index ea816aa4867..f1ac690ace2 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -72,6 +72,14 @@ panvk_per_arch(descriptor_set_create)(struct panvk_device *device, goto err_free_set; } + if (layout->num_dyn_ubos) { + set->dyn_ubos = vk_zalloc(&device->vk.alloc, + sizeof(*set->dyn_ubos) * layout->num_dyn_ubos, 8, + VK_OBJECT_TYPE_DESCRIPTOR_SET); + if (!set->dyn_ubos) + goto err_free_set; + } + if (layout->num_ssbos) { set->ssbos = vk_zalloc(&device->vk.alloc, sizeof(*set->ssbos) * layout->num_ssbos, 8, @@ -80,6 +88,14 @@ panvk_per_arch(descriptor_set_create)(struct panvk_device *device, goto err_free_set; } + if (layout->num_dyn_ssbos) { + set->dyn_ssbos = vk_zalloc(&device->vk.alloc, + sizeof(*set->dyn_ssbos) * layout->num_dyn_ssbos, 8, + VK_OBJECT_TYPE_DESCRIPTOR_SET); + if (!set->dyn_ssbos) + goto err_free_set; + } + if (layout->num_samplers) { set->samplers = vk_zalloc(&device->vk.alloc, pan_size(SAMPLER) * layout->num_samplers, 8, @@ -115,7 +131,9 @@ err_free_set: vk_free(&device->vk.alloc, set->textures); vk_free(&device->vk.alloc, set->samplers); vk_free(&device->vk.alloc, set->ssbos); + vk_free(&device->vk.alloc, set->dyn_ssbos); vk_free(&device->vk.alloc, set->ubos); + vk_free(&device->vk.alloc, set->dyn_ubos); vk_free(&device->vk.alloc, set->descs); vk_object_free(&device->vk, NULL, set); return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); @@ -172,16 +190,6 @@ panvk_set_texel_buffer_view_desc(struct panvk_descriptor *desc, desc->buffer_view = buffer_view; } -static void -panvk_set_buffer_info_desc(struct panvk_descriptor *desc, - const VkDescriptorBufferInfo *pBufferInfo) -{ - VK_FROM_HANDLE(panvk_buffer, buffer, pBufferInfo->buffer); - desc->buffer_info.buffer = buffer; - desc->buffer_info.offset = pBufferInfo->offset; - desc->buffer_info.range = pBufferInfo->range; -} - static void panvk_set_buffer_desc(struct panvk_buffer_desc *bdesc, const VkDescriptorBufferInfo *pBufferInfo) @@ -295,14 +303,18 @@ panvk_per_arch(write_descriptor_set)(struct panvk_device *dev, break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: for (unsigned i = 0; i < ndescs; i++) { unsigned ubo = binding_layout->ubo_idx + dest_offset + i; panvk_per_arch(set_ubo_desc)(&ubos[ubo], &pDescriptorWrite->pBufferInfo[src_offset + i]); } break; - + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + for (unsigned i = 0; i < ndescs; i++) { + unsigned ubo = binding_layout->dyn_ubo_idx + dest_offset + i; + panvk_set_buffer_desc(&set->dyn_ubos[ubo], &pDescriptorWrite->pBufferInfo[src_offset + i]); + } + break; case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: for (unsigned i = 0; i < ndescs; i++) { unsigned ssbo = binding_layout->ssbo_idx + dest_offset + i; @@ -310,8 +322,10 @@ panvk_per_arch(write_descriptor_set)(struct panvk_device *dev, } break; case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: - for (unsigned i = 0; i < ndescs; i++) - panvk_set_buffer_info_desc(&descs[i], &pDescriptorWrite->pBufferInfo[src_offset + i]); + for (unsigned i = 0; i < ndescs; i++) { + unsigned ssbo = binding_layout->dyn_ssbo_idx + dest_offset + i; + panvk_set_buffer_desc(&set->dyn_ssbos[ssbo], &pDescriptorWrite->pBufferInfo[src_offset + i]); + } break; default: unreachable("Invalid type"); diff --git a/src/panfrost/vulkan/panvk_vX_pipeline.c b/src/panfrost/vulkan/panvk_vX_pipeline.c index 79ed2ce5d27..971f00e7c9a 100644 --- a/src/panfrost/vulkan/panvk_vX_pipeline.c +++ b/src/panfrost/vulkan/panvk_vX_pipeline.c @@ -126,7 +126,7 @@ panvk_pipeline_builder_compile_shaders(struct panvk_pipeline_builder *builder, } /* compile shaders in reverse order */ - unsigned sysval_ubo = builder->layout->num_ubos; + unsigned sysval_ubo = builder->layout->num_ubos + builder->layout->num_dyn_ubos; for (gl_shader_stage stage = MESA_SHADER_STAGES - 1; stage > MESA_SHADER_NONE; stage--) { @@ -361,7 +361,7 @@ panvk_pipeline_builder_init_shaders(struct panvk_pipeline_builder *builder, pipeline->cs.local_size = shader->local_size; } - pipeline->num_ubos = builder->layout->num_ubos; + pipeline->num_ubos = builder->layout->num_ubos + builder->layout->num_dyn_ubos; for (unsigned i = 0; i < ARRAY_SIZE(pipeline->sysvals); i++) { if (pipeline->sysvals[i].ids.sysval_count) pipeline->num_ubos = MAX2(pipeline->num_ubos, pipeline->sysvals[i].ubo_idx + 1); diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index 44cda542a59..8ebfc93c3b0 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -150,14 +150,20 @@ lower_vulkan_resource_index(nir_builder *b, nir_intrinsic_instr *intr, unsigned base; switch (binding_layout->type) { - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: base = binding_layout->ubo_idx + ctx->layout->sets[set].ubo_offset; break; - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + base = binding_layout->dyn_ubo_idx + ctx->layout->num_ubos + + ctx->layout->sets[set].dyn_ubo_offset; + break; case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: base = binding_layout->ssbo_idx + ctx->layout->sets[set].ssbo_offset; break; + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: + base = binding_layout->dyn_ssbo_idx + ctx->layout->num_ssbos + + ctx->layout->sets[set].dyn_ssbo_offset; + break; default: unreachable("Invalid descriptor type"); break;
