Mesa (main): anv: Handle vertex buffer sizes in anv_CmdBindVertexBuffers2

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 19 23:53:37 UTC 2022


Module: Mesa
Branch: main
Commit: 36417bd05b5d1fd1afb30d0941b7bf1352e3d610
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=36417bd05b5d1fd1afb30d0941b7bf1352e3d610

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Tue Jul  5 05:06:27 2022 -0500

anv: Handle vertex buffer sizes in anv_CmdBindVertexBuffers2

There's no good reason to defer figuring out the size until we emit the
packet.  We know everything when the bind happens.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17564>

---

 src/intel/vulkan/anv_cmd_buffer.c  | 23 +++++++++++++++--------
 src/intel/vulkan/anv_private.h     |  1 -
 src/intel/vulkan/genX_cmd_buffer.c | 10 +---------
 3 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c
index a83cc64a1ff..2cd579410f7 100644
--- a/src/intel/vulkan/anv_cmd_buffer.c
+++ b/src/intel/vulkan/anv_cmd_buffer.c
@@ -99,7 +99,6 @@ const struct anv_dynamic_state default_dynamic_state = {
    .depth_bounds_test_enable = 0,
    .stencil_test_enable = 0,
    .dyn_vbo_stride = 0,
-   .dyn_vbo_size = 0,
    .color_writes = 0xff,
    .raster_discard = 0,
    .depth_bias_enable = 0,
@@ -208,7 +207,6 @@ anv_dynamic_state_copy(struct anv_dynamic_state *dest,
    }
 
    ANV_CMP_COPY(dyn_vbo_stride, ANV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE);
-   ANV_CMP_COPY(dyn_vbo_size, ANV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE);
 
    ANV_CMP_COPY(raster_discard, ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE);
    ANV_CMP_COPY(depth_bias_enable, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE);
@@ -1183,17 +1181,26 @@ void anv_CmdBindVertexBuffers2(
    /* We have to defer setting up vertex buffer since we need the buffer
     * stride from the pipeline. */
 
-   if (pSizes)
-      cmd_buffer->state.gfx.dynamic.dyn_vbo_size = true;
    if (pStrides)
       cmd_buffer->state.gfx.dynamic.dyn_vbo_stride = true;
 
    assert(firstBinding + bindingCount <= MAX_VBS);
    for (uint32_t i = 0; i < bindingCount; i++) {
-      vb[firstBinding + i].buffer = anv_buffer_from_handle(pBuffers[i]);
-      vb[firstBinding + i].offset = pOffsets[i];
-      vb[firstBinding + i].size = pSizes ? pSizes[i] : 0;
-      vb[firstBinding + i].stride = pStrides ? pStrides[i] : 0;
+      ANV_FROM_HANDLE(anv_buffer, buffer, pBuffers[i]);
+
+      if (buffer == NULL) {
+         vb[firstBinding + i] = (struct anv_vertex_binding) {
+            .buffer = NULL,
+         };
+      } else {
+         vb[firstBinding + i] = (struct anv_vertex_binding) {
+            .buffer = buffer,
+            .offset = pOffsets[i],
+            .size = vk_buffer_range(&buffer->vk, pOffsets[i],
+                                    pSizes ? pSizes[i] : VK_WHOLE_SIZE),
+            .stride = pStrides ? pStrides[i] : 0,
+         };
+      }
       cmd_buffer->state.gfx.vb_dirty |= 1 << (firstBinding + i);
    }
 }
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index cb49745afdc..e65764b858e 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -2727,7 +2727,6 @@ struct anv_dynamic_state {
    bool                                         primitive_restart_enable;
    VkLogicOp                                    logic_op;
    bool                                         dyn_vbo_stride;
-   bool                                         dyn_vbo_size;
 
    /* Bitfield, one bit per render target */
    uint8_t                                      color_writes;
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index fa3dc036b99..db8247eb3b9 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -3761,20 +3761,12 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
           * stride/size that was setup in the pipeline object.
           */
          bool dynamic_stride = cmd_buffer->state.gfx.dynamic.dyn_vbo_stride;
-         bool dynamic_size = cmd_buffer->state.gfx.dynamic.dyn_vbo_size;
 
          struct GENX(VERTEX_BUFFER_STATE) state;
          if (buffer) {
             uint32_t stride = dynamic_stride ?
                cmd_buffer->state.vertex_bindings[vb].stride : pipeline->vb[vb].stride;
-            /* From the Vulkan spec (vkCmdBindVertexBuffers2):
-             *
-             * "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->vk.size - offset;
+            UNUSED uint32_t size = cmd_buffer->state.vertex_bindings[vb].size;
 
 #if GFX_VER <= 7
             bool per_instance = pipeline->vb[vb].instanced;



More information about the mesa-commit mailing list