diff --git a/src/gallium/drivers/radeonsi/si_shader_info.h b/src/gallium/drivers/radeonsi/si_shader_info.h index ee1c62f56f4..f1586bc8c1c 100644 --- a/src/gallium/drivers/radeonsi/si_shader_info.h +++ b/src/gallium/drivers/radeonsi/si_shader_info.h @@ -206,6 +206,7 @@ struct si_shader_variant_info { uint32_t vs_output_ps_input_cntl[NUM_TOTAL_VARYING_SLOTS]; union si_ps_input_info ps_inputs[SI_NUM_INTERP]; uint8_t num_ps_inputs; + uint8_t num_ps_per_primitive_inputs; uint8_t ps_colors_read; uint8_t num_input_sgprs; uint8_t num_input_vgprs; diff --git a/src/gallium/drivers/radeonsi/si_shader_variant_info.c b/src/gallium/drivers/radeonsi/si_shader_variant_info.c index 2e1a0a146c9..6985b9d15a0 100644 --- a/src/gallium/drivers/radeonsi/si_shader_variant_info.c +++ b/src/gallium/drivers/radeonsi/si_shader_variant_info.c @@ -25,6 +25,9 @@ void si_get_shader_variant_info(struct si_shader *shader, */ for (unsigned i = 0; i < ARRAY_SIZE(shader->info.ps_inputs); i++) shader->info.ps_inputs[i].interpolate = INTERP_MODE_FLAT; + + shader->info.num_ps_per_primitive_inputs = + util_bitcount64(nir->info.per_primitive_inputs); } nir_foreach_block(block, nir_shader_get_entrypoint(nir)) { @@ -50,6 +53,7 @@ void si_get_shader_variant_info(struct si_shader *shader, case nir_intrinsic_load_input: case nir_intrinsic_load_input_vertex: case nir_intrinsic_load_per_vertex_input: + case nir_intrinsic_load_per_primitive_input: case nir_intrinsic_load_interpolated_input: { if (nir->info.stage == MESA_SHADER_VERTEX) { shader->info.uses_vmem_load_other = true; @@ -78,6 +82,9 @@ void si_get_shader_variant_info(struct si_shader *shader, shader->info.ps_inputs[index].interpolate = INTERP_MODE_SMOOTH; if (intr->def.bit_size == 16) shader->info.ps_inputs[index].fp16_lo_hi_valid |= 0x1 << sem.high_16bits; + } else if (intr->intrinsic == nir_intrinsic_load_per_primitive_input) { + /* per primitive input from mesh shader */ + shader->info.ps_inputs[index].interpolate = INTERP_MODE_NONE; } } break; diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index b81633d9774..72264cc14f3 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -2249,7 +2249,18 @@ static void si_shader_ps(struct si_screen *sscreen, struct si_shader *shader) (sscreen->info.gfx_level == GFX11 && !shader->ps.num_interp && shader->config.lds_size); - shader->ps.spi_ps_in_control = S_0286D8_NUM_INTERP(shader->ps.num_interp) | + unsigned num_prim_interp = 0; + unsigned num_interp = shader->ps.num_interp; + if (sscreen->info.gfx_level == GFX10_3) { + /* NUM_INTERP / NUM_PRIM_INTERP separately contain + * the number of per-vertex and per-primitive PS input attributes. + */ + num_prim_interp = shader->info.num_ps_per_primitive_inputs; + num_interp -= num_prim_interp; + } + + shader->ps.spi_ps_in_control = S_0286D8_NUM_INTERP(num_interp) | + S_0286D8_NUM_PRIM_INTERP(num_prim_interp) | S_0286D8_PARAM_GEN(param_gen) | S_0286D8_PS_W32_EN(shader->wave_size == 32); }