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:

committed by
Marge Bot

parent
98bb7e10e7
commit
506705bdeb
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user