radv: add support for nir_intrinsic_load_rasterization_primitive_amd

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16742>
This commit is contained in:
Samuel Pitoiset
2023-05-31 16:31:15 +02:00
committed by Marge Bot
parent 98bb7e10e7
commit 506705bdeb
5 changed files with 18 additions and 1 deletions

View File

@@ -478,6 +478,11 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
case nir_intrinsic_load_provoking_vtx_amd:
replacement = ac_nir_load_arg(b, &s->args->ac, s->args->ac.load_provoking_vtx);
break;
case nir_intrinsic_load_rasterization_primitive_amd:
assert(s->pl_key->unknown_rast_prim);
/* Load the primitive topology from an user SGPR when it's unknown at compile time (GPL). */
replacement = GET_SGPR_FIELD_NIR(s->args->ps_state, PS_STATE_RAST_PRIM);
break;
default:
progress = false;
break;

View File

@@ -9085,10 +9085,12 @@ radv_emit_fs_state(struct radv_cmd_buffer *cmd_buffer)
const unsigned rasterization_samples = radv_get_rasterization_samples(cmd_buffer);
const unsigned ps_iter_samples = radv_get_ps_iter_samples(cmd_buffer);
const uint16_t ps_iter_mask = ac_get_ps_iter_mask(ps_iter_samples);
const unsigned rast_prim = radv_get_rasterization_prim(cmd_buffer);
const uint32_t base_reg = ps->info.user_data_0;
const unsigned ps_state = SET_SGPR_FIELD(PS_STATE_NUM_SAMPLES, rasterization_samples) |
SET_SGPR_FIELD(PS_STATE_PS_ITER_MASK, ps_iter_mask) |
SET_SGPR_FIELD(PS_STATE_LINE_RAST_MODE, d->vk.rs.line.mode);
SET_SGPR_FIELD(PS_STATE_LINE_RAST_MODE, d->vk.rs.line.mode) |
SET_SGPR_FIELD(PS_STATE_RAST_PRIM, rast_prim);
radeon_set_sh_reg(cmd_buffer->cs, base_reg + loc->sgpr_idx * 4, ps_state);
}

View File

@@ -197,6 +197,8 @@ enum radv_ud_index {
#define PS_STATE_LINE_RAST_MODE__MASK 0x3
#define PS_STATE_PS_ITER_MASK__SHIFT 6
#define PS_STATE_PS_ITER_MASK__MASK 0xffff
#define PS_STATE_RAST_PRIM__SHIFT 22
#define PS_STATE_RAST_PRIM__MASK 0x3
struct radv_streamout_info {
uint16_t num_outputs;
@@ -372,6 +374,7 @@ struct radv_shader_info {
unsigned spi_shader_col_format;
uint8_t color0_written;
bool load_provoking_vtx;
bool load_rasterization_prim;
} ps;
struct {
bool uses_grid_size;

View File

@@ -360,6 +360,10 @@ radv_ps_needs_state_sgpr(const struct radv_shader_info *info, const struct radv_
(info->ps.uses_sample_shading || key->ps.sample_shading_enable))
return true;
/* For computing barycentrics when the primitive topology is unknown at compile time (GPL). */
if (info->ps.load_rasterization_prim && key->unknown_rast_prim)
return true;
return false;
}

View File

@@ -173,6 +173,9 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
case nir_intrinsic_load_provoking_vtx_amd:
info->ps.load_provoking_vtx = true;
break;
case nir_intrinsic_load_rasterization_primitive_amd:
info->ps.load_rasterization_prim = true;
break;
case nir_intrinsic_load_local_invocation_id:
case nir_intrinsic_load_workgroup_id: {
unsigned mask = nir_ssa_def_components_read(&instr->dest.ssa);