From c327ab9e33695abb4e6cc5d0ca023a4d147c2fbf Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 3 Aug 2023 15:10:08 +0200 Subject: [PATCH] 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 Part-of: --- 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 {