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))
|
if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_VI_BINDING_STRIDES))
|
||||||
vb_state_changed = true;
|
vb_state_changed = true;
|
||||||
}
|
}
|
||||||
/* FIXME: at this moment we don't do any thing with pSizes. */
|
|
||||||
for (uint32_t i = 0; i < bindingCount; i++) {
|
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[firstBinding + i].buffer = v3dv_buffer_from_handle(pBuffers[i]);
|
||||||
vb_state_changed = true;
|
vb_state_changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vb[firstBinding + i].offset != pOffsets[i]) {
|
if (vb[firstBinding + i].offset != pOffsets[i]) {
|
||||||
vb[firstBinding + i].offset = pOffsets[i];
|
vb[firstBinding + i].offset = pOffsets[i];
|
||||||
vb_state_changed = true;
|
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)
|
if (vb_state_changed)
|
||||||
|
@@ -1389,6 +1389,7 @@ struct v3dv_draw_info {
|
|||||||
struct v3dv_vertex_binding {
|
struct v3dv_vertex_binding {
|
||||||
struct v3dv_buffer *buffer;
|
struct v3dv_buffer *buffer;
|
||||||
VkDeviceSize offset;
|
VkDeviceSize offset;
|
||||||
|
VkDeviceSize size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct v3dv_descriptor_state {
|
struct v3dv_descriptor_state {
|
||||||
|
@@ -2620,7 +2620,9 @@ v3dX(cmd_buffer_emit_gl_shader_state)(struct v3dv_cmd_buffer *cmd_buffer)
|
|||||||
|
|
||||||
attr.stride =
|
attr.stride =
|
||||||
cmd_buffer->vk.dynamic_graphics_state.vi_binding_strides[binding];
|
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++;
|
emitted_va_count++;
|
||||||
|
Reference in New Issue
Block a user