From df007dcfe7d357e442c1e23b3215ccfaf14d05f7 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Mon, 4 Sep 2023 19:58:36 +0200 Subject: [PATCH] tu: Start tracking shaders independently of pipeline We will gradually transition over users of cmd->state.pipeline and TU_CMD_DIRTY_PIPELINE to shaders and derived state from shaders. This just puts in place the framework to start doing that. When importing a library with all of the shader state, we now have to import the shaders in addition to the program, so that they are available when we bind the pipeline. Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.cc | 36 +++++++++++++++++++++++++++++++++++ src/freedreno/vulkan/tu_cmd_buffer.h | 2 ++ src/freedreno/vulkan/tu_pipeline.cc | 6 ++++++ 3 files changed, 44 insertions(+) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 58efdb9..e716837 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -2947,6 +2947,36 @@ tu_EndCommandBuffer(VkCommandBuffer commandBuffer) } TU_GENX(tu_EndCommandBuffer); +static void +tu_bind_vs(struct tu_cmd_buffer *cmd, struct tu_shader *vs) +{ + cmd->state.shaders[MESA_SHADER_VERTEX] = vs; +} + +static void +tu_bind_tcs(struct tu_cmd_buffer *cmd, struct tu_shader *tcs) +{ + cmd->state.shaders[MESA_SHADER_TESS_CTRL] = tcs; +} + +static void +tu_bind_tes(struct tu_cmd_buffer *cmd, struct tu_shader *tes) +{ + cmd->state.shaders[MESA_SHADER_TESS_EVAL] = tes; +} + +static void +tu_bind_gs(struct tu_cmd_buffer *cmd, struct tu_shader *gs) +{ + cmd->state.shaders[MESA_SHADER_GEOMETRY] = gs; +} + +static void +tu_bind_fs(struct tu_cmd_buffer *cmd, struct tu_shader *fs) +{ + cmd->state.shaders[MESA_SHADER_FRAGMENT] = fs; +} + VKAPI_ATTR void VKAPI_CALL tu_CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, @@ -2969,6 +2999,12 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, TU_CMD_DIRTY_VS_PARAMS | TU_CMD_DIRTY_LRZ | TU_CMD_DIRTY_PIPELINE; + tu_bind_vs(cmd, pipeline->shaders[MESA_SHADER_VERTEX]); + tu_bind_tcs(cmd, pipeline->shaders[MESA_SHADER_TESS_CTRL]); + tu_bind_tes(cmd, pipeline->shaders[MESA_SHADER_TESS_EVAL]); + tu_bind_gs(cmd, pipeline->shaders[MESA_SHADER_GEOMETRY]); + tu_bind_fs(cmd, pipeline->shaders[MESA_SHADER_FRAGMENT]); + vk_cmd_set_dynamic_graphics_state(&cmd->vk, &cmd->state.pipeline->dynamic_state); diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index d05040f..cd82e6d 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -387,6 +387,8 @@ struct tu_cmd_state struct tu_graphics_pipeline *pipeline; struct tu_compute_pipeline *compute_pipeline; + struct tu_shader *shaders[MESA_SHADER_STAGES]; + struct tu_render_pass_state rp; struct vk_render_pass_state vk_rp; diff --git a/src/freedreno/vulkan/tu_pipeline.cc b/src/freedreno/vulkan/tu_pipeline.cc index 21c94fa..d1be0cf 100644 --- a/src/freedreno/vulkan/tu_pipeline.cc +++ b/src/freedreno/vulkan/tu_pipeline.cc @@ -2208,6 +2208,12 @@ tu_pipeline_builder_parse_libraries(struct tu_pipeline_builder *builder, if (contains_all_shader_state(library->state)) { pipeline->program = library->base.program; pipeline->load_state = library->base.load_state; + for (unsigned i = 0; i < ARRAY_SIZE(pipeline->shaders); i++) { + if (library->base.shaders[i]) { + pipeline->shaders[i] = library->base.shaders[i]; + vk_pipeline_cache_object_ref(&pipeline->shaders[i]->base); + } + } } vk_graphics_pipeline_state_merge(&builder->graphics_state, -- 2.7.4