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] = \