diff --git a/src/broadcom/vulkan/v3dv_descriptor_set.c b/src/broadcom/vulkan/v3dv_descriptor_set.c index 48a742675fa..d9a00027f22 100644 --- a/src/broadcom/vulkan/v3dv_descriptor_set.c +++ b/src/broadcom/vulkan/v3dv_descriptor_set.c @@ -927,6 +927,12 @@ v3dv_UpdateDescriptorSets(VkDevice _device, 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 daa8a1d06c4..ca54ac10ba4 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -945,6 +945,7 @@ struct v3dv_descriptor { 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 70472e6d1ae..36809b6bb66 100644 --- a/src/broadcom/vulkan/v3dv_uniforms.c +++ b/src/broadcom/vulkan/v3dv_uniforms.c @@ -198,11 +198,17 @@ write_ubo_ssbo_uniforms(struct v3dv_cmd_buffer *cmd_buffer, 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 @@ v3dv_write_uniforms(struct v3dv_cmd_buffer *cmd_buffer, 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;