intel/fs: Make per-sample and coarse dispatch tri-state
Whenever one of them is BRW_SOMETIMES, we depend on dynamic flag pushed in as a push constant. In this case, we have to often have to do the calculation both ways and SEL the result. It's a bit more code but decouples MSAA from the shader key. Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21094>
This commit is contained in:
committed by
Marge Bot
parent
43ca7f4178
commit
d8dfd153c5
@@ -1526,7 +1526,8 @@ emit_3dstate_ps(struct anv_graphics_pipeline *pipeline,
|
||||
|
||||
anv_batch_emit(&pipeline->base.batch, GENX(3DSTATE_PS), ps) {
|
||||
intel_set_ps_dispatch_state(&ps, devinfo, wm_prog_data,
|
||||
ms != NULL ? ms->rasterization_samples : 1);
|
||||
ms != NULL ? ms->rasterization_samples : 1,
|
||||
0 /* msaa_flags */);
|
||||
|
||||
ps.KernelStartPointer0 = fs_bin->kernel.offset +
|
||||
brw_wm_prog_data_prog_offset(wm_prog_data, ps, 0);
|
||||
@@ -1581,7 +1582,8 @@ emit_3dstate_ps_extra(struct anv_graphics_pipeline *pipeline,
|
||||
ps.PixelShaderValid = true;
|
||||
ps.AttributeEnable = wm_prog_data->num_varying_inputs > 0;
|
||||
ps.oMaskPresenttoRenderTarget = wm_prog_data->uses_omask;
|
||||
ps.PixelShaderIsPerSample = wm_prog_data->persample_dispatch;
|
||||
ps.PixelShaderIsPerSample =
|
||||
brw_wm_prog_data_is_persample(wm_prog_data, 0);
|
||||
ps.PixelShaderComputedDepthMode = wm_prog_data->computed_depth_mode;
|
||||
ps.PixelShaderUsesSourceDepth = wm_prog_data->uses_src_depth;
|
||||
ps.PixelShaderUsesSourceW = wm_prog_data->uses_src_w;
|
||||
@@ -1603,7 +1605,7 @@ emit_3dstate_ps_extra(struct anv_graphics_pipeline *pipeline,
|
||||
assert(!wm_prog_data->inner_coverage); /* Not available in SPIR-V */
|
||||
if (!wm_prog_data->uses_sample_mask)
|
||||
ps.InputCoverageMaskState = ICMS_NONE;
|
||||
else if (wm_prog_data->per_coarse_pixel_dispatch)
|
||||
else if (brw_wm_prog_data_is_coarse(wm_prog_data, 0))
|
||||
ps.InputCoverageMaskState = ICMS_NORMAL;
|
||||
else if (wm_prog_data->post_depth_coverage)
|
||||
ps.InputCoverageMaskState = ICMS_DEPTH_COVERAGE;
|
||||
@@ -1613,13 +1615,14 @@ emit_3dstate_ps_extra(struct anv_graphics_pipeline *pipeline,
|
||||
#if GFX_VER >= 11
|
||||
ps.PixelShaderRequiresSourceDepthandorWPlaneCoefficients =
|
||||
wm_prog_data->uses_depth_w_coefficients;
|
||||
ps.PixelShaderIsPerCoarsePixel = wm_prog_data->per_coarse_pixel_dispatch;
|
||||
ps.PixelShaderIsPerCoarsePixel = wm_prog_data->coarse_pixel_dispatch;
|
||||
#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 = wm_prog_data->per_coarse_pixel_dispatch;
|
||||
ps.EnablePSDependencyOnCPsizeChange =
|
||||
brw_wm_prog_data_is_coarse(wm_prog_data, 0);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -315,7 +315,8 @@ genX(emit_shading_rate)(struct anv_batch *batch,
|
||||
const struct vk_fragment_shading_rate_state *fsr)
|
||||
{
|
||||
const struct brw_wm_prog_data *wm_prog_data = get_wm_prog_data(pipeline);
|
||||
const bool cps_enable = wm_prog_data && wm_prog_data->per_coarse_pixel_dispatch;
|
||||
const bool cps_enable = wm_prog_data &&
|
||||
brw_wm_prog_data_is_coarse(wm_prog_data, 0);
|
||||
|
||||
#if GFX_VER == 11
|
||||
anv_batch_emit(batch, GENX(3DSTATE_CPS), cps) {
|
||||
|
||||
Reference in New Issue
Block a user