mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-02 11:40:10 +01:00
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:
parent
ef01a9cf3b
commit
5489033fa8
6 changed files with 49 additions and 17 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue