summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimur Kristóf <timur.kristof@gmail.com>2022-04-09 22:00:10 +0200
committerDylan Baker <dylan.c.baker@intel.com>2022-04-21 21:03:04 -0700
commit6ad668b626a81cec9406c0609da602756cf1f7b5 (patch)
treef177479bb298276c9ed78126f0879e5f0afb7089
parent9ff23e0dc7ee3e1fb8d5398abc016b222d01789b (diff)
radv: Fix gs_vgpr_comp_cnt for NGG VS without passthrough mode.
When not in passthrough mode, the NGG shader needs to calculate the primitive export value from the input primitive's vertex indices. So, GS vertex offset 2 is needed when NGG has triangles and isn't in passthrough mode. Fixes: 7ad69e2f7ee10c0e7afc302b9324e7a320424dcb "radv: stop loading invocation ID for NGG vertex shaders" Signed-off-by: Timur Kristóf <timur.kristof@gmail.com> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15837> (cherry picked from commit e02c71d6c53fda3fee295f93009c0e5f656e5f8b)
-rw-r--r--.pick_status.json2
-rw-r--r--src/amd/vulkan/radv_shader.c19
2 files changed, 15 insertions, 6 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 55797011c7d..f07139724f3 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -100,7 +100,7 @@
"description": "radv: Fix gs_vgpr_comp_cnt for NGG VS without passthrough mode.",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"because_sha": "7ad69e2f7ee10c0e7afc302b9324e7a320424dcb"
},
{
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 7ad3d75632b..9757ac32739 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -1568,18 +1568,27 @@ radv_postprocess_config(const struct radv_device *device, const struct ac_shader
unreachable("Unexpected ES shader stage");
}
- bool nggc = info->has_ngg_culling; /* Culling uses GS vertex offsets 0, 1, 2. */
- bool tes_triangles =
- stage == MESA_SHADER_TESS_EVAL && info->tes._primitive_mode != TESS_PRIMITIVE_ISOLINES;
+ /* GS vertex offsets in NGG:
+ * - in passthrough mode, they are all packed into VGPR0
+ * - in the default mode: VGPR0: offsets 0, 1; VGPR1: offsets 2, 3
+ *
+ * The vertex offset 2 is always needed when NGG isn't in passthrough mode
+ * and uses triangle input primitives, including with NGG culling.
+ */
+ bool need_gs_vtx_offset2 = !info->is_ngg_passthrough || info->gs.vertices_in >= 3;
+
+ if (stage == MESA_SHADER_TESS_EVAL)
+ need_gs_vtx_offset2 &= info->tes._primitive_mode != TESS_PRIMITIVE_ISOLINES;
+
if (info->uses_invocation_id) {
gs_vgpr_comp_cnt = 3; /* VGPR3 contains InvocationID. */
} else if (info->uses_prim_id || (es_stage == MESA_SHADER_VERTEX &&
info->vs.outinfo.export_prim_id)) {
gs_vgpr_comp_cnt = 2; /* VGPR2 contains PrimitiveID. */
- } else if (info->gs.vertices_in >= 3 || tes_triangles || nggc) {
+ } else if (need_gs_vtx_offset2) {
gs_vgpr_comp_cnt = 1; /* VGPR1 contains offsets 2, 3 */
} else {
- gs_vgpr_comp_cnt = 0; /* VGPR0 contains offsets 0, 1 */
+ gs_vgpr_comp_cnt = 0; /* VGPR0 contains offsets 0, 1 (or passthrough prim) */
}
/* Disable the WGP mode on gfx10.3 because it can hang. (it