mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 08:08:06 +02:00
radv: gather more information about PS in the shader info pass
To compute the PS SPI inputs. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13192>
This commit is contained in:
parent
5728a74ad2
commit
a8c471f962
2 changed files with 60 additions and 12 deletions
|
|
@ -300,8 +300,19 @@ struct radv_shader_info {
|
|||
bool early_fragment_test;
|
||||
bool post_depth_coverage;
|
||||
bool reads_sample_mask_in;
|
||||
bool reads_front_face;
|
||||
bool reads_sample_id;
|
||||
bool reads_frag_shading_rate;
|
||||
bool reads_barycentric_model;
|
||||
bool reads_persp_sample;
|
||||
bool reads_persp_center;
|
||||
bool reads_persp_centroid;
|
||||
bool reads_linear_sample;
|
||||
bool reads_linear_center;
|
||||
bool reads_linear_centroid;
|
||||
uint8_t reads_frag_coord_mask;
|
||||
uint8_t reads_sample_pos_mask;
|
||||
uint8_t depth_layout;
|
||||
bool uses_persp_or_linear_interp;
|
||||
bool allow_flat_shading;
|
||||
} ps;
|
||||
struct {
|
||||
|
|
|
|||
|
|
@ -130,27 +130,42 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
|
|||
switch (instr->intrinsic) {
|
||||
case nir_intrinsic_load_barycentric_sample:
|
||||
case nir_intrinsic_load_barycentric_pixel:
|
||||
case nir_intrinsic_load_barycentric_centroid: {
|
||||
case nir_intrinsic_load_barycentric_centroid:
|
||||
case nir_intrinsic_load_barycentric_at_sample:
|
||||
case nir_intrinsic_load_barycentric_at_offset: {
|
||||
enum glsl_interp_mode mode = nir_intrinsic_interp_mode(instr);
|
||||
switch (mode) {
|
||||
case INTERP_MODE_NONE:
|
||||
case INTERP_MODE_SMOOTH:
|
||||
case INTERP_MODE_NONE:
|
||||
if (instr->intrinsic == nir_intrinsic_load_barycentric_pixel ||
|
||||
instr->intrinsic == nir_intrinsic_load_barycentric_at_sample ||
|
||||
instr->intrinsic == nir_intrinsic_load_barycentric_at_offset)
|
||||
info->ps.reads_persp_center = true;
|
||||
else if (instr->intrinsic == nir_intrinsic_load_barycentric_centroid)
|
||||
info->ps.reads_persp_centroid = true;
|
||||
else if (instr->intrinsic == nir_intrinsic_load_barycentric_sample)
|
||||
info->ps.reads_persp_sample = true;
|
||||
break;
|
||||
case INTERP_MODE_NOPERSPECTIVE:
|
||||
info->ps.uses_persp_or_linear_interp = true;
|
||||
if (instr->intrinsic == nir_intrinsic_load_barycentric_pixel ||
|
||||
instr->intrinsic == nir_intrinsic_load_barycentric_at_sample ||
|
||||
instr->intrinsic == nir_intrinsic_load_barycentric_at_offset)
|
||||
info->ps.reads_linear_center = true;
|
||||
else if (instr->intrinsic == nir_intrinsic_load_barycentric_centroid)
|
||||
info->ps.reads_linear_centroid = true;
|
||||
else if (instr->intrinsic == nir_intrinsic_load_barycentric_sample)
|
||||
info->ps.reads_linear_sample = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case nir_intrinsic_load_barycentric_at_offset:
|
||||
case nir_intrinsic_load_barycentric_at_sample:
|
||||
if (nir_intrinsic_interp_mode(instr) != INTERP_MODE_FLAT)
|
||||
info->ps.uses_persp_or_linear_interp = true;
|
||||
|
||||
if (instr->intrinsic == nir_intrinsic_load_barycentric_at_sample)
|
||||
info->ps.needs_sample_positions = true;
|
||||
break;
|
||||
}
|
||||
case nir_intrinsic_load_barycentric_model:
|
||||
info->ps.reads_barycentric_model = true;
|
||||
break;
|
||||
case nir_intrinsic_load_draw_id:
|
||||
info->vs.needs_draw_id = true;
|
||||
break;
|
||||
|
|
@ -187,6 +202,21 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
|
|||
case nir_intrinsic_load_sample_mask_in:
|
||||
info->ps.reads_sample_mask_in = true;
|
||||
break;
|
||||
case nir_intrinsic_load_sample_id:
|
||||
info->ps.reads_sample_id = true;
|
||||
break;
|
||||
case nir_intrinsic_load_frag_shading_rate:
|
||||
info->ps.reads_frag_shading_rate = true;
|
||||
break;
|
||||
case nir_intrinsic_load_front_face:
|
||||
info->ps.reads_front_face = true;
|
||||
break;
|
||||
case nir_intrinsic_load_frag_coord:
|
||||
info->ps.reads_frag_coord_mask = nir_ssa_def_components_read(&instr->dest.ssa);
|
||||
break;
|
||||
case nir_intrinsic_load_sample_pos:
|
||||
info->ps.reads_sample_pos_mask = nir_ssa_def_components_read(&instr->dest.ssa);
|
||||
break;
|
||||
case nir_intrinsic_load_view_index:
|
||||
info->needs_multiview_view_index = true;
|
||||
if (nir->info.stage == MESA_SHADER_FRAGMENT)
|
||||
|
|
@ -725,8 +755,15 @@ radv_nir_shader_info_pass(struct radv_device *device, const struct nir_shader *n
|
|||
}
|
||||
|
||||
if (nir->info.stage == MESA_SHADER_FRAGMENT) {
|
||||
bool uses_persp_or_linear_interp = info->ps.reads_persp_center ||
|
||||
info->ps.reads_persp_centroid ||
|
||||
info->ps.reads_persp_sample ||
|
||||
info->ps.reads_linear_center ||
|
||||
info->ps.reads_linear_centroid ||
|
||||
info->ps.reads_linear_sample;
|
||||
|
||||
info->ps.allow_flat_shading =
|
||||
!(info->ps.uses_persp_or_linear_interp || info->ps.needs_sample_positions ||
|
||||
!(uses_persp_or_linear_interp || info->ps.needs_sample_positions ||
|
||||
info->ps.writes_memory || nir->info.fs.needs_quad_helper_invocations ||
|
||||
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_FRAG_COORD) ||
|
||||
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_POINT_COORD) ||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue