radv: add a mask of bound descriptor buffers for dynamic vertex input
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 8 Sep 2021 19:10:29 +0000 (15:10 -0400)
committerMarge Bot <eric+marge@anholt.net>
Wed, 13 Oct 2021 17:03:26 +0000 (17:03 +0000)
unnecessarily dereferencing the vertex buffer info array here causes a
ton of cpu overhead due to bad cache locality, so just use a mask to
avoid loading X more cachelines into memory unnecessarily

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13320>

src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_private.h

index b6d6c30..9857081 100644 (file)
@@ -4446,7 +4446,9 @@ radv_CmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBindi
          const uint32_t bit = 1u << idx;
          if (!buffer) {
             cmd_buffer->state.vbo_misaligned_mask &= ~bit;
+            cmd_buffer->state.vbo_bound_mask &= ~bit;
          } else {
+            cmd_buffer->state.vbo_bound_mask |= bit;
             if (pStrides && vb[idx].stride != stride) {
                if (stride & state->format_align_req_minus_1[idx])
                   cmd_buffer->state.vbo_misaligned_mask |= bit;
@@ -5483,15 +5485,16 @@ radv_CmdSetVertexInputEXT(VkCommandBuffer commandBuffer, uint32_t vertexBindingD
 
       if (chip == GFX6 || chip >= GFX10) {
          struct radv_vertex_binding *vb = cmd_buffer->vertex_bindings;
+         unsigned bit = 1u << loc;
          if (binding->stride & format_align_req_minus_1) {
-            state->misaligned_mask |= 1u << loc;
-            if (vb[attrib->binding].buffer)
-               cmd_buffer->state.vbo_misaligned_mask |= 1u << loc;
+            state->misaligned_mask |= bit;
+            if (cmd_buffer->state.vbo_bound_mask & bit)
+               cmd_buffer->state.vbo_misaligned_mask |= bit;
          } else {
-            state->possibly_misaligned_mask |= 1u << loc;
-            if (vb[attrib->binding].buffer &&
+            state->possibly_misaligned_mask |= bit;
+            if (cmd_buffer->state.vbo_bound_mask & bit &&
                 ((vb[attrib->binding].offset + state->offsets[loc]) & format_align_req_minus_1))
-               cmd_buffer->state.vbo_misaligned_mask |= 1u << loc;
+               cmd_buffer->state.vbo_misaligned_mask |= bit;
          }
       }
 
index 754881a..5d85260 100644 (file)
@@ -1432,6 +1432,7 @@ struct radv_cmd_state {
    uint32_t *emitted_vs_prolog_key;
    uint32_t emitted_vs_prolog_key_hash;
    uint32_t vbo_misaligned_mask;
+   uint32_t vbo_bound_mask;
 };
 
 struct radv_cmd_pool {