diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index cb7cba167cb..bd7dbf4b01c 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1555,7 +1555,10 @@ struct anv_gfx_dynamic_state { /* 3DSTATE_PS_EXTRA */ struct { + bool PixelShaderIsPerSample; bool PixelShaderKillsPixel; + bool PixelShaderIsPerCoarsePixel; + bool EnablePSDependencyOnCPsizeChange; } ps_extra; /* 3DSTATE_PS_BLEND */ diff --git a/src/intel/vulkan/genX_gfx_state.c b/src/intel/vulkan/genX_gfx_state.c index 663c04d6f79..8a9011f1dd8 100644 --- a/src/intel/vulkan/genX_gfx_state.c +++ b/src/intel/vulkan/genX_gfx_state.c @@ -580,6 +580,19 @@ genX(cmd_buffer_flush_gfx_runtime_state)(struct anv_cmd_buffer *cmd_buffer) if ((gfx->dirty & ANV_CMD_DIRTY_PIPELINE) || (gfx->dirty & ANV_CMD_DIRTY_FS_MSAA_FLAGS)) { if (wm_prog_data) { + SET(PS_EXTRA, ps_extra.PixelShaderIsPerSample, + brw_wm_prog_data_is_persample(wm_prog_data, gfx->fs_msaa_flags)); +#if GFX_VER >= 11 + SET(PS_EXTRA, ps_extra.PixelShaderIsPerCoarsePixel, + brw_wm_prog_data_is_coarse(wm_prog_data, gfx->fs_msaa_flags)); +#endif +#if GFX_VERx10 >= 125 + /* TODO: We should only require this when the last geometry shader + * uses a fragment shading rate that is not constant. + */ + SET(PS_EXTRA, ps_extra.EnablePSDependencyOnCPsizeChange, + brw_wm_prog_data_is_coarse(wm_prog_data, gfx->fs_msaa_flags)); +#endif SET(WM, wm.BarycentricInterpolationMode, wm_prog_data_barycentric_modes(wm_prog_data, gfx->fs_msaa_flags)); } @@ -1644,6 +1657,13 @@ cmd_buffer_gfx_state_emission(struct anv_cmd_buffer *cmd_buffer) if (BITSET_TEST(hw_state->dirty, ANV_GFX_STATE_PS_EXTRA)) { anv_batch_emit_merge(&cmd_buffer->batch, GENX(3DSTATE_PS_EXTRA), pipeline, partial.ps_extra, pse) { + SET(pse, ps_extra, PixelShaderIsPerSample); +#if GFX_VER >= 11 + SET(pse, ps_extra, PixelShaderIsPerCoarsePixel); +#endif +#if GFX_VERx10 >= 125 + SET(pse, ps_extra, EnablePSDependencyOnCPsizeChange); +#endif SET(pse, ps_extra, PixelShaderKillsPixel); } } diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index c6865665016..7f19124f3af 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -1666,8 +1666,6 @@ emit_3dstate_ps_extra(struct anv_graphics_pipeline *pipeline, ps.AttributeEnable = wm_prog_data->num_varying_inputs > 0; #endif ps.oMaskPresenttoRenderTarget = wm_prog_data->uses_omask; - ps.PixelShaderIsPerSample = - brw_wm_prog_data_is_persample(wm_prog_data, pipeline->fs_msaa_flags); ps.PixelShaderComputedDepthMode = wm_prog_data->computed_depth_mode; ps.PixelShaderUsesSourceDepth = wm_prog_data->uses_src_depth; ps.PixelShaderUsesSourceW = wm_prog_data->uses_src_w; @@ -1693,15 +1691,6 @@ emit_3dstate_ps_extra(struct anv_graphics_pipeline *pipeline, #if GFX_VER >= 11 ps.PixelShaderRequiresSourceDepthandorWPlaneCoefficients = wm_prog_data->uses_depth_w_coefficients; - ps.PixelShaderIsPerCoarsePixel = - brw_wm_prog_data_is_coarse(wm_prog_data, pipeline->fs_msaa_flags); -#endif -#if GFX_VERx10 >= 125 - /* TODO: We should only require this when the last geometry shader uses - * a fragment shading rate that is not constant. - */ - ps.EnablePSDependencyOnCPsizeChange = - brw_wm_prog_data_is_coarse(wm_prog_data, pipeline->fs_msaa_flags); #endif } }