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;