v3dv: use pSizes paramater in vkCmdBindVertexBuffers2

We can use this to specify the maximum vertex index that can
be accessed, which the hardware will use to detect and prevent
out-of-bounds accesses to vertex buffers.

Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29425>
This commit is contained in:
Iago Toral Quiroga
2024-05-27 13:43:51 +02:00
parent 70aa470bdb
commit e00da33474
3 changed files with 21 additions and 3 deletions

View File

@@ -3465,16 +3465,31 @@ v3dv_CmdBindVertexBuffers2(VkCommandBuffer commandBuffer,
if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_VI_BINDING_STRIDES))
vb_state_changed = true;
}
/* FIXME: at this moment we don't do any thing with pSizes. */
for (uint32_t i = 0; i < bindingCount; i++) {
if (vb[firstBinding + i].buffer != v3dv_buffer_from_handle(pBuffers[i])) {
struct v3dv_buffer *buffer = v3dv_buffer_from_handle(pBuffers[i]);
if (vb[firstBinding + i].buffer != buffer) {
vb[firstBinding + i].buffer = v3dv_buffer_from_handle(pBuffers[i]);
vb_state_changed = true;
}
if (vb[firstBinding + i].offset != pOffsets[i]) {
vb[firstBinding + i].offset = pOffsets[i];
vb_state_changed = true;
}
assert(pOffsets[i] <= buffer->size);
VkDeviceSize size;
if (!pSizes || pSizes[i] == VK_WHOLE_SIZE)
size = buffer->size - pOffsets[i];
else
size = pSizes[i];
assert(pOffsets[i] + size <= buffer->size);
if (vb[firstBinding + i].size != size) {
vb[firstBinding + i].size = size;
vb_state_changed = true;
}
}
if (vb_state_changed)

View File

@@ -1389,6 +1389,7 @@ struct v3dv_draw_info {
struct v3dv_vertex_binding {
struct v3dv_buffer *buffer;
VkDeviceSize offset;
VkDeviceSize size;
};
struct v3dv_descriptor_state {

View File

@@ -2620,7 +2620,9 @@ v3dX(cmd_buffer_emit_gl_shader_state)(struct v3dv_cmd_buffer *cmd_buffer)
attr.stride =
cmd_buffer->vk.dynamic_graphics_state.vi_binding_strides[binding];
attr.maximum_index = 0xffffff;
attr.maximum_index = attr.stride == 0 ?
1u : MIN2(0xffffffu, c_vb->size / attr.stride);
}
emitted_va_count++;