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:
@@ -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)
|
||||
|
@@ -1389,6 +1389,7 @@ struct v3dv_draw_info {
|
||||
struct v3dv_vertex_binding {
|
||||
struct v3dv_buffer *buffer;
|
||||
VkDeviceSize offset;
|
||||
VkDeviceSize size;
|
||||
};
|
||||
|
||||
struct v3dv_descriptor_state {
|
||||
|
@@ -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++;
|
||||
|
Reference in New Issue
Block a user