v3dv: handle unsized arrays in SSBOs

CTS coverage for this was hiding behind compute shaders so
we didn't notice this was not working properly until now.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_descriptor_set.c b/src/broadcom/vulkan/v3dv_descriptor_set.c
index 48a7426..d9a0002 100644
--- a/src/broadcom/vulkan/v3dv_descriptor_set.c
+++ b/src/broadcom/vulkan/v3dv_descriptor_set.c
@@ -927,6 +927,12 @@
 
             descriptor->buffer = buffer;
             descriptor->offset = buffer_info->offset;
+            if (buffer_info->range == VK_WHOLE_SIZE) {
+               descriptor->range = buffer->size - buffer_info->offset;
+            } else {
+               assert(descriptor->range <= UINT32_MAX);
+               descriptor->range = buffer_info->range;
+            }
             break;
          }
          case VK_DESCRIPTOR_TYPE_SAMPLER: {
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index daa8a1d..ca54ac1 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -945,6 +945,7 @@
       struct {
          struct v3dv_buffer *buffer;
          uint32_t offset;
+         uint32_t range;
       };
    };
 };
diff --git a/src/broadcom/vulkan/v3dv_uniforms.c b/src/broadcom/vulkan/v3dv_uniforms.c
index 70472e6..36809b6 100644
--- a/src/broadcom/vulkan/v3dv_uniforms.c
+++ b/src/broadcom/vulkan/v3dv_uniforms.c
@@ -198,11 +198,17 @@
                                             index, &dynamic_offset);
       assert(descriptor);
       assert(descriptor->buffer);
+      assert(descriptor->buffer->mem);
+      assert(descriptor->buffer->mem->bo);
 
-      cl_aligned_reloc(&job->indirect, uniforms,
-                       descriptor->buffer->mem->bo,
-                       descriptor->buffer->mem_offset +
-                       descriptor->offset + offset + dynamic_offset);
+      if (content == QUNIFORM_GET_BUFFER_SIZE) {
+         cl_aligned_u32(uniforms, descriptor->range);
+      } else {
+         cl_aligned_reloc(&job->indirect, uniforms,
+                          descriptor->buffer->mem->bo,
+                          descriptor->buffer->mem_offset +
+                          descriptor->offset + offset + dynamic_offset);
+      }
    }
 }
 
@@ -303,6 +309,7 @@
 
       case QUNIFORM_SSBO_OFFSET:
       case QUNIFORM_UBO_ADDR:
+      case QUNIFORM_GET_BUFFER_SIZE:
          write_ubo_ssbo_uniforms(cmd_buffer, pipeline, &uniforms,
                                  uinfo->contents[i], data);
         break;