summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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