From 5998a6543a6f3116b6c77ace4f9bcde382e90138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tapani=20P=C3=A4lli?= Date: Wed, 4 Nov 2020 11:11:41 +0200 Subject: [PATCH] anv: fix calculation of buffer size in case dynamic size is used MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit VK spec got clarification about the pSizes parameter. Fixes set of new tests: dEQP-VK.pipeline.extended_dynamic_state*with_offset* v2: move offset subtract to be part of size calculation (Jason) CC: mesa-stable Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3871 Fixes: b9a05447a19 ("anv: dynamic vertex input binding stride and size support") Signed-off-by: Tapani Pälli Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/genX_cmd_buffer.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 6fb09bba4d8..a9c49e0f592 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -3464,8 +3464,14 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer) if (buffer) { uint32_t stride = dynamic_stride ? cmd_buffer->state.vertex_bindings[vb].stride : pipeline->vb[vb].stride; - uint32_t size = dynamic_size ? - cmd_buffer->state.vertex_bindings[vb].size : buffer->size; + /* From the Vulkan spec (vkCmdBindVertexBuffers2EXT): + * + * "If pname:pSizes is not NULL then pname:pSizes[i] specifies + * the bound size of the vertex buffer starting from the corresponding + * elements of pname:pBuffers[i] plus pname:pOffsets[i]." + */ + UNUSED uint32_t size = dynamic_size ? + cmd_buffer->state.vertex_bindings[vb].size : buffer->size - offset; state = (struct GENX(VERTEX_BUFFER_STATE)) { .VertexBufferIndex = vb, @@ -3482,9 +3488,14 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer) .NullVertexBuffer = offset >= buffer->size, #if GEN_GEN >= 8 - .BufferSize = size - offset + .BufferSize = size, #else - .EndAddress = anv_address_add(buffer->address, size - 1), + /* XXX: to handle dynamic offset for older gens we might want + * to modify Endaddress, but there are issues when doing so: + * + * https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7439 + */ + .EndAddress = anv_address_add(buffer->address, buffer->size - 1), #endif }; } else {