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>
This commit is contained in:
Iago Toral Quiroga 2020-06-19 09:52:53 +02:00 committed by Marge Bot
parent 7e990683fd
commit 2f1c15116f
3 changed files with 18 additions and 4 deletions

View file

@ -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: {

View file

@ -945,6 +945,7 @@ struct v3dv_descriptor {
struct {
struct v3dv_buffer *buffer;
uint32_t offset;
uint32_t range;
};
};
};

View file

@ -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;