intel/compiler: make uses_pos_offset a tri-state

This value depends on the per-sample value which can be unknown at
compile time with graphics pipeline libraries. So we need to have this
dynamic has well and pick the right value when generating the
3DSTATE_PS/3DSTATE_WM packet.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: d8dfd153c5 ("intel/fs: Make per-sample and coarse dispatch tri-state")
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22728>
This commit is contained in:
Lionel Landwerlin 2023-04-26 16:44:51 +03:00 committed by Marge Bot
parent ef01a9cf3b
commit 5489033fa8
6 changed files with 49 additions and 17 deletions

View file

@ -6505,7 +6505,9 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
* look useful at the moment. We might need this in future.
*/
ps.PositionXYOffsetSelect =
wm_prog_data->uses_pos_offset ? POSOFFSET_SAMPLE : POSOFFSET_NONE;
brw_wm_prog_data_uses_position_xy_offset(wm_prog_data,
0 /* msaa_flags */) ?
POSOFFSET_SAMPLE : POSOFFSET_NONE;
if (wm_prog_data->base.total_scratch) {
struct crocus_bo *bo = crocus_get_scratch_space(ice, wm_prog_data->base.total_scratch, MESA_SHADER_FRAGMENT);
@ -7272,10 +7274,10 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
* We only require XY sample offsets. So, this recommendation doesn't
* look useful at the moment. We might need this in future.
*/
if (wm_prog_data->uses_pos_offset)
wm.PositionXYOffsetSelect = POSOFFSET_SAMPLE;
else
wm.PositionXYOffsetSelect = POSOFFSET_NONE;
wm.PositionXYOffsetSelect =
brw_wm_prog_data_uses_position_xy_offset(wm_prog_data,
0 /* msaa_flags */) ?
POSOFFSET_SAMPLE : POSOFFSET_NONE;
#endif
wm.LineStippleEnable = cso->cso.line_stipple_enable;
wm.PolygonStippleEnable = cso->cso.poly_stipple_enable;

View file

@ -4936,7 +4936,9 @@ iris_store_fs_state(const struct intel_device_info *devinfo,
* look useful at the moment. We might need this in future.
*/
ps.PositionXYOffsetSelect =
wm_prog_data->uses_pos_offset ? POSOFFSET_SAMPLE : POSOFFSET_NONE;
brw_wm_prog_data_uses_position_xy_offset(wm_prog_data,
0 /* msaa_flags */) ?
POSOFFSET_SAMPLE : POSOFFSET_NONE;
if (prog_data->total_scratch) {
INIT_THREAD_SCRATCH_SIZE(ps);

View file

@ -923,7 +923,8 @@ struct brw_wm_prog_data {
bool dispatch_16;
bool dispatch_32;
bool dual_src_blend;
bool uses_pos_offset;
enum brw_sometimes uses_pos_offset;
bool read_pos_offset_input;
bool uses_omask;
bool uses_kill;
bool uses_src_depth;
@ -1186,6 +1187,25 @@ brw_wm_prog_data_is_coarse(const struct brw_wm_prog_data *prog_data,
return prog_data->coarse_pixel_dispatch;
}
static inline bool
brw_wm_prog_data_uses_position_xy_offset(const struct brw_wm_prog_data *prog_data,
enum brw_wm_msaa_flags pushed_msaa_flags)
{
bool per_sample;
if (pushed_msaa_flags & BRW_WM_MSAA_FLAG_ENABLE_DYNAMIC) {
per_sample = (pushed_msaa_flags & BRW_WM_MSAA_FLAG_PERSAMPLE_INTERP) != 0;
} else {
assert(prog_data->persample_dispatch == BRW_ALWAYS ||
prog_data->persample_dispatch == BRW_NEVER);
per_sample = prog_data->persample_dispatch == BRW_ALWAYS;
}
if (!per_sample)
return false;
return prog_data->read_pos_offset_input;
}
struct brw_push_const_block {
unsigned dwords; /* Dword count, not reg aligned */
unsigned regs;

View file

@ -7365,12 +7365,16 @@ brw_nir_populate_wm_prog_data(const nir_shader *shader,
* per-sample dispatch. If we need gl_SamplePosition and we don't have
* persample dispatch, we hard-code it to 0.5.
*/
prog_data->uses_pos_offset =
prog_data->persample_dispatch != BRW_NEVER &&
(BITSET_TEST(shader->info.system_values_read,
SYSTEM_VALUE_SAMPLE_POS) ||
BITSET_TEST(shader->info.system_values_read,
SYSTEM_VALUE_SAMPLE_POS_OR_CENTER));
prog_data->read_pos_offset_input =
BITSET_TEST(shader->info.system_values_read,
SYSTEM_VALUE_SAMPLE_POS) ||
BITSET_TEST(shader->info.system_values_read,
SYSTEM_VALUE_SAMPLE_POS_OR_CENTER);
if (prog_data->read_pos_offset_input)
prog_data->uses_pos_offset = prog_data->persample_dispatch;
else
prog_data->uses_pos_offset = BRW_NEVER;
}
prog_data->has_render_target_reads = shader->info.outputs_read != 0ull;

View file

@ -1535,8 +1535,10 @@ emit_3dstate_ps(struct anv_graphics_pipeline *pipeline,
ps.PushConstantEnable = wm_prog_data->base.nr_params > 0 ||
wm_prog_data->base.ubo_ranges[0].length;
ps.PositionXYOffsetSelect =
!wm_prog_data->uses_pos_offset ? POSOFFSET_NONE :
persample ? POSOFFSET_SAMPLE : POSOFFSET_CENTROID;
!brw_wm_prog_data_uses_position_xy_offset(wm_prog_data,
pipeline->fs_msaa_flags) ?
POSOFFSET_NONE :
(persample ? POSOFFSET_SAMPLE : POSOFFSET_CENTROID);
ps.MaximumNumberofThreadsPerPSD = devinfo->max_threads_per_psd - 1;

View file

@ -1695,8 +1695,10 @@ emit_3dstate_ps(struct anv_graphics_pipeline *pipeline,
ps.BindingTableEntryCount = fs_bin->bind_map.surface_count;
ps.PushConstantEnable = wm_prog_data->base.nr_params > 0 ||
wm_prog_data->base.ubo_ranges[0].length;
ps.PositionXYOffsetSelect = wm_prog_data->uses_pos_offset ?
POSOFFSET_SAMPLE: POSOFFSET_NONE;
ps.PositionXYOffsetSelect =
brw_wm_prog_data_uses_position_xy_offset(wm_prog_data,
0 /* msaa_flags */) ?
POSOFFSET_SAMPLE : POSOFFSET_NONE;
#if GFX_VER < 8
ps.AttributeEnable = wm_prog_data->num_varying_inputs > 0;
ps.oMaskPresenttoRenderTarget = wm_prog_data->uses_omask;