diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index a37af9ab25b..d62e097956b 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -704,13 +704,6 @@ void anv_CmdBindPipeline( } } - if ((new_pipeline->fs_msaa_flags & INTEL_MSAA_FLAG_ENABLE_DYNAMIC) && - push->gfx.fs_msaa_flags != new_pipeline->fs_msaa_flags) { - push->gfx.fs_msaa_flags = new_pipeline->fs_msaa_flags; - cmd_buffer->state.push_constants_dirty |= VK_SHADER_STAGE_FRAGMENT_BIT; - state->push_constants_data_dirty = true; - } - anv_cmd_buffer_flush_pipeline_state(cmd_buffer, old_pipeline, new_pipeline); break; } diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index ec8db0f4e4c..ac5c3a3b6ea 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3157,6 +3157,7 @@ enum anv_cmd_dirty_bits { ANV_CMD_DIRTY_XFB_ENABLE = 1 << 4, ANV_CMD_DIRTY_RESTART_INDEX = 1 << 5, ANV_CMD_DIRTY_OCCLUSION_QUERY_ACTIVE = 1 << 6, + ANV_CMD_DIRTY_FS_MSAA_FLAGS = 1 << 7, }; typedef enum anv_cmd_dirty_bits anv_cmd_dirty_mask_t; @@ -3672,6 +3673,12 @@ struct anv_cmd_graphics_state { struct vk_vertex_input_state vertex_input; struct vk_sample_locations_state sample_locations; + /* Dynamic msaa flags, this value can be different from + * anv_push_constants::gfx::fs_msaa_flags, as the push constant value only + * needs to be updated for fragment shaders dynamically checking the value. + */ + enum intel_msaa_flags fs_msaa_flags; + bool object_preemption; bool has_uint_rt; diff --git a/src/intel/vulkan/genX_gfx_state.c b/src/intel/vulkan/genX_gfx_state.c index 294de3f5ef8..8c21ebb511d 100644 --- a/src/intel/vulkan/genX_gfx_state.c +++ b/src/intel/vulkan/genX_gfx_state.c @@ -520,6 +520,63 @@ genX(cmd_buffer_flush_gfx_runtime_state)(struct anv_cmd_buffer *cmd_buffer) unreachable("Invalid provoking vertex mode"); \ } \ + UNUSED bool fs_msaa_changed = false; + if ((gfx->dirty & ANV_CMD_DIRTY_PIPELINE) || + BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_MS_ALPHA_TO_COVERAGE_ENABLE) || + BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_MS_RASTERIZATION_SAMPLES) || + BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_FSR)) { + enum intel_msaa_flags fs_msaa_flags = 0; + + if (wm_prog_data) { + /* If we have any dynamic bits here, we might need to update the + * value in the push constant for the shader. + */ + if (wm_prog_data->coarse_pixel_dispatch == BRW_SOMETIMES || + wm_prog_data->persample_dispatch == BRW_SOMETIMES || + wm_prog_data->alpha_to_coverage == BRW_SOMETIMES) { + fs_msaa_flags = INTEL_MSAA_FLAG_ENABLE_DYNAMIC; + + if (dyn->ms.rasterization_samples > 1) { + fs_msaa_flags |= INTEL_MSAA_FLAG_MULTISAMPLE_FBO; + + if (wm_prog_data->sample_shading) { + assert(wm_prog_data->persample_dispatch != BRW_NEVER); + fs_msaa_flags |= INTEL_MSAA_FLAG_PERSAMPLE_DISPATCH; + } + if ((pipeline->sample_shading_enable && + (pipeline->min_sample_shading * dyn->ms.rasterization_samples) > 1) || + wm_prog_data->sample_shading) { + fs_msaa_flags |= INTEL_MSAA_FLAG_PERSAMPLE_DISPATCH | + INTEL_MSAA_FLAG_PERSAMPLE_INTERP; + } + } + + if (wm_prog_data->coarse_pixel_dispatch == BRW_SOMETIMES && + !(fs_msaa_flags & INTEL_MSAA_FLAG_PERSAMPLE_DISPATCH)) { + fs_msaa_flags |= INTEL_MSAA_FLAG_COARSE_PI_MSG | + INTEL_MSAA_FLAG_COARSE_RT_WRITES; + } + + if (wm_prog_data->alpha_to_coverage == BRW_SOMETIMES && + dyn->ms.alpha_to_coverage_enable) + fs_msaa_flags |= INTEL_MSAA_FLAG_ALPHA_TO_COVERAGE; + + /* Check the last push constant value and update */ + + if (gfx->base.push_constants.gfx.fs_msaa_flags != fs_msaa_flags) { + gfx->base.push_constants.gfx.fs_msaa_flags = fs_msaa_flags; + cmd_buffer->state.push_constants_dirty |= VK_SHADER_STAGE_FRAGMENT_BIT; + gfx->base.push_constants_data_dirty = true; + } + } + } + + if (fs_msaa_flags != gfx->fs_msaa_flags) { + gfx->fs_msaa_flags = fs_msaa_flags; + gfx->dirty |= ANV_CMD_DIRTY_FS_MSAA_FLAGS; + } + } + if ((gfx->dirty & (ANV_CMD_DIRTY_PIPELINE | ANV_CMD_DIRTY_XFB_ENABLE | ANV_CMD_DIRTY_OCCLUSION_QUERY_ACTIVE)) || @@ -600,10 +657,11 @@ genX(cmd_buffer_flush_gfx_runtime_state)(struct anv_cmd_buffer *cmd_buffer) #if GFX_VER >= 11 if (cmd_buffer->device->vk.enabled_extensions.KHR_fragment_shading_rate && - (gfx->dirty & ANV_CMD_DIRTY_PIPELINE || + ((gfx->dirty & ANV_CMD_DIRTY_PIPELINE) || + (gfx->dirty & ANV_CMD_DIRTY_FS_MSAA_FLAGS) || BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_FSR))) { const bool cps_enable = wm_prog_data && - brw_wm_prog_data_is_coarse(wm_prog_data, pipeline->fs_msaa_flags); + brw_wm_prog_data_is_coarse(wm_prog_data, gfx->fs_msaa_flags); #if GFX_VER == 11 SET(CPS, cps.CoarsePixelShadingMode, cps_enable ? CPS_MODE_CONSTANT : CPS_MODE_NONE);