Module: Mesa Branch: main Commit: 2d00b2b9c7d2a28d20732ad224ea326d6d3bc5b0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2d00b2b9c7d2a28d20732ad224ea326d6d3bc5b0
Author: Connor Abbott <[email protected]> Date: Tue Sep 12 13:06:27 2023 +0200 tu: Don't reference pipeline for some draw states These draw states are things that depend on pipeline-only state: - The load state depends on knowing the pipeline layout, which we won't know for a shader that's loaded from a binary. This is going away on a7xx anyway, and we should be able to use the a7xx strategy of prefetching the descriptors in the preamble on a6xx too. - The prim order state depends on feedback loops and raster order attachment access, which isn't supported at the moment. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25276> --- src/freedreno/vulkan/tu_cmd_buffer.cc | 16 ++++++++++------ src/freedreno/vulkan/tu_cmd_buffer.h | 3 +++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 05ad6d8a00c..4c5f3fdf2af 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -3013,6 +3013,7 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, cmd->state.compute_pipeline = tu_pipeline_to_compute(pipeline); tu_cs_emit_state_ib(&cmd->cs, pipeline->shaders[MESA_SHADER_COMPUTE]->state); + cmd->state.compute_load_state = pipeline->load_state; return; } @@ -3032,6 +3033,10 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, &cmd->state.pipeline->dynamic_state); cmd->state.program = pipeline->program; + cmd->state.load_state = pipeline->load_state; + cmd->state.prim_order_sysmem = pipeline->prim_order.state_sysmem; + cmd->state.prim_order_gmem = pipeline->prim_order.state_gmem; + if (cmd->state.pipeline->feedback_loop_may_involve_textures && !cmd->state.rp.disable_gmem) { /* VK_EXT_attachment_feedback_loop_layout allows feedback loop to involve @@ -4640,7 +4645,6 @@ tu6_draw_common(struct tu_cmd_buffer *cmd, /* note: draw_count is 0 for indirect */ uint32_t draw_count) { - const struct tu_pipeline *pipeline = &cmd->state.pipeline->base; const struct tu_program_state *program = &cmd->state.program; struct tu_render_pass_state *rp = &cmd->state.rp; @@ -4800,11 +4804,11 @@ tu6_draw_common(struct tu_cmd_buffer *cmd, tu_cs_emit_draw_state(cs, TU_DRAW_STATE_GS_BINNING, program->gs_binning_state); tu_cs_emit_draw_state(cs, TU_DRAW_STATE_FS, program->fs_state); tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VPC, program->vpc_state); - tu_cs_emit_draw_state(cs, TU_DRAW_STATE_PRIM_MODE_SYSMEM, pipeline->prim_order.state_sysmem); - tu_cs_emit_draw_state(cs, TU_DRAW_STATE_PRIM_MODE_GMEM, pipeline->prim_order.state_gmem); + tu_cs_emit_draw_state(cs, TU_DRAW_STATE_PRIM_MODE_SYSMEM, cmd->state.prim_order_sysmem); + tu_cs_emit_draw_state(cs, TU_DRAW_STATE_PRIM_MODE_GMEM, cmd->state.prim_order_gmem); tu_cs_emit_draw_state(cs, TU_DRAW_STATE_CONST, cmd->state.shader_const); tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS, cmd->state.desc_sets); - tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS_LOAD, pipeline->load_state); + tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS_LOAD, cmd->state.load_state); tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VB, cmd->state.vertex_buffers); tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VS_PARAMS, cmd->state.vs_params); tu_cs_emit_draw_state(cs, TU_DRAW_STATE_FS_PARAMS, cmd->state.fs_params); @@ -4834,7 +4838,7 @@ tu6_draw_common(struct tu_cmd_buffer *cmd, tu_cs_emit_draw_state(cs, TU_DRAW_STATE_CONST, cmd->state.shader_const); if (dirty & TU_CMD_DIRTY_DESC_SETS) { /* tu6_emit_descriptor_sets emitted the cmd->state.desc_sets draw state. */ - tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS_LOAD, pipeline->load_state); + tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS_LOAD, cmd->state.load_state); } if (dirty & TU_CMD_DIRTY_VERTEX_BUFFERS) tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VB, cmd->state.vertex_buffers); @@ -5513,7 +5517,7 @@ tu_dispatch(struct tu_cmd_buffer *cmd, if (cmd->state.dirty & TU_CMD_DIRTY_COMPUTE_DESC_SETS) { tu6_emit_descriptor_sets<CHIP>(cmd, VK_PIPELINE_BIND_POINT_COMPUTE); - tu_cs_emit_state_ib(cs, pipeline->base.load_state); + tu_cs_emit_state_ib(cs, cmd->state.compute_load_state); } cmd->state.dirty &= ~TU_CMD_DIRTY_COMPUTE_DESC_SETS; diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index 7b65065380c..6b99718a096 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -418,6 +418,9 @@ struct tu_cmd_state struct tu_draw_state vertex_buffers; struct tu_draw_state shader_const; struct tu_draw_state desc_sets; + struct tu_draw_state load_state; + struct tu_draw_state compute_load_state; + struct tu_draw_state prim_order_sysmem, prim_order_gmem; struct tu_draw_state vs_params; struct tu_draw_state fs_params;
