From 60843bc806ac604ace363d7132e679f7991d922d Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Tue, 25 Mar 2025 10:48:41 -0400 Subject: [PATCH] tu: Re-emit viewports/scissors when has_fdm changes This shouldn't matter if FDM is actually enabled, because in that case the pipeline must enable the bit and we dirty FDM state at the beginning, but pipelines can enable FDM even if the renderpass they're used in doesn't use FDM and in that case we still need to use the FDM path to duplicate the viewports. Fix the case where a different pipeline is bound that enables FDM without actually using FDM. Cc: mesa-stable Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.cc | 7 +++++++ src/freedreno/vulkan/tu_cmd_buffer.h | 1 + src/freedreno/vulkan/tu_pipeline.cc | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index f54fe7b65fd..c516df260e5 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -4397,6 +4397,13 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, u_foreach_bit(i, pipeline->set_state_mask) cmd->state.dynamic_state[i] = pipeline->dynamic_state[i]; + if (pipeline->shaders[MESA_SHADER_FRAGMENT]->fs.has_fdm != + cmd->state.has_fdm) { + cmd->state.dirty |= TU_CMD_DIRTY_FDM; + cmd->state.has_fdm = + pipeline->shaders[MESA_SHADER_FRAGMENT]->fs.has_fdm; + } + if (pipeline->program.per_view_viewport != cmd->state.per_view_viewport) { cmd->state.per_view_viewport = pipeline->program.per_view_viewport; cmd->state.dirty |= TU_CMD_DIRTY_PER_VIEW_VIEWPORT; diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index f6a2e02fa68..1d8d3290b6e 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -444,6 +444,7 @@ struct tu_cmd_state uint32_t max_vbs_bound; + bool has_fdm; bool per_view_viewport; /* saved states to re-emit in TU_CMD_DIRTY_DRAW_STATE case */ diff --git a/src/freedreno/vulkan/tu_pipeline.cc b/src/freedreno/vulkan/tu_pipeline.cc index a192c16b5bd..99d55364d50 100644 --- a/src/freedreno/vulkan/tu_pipeline.cc +++ b/src/freedreno/vulkan/tu_pipeline.cc @@ -3895,7 +3895,7 @@ tu_emit_draw_state(struct tu_cmd_buffer *cmd) (TU_CMD_DIRTY_FDM | \ TU_CMD_DIRTY_PER_VIEW_VIEWPORT))) && \ !(cmd->state.pipeline_draw_states & (1u << id))) { \ - if (cmd->state.shaders[MESA_SHADER_FRAGMENT]->fs.has_fdm) { \ + if (cmd->state.has_fdm) { \ tu_cs_set_writeable(&cmd->sub_cs, true); \ tu6_emit_##name##_fdm(&cs, cmd, __VA_ARGS__); \ cmd->state.dynamic_state[id] = \