Mesa (main): radv: gather more information about PS in the shader info pass
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Oct 8 12:48:42 UTC 2021
Module: Mesa
Branch: main
Commit: a8c471f962e3a86f0cb6a91f14090b0c8cfb73ff
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a8c471f962e3a86f0cb6a91f14090b0c8cfb73ff
Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date: Mon Oct 4 18:37:15 2021 +0200
radv: gather more information about PS in the shader info pass
To compute the PS SPI inputs.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13192>
---
src/amd/vulkan/radv_shader.h | 13 ++++++++-
src/amd/vulkan/radv_shader_info.c | 59 +++++++++++++++++++++++++++++++--------
2 files changed, 60 insertions(+), 12 deletions(-)
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 4657ee6235c..dc7f4b2e72c 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -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 {
diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c
index 5a3e5f12b12..a29d089069c 100644
--- a/src/amd/vulkan/radv_shader_info.c
+++ b/src/amd/vulkan/radv_shader_info.c
@@ -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) ||
More information about the mesa-commit
mailing list