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

Author: Samuel Pitoiset <[email protected]>
Date:   Thu Aug  3 15:10:08 2023 +0200

radv: track if vertex binding stride is dynamic from the cmdbuf state

This allows us to remove one more pipeline occurence during cmdbuf
recording. Note that shader object always uses dynamic vertex input.

Signed-off-by: Samuel Pitoiset <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24473>

---

 src/amd/vulkan/radv_cmd_buffer.c | 9 +++++----
 src/amd/vulkan/radv_private.h    | 1 +
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 9096c060104..0a05fca05c9 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -3728,7 +3728,6 @@ lookup_vs_prolog(struct radv_cmd_buffer *cmd_buffer, 
const struct radv_shader *v
    STATIC_ASSERT(sizeof(union vs_prolog_key_header) == 4);
    assert(vs_shader->info.vs.dynamic_inputs);
 
-   const struct radv_graphics_pipeline *pipeline = 
cmd_buffer->state.graphics_pipeline;
    const struct radv_vs_input_state *state = 
&cmd_buffer->state.dynamic_vs_input;
    struct radv_device *device = cmd_buffer->device;
 
@@ -3752,10 +3751,10 @@ lookup_vs_prolog(struct radv_cmd_buffer *cmd_buffer, 
const struct radv_shader *v
          uint64_t vb_offset = cmd_buffer->vertex_bindings[binding].offset;
          uint64_t vb_stride;
 
-         if (pipeline->dynamic_states & 
(RADV_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE | RADV_DYNAMIC_VERTEX_INPUT)) {
+         if (cmd_buffer->state.uses_dynamic_vertex_binding_stride) {
             vb_stride = cmd_buffer->vertex_bindings[binding].stride;
          } else {
-            vb_stride = pipeline->binding_stride[binding];
+            vb_stride = 
cmd_buffer->state.graphics_pipeline->binding_stride[binding];
          }
 
          VkDeviceSize offset = vb_offset + state->offsets[index];
@@ -4886,7 +4885,7 @@ radv_write_vertex_descriptors(const struct 
radv_cmd_buffer *cmd_buffer, const st
                S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_UINT) | 
S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32);
       }
 
-      if (pipeline->dynamic_states & (RADV_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE 
| RADV_DYNAMIC_VERTEX_INPUT)) {
+      if (cmd_buffer->state.uses_dynamic_vertex_binding_stride) {
          stride = cmd_buffer->vertex_bindings[binding].stride;
       } else {
          stride = pipeline->binding_stride[binding];
@@ -6663,6 +6662,8 @@ radv_CmdBindPipeline(VkCommandBuffer commandBuffer, 
VkPipelineBindPoint pipeline
 
       cmd_buffer->state.uses_out_of_order_rast = 
graphics_pipeline->uses_out_of_order_rast;
       cmd_buffer->state.uses_vrs_attachment = 
graphics_pipeline->uses_vrs_attachment;
+      cmd_buffer->state.uses_dynamic_vertex_binding_stride =
+         !!(graphics_pipeline->dynamic_states & 
(RADV_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE | RADV_DYNAMIC_VERTEX_INPUT));
       break;
    }
    default:
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index ca8373dd367..9cc958898c3 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1759,6 +1759,7 @@ struct radv_cmd_state {
    bool uses_out_of_order_rast;
    bool uses_vrs_attachment;
    bool uses_dynamic_patch_control_points;
+   bool uses_dynamic_vertex_binding_stride;
 };
 
 struct radv_cmd_buffer_upload {

Reply via email to