From 6ad668b626a81cec9406c0609da602756cf1f7b5 Mon Sep 17 00:00:00 2001 From: Timur Kristóf Date: Sat, 9 Apr 2022 22:00:10 +0200 Subject: radv: Fix gs_vgpr_comp_cnt for NGG VS without passthrough mode. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Samuel Pitoiset Part-of: (cherry picked from commit e02c71d6c53fda3fee295f93009c0e5f656e5f8b) --- .pick_status.json | 2 +- src/amd/vulkan/radv_shader.c | 19 ++++++++++++++----- 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 -- cgit v1.2.3