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;

Reply via email to