Module: Mesa Branch: staging/23.1 Commit: bf4185481299dde19037e89b83f68ea8f00858c9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bf4185481299dde19037e89b83f68ea8f00858c9
Author: Alyssa Rosenzweig <[email protected]> Date: Wed Jul 19 08:02:22 2023 -0400 panfrost: Lower vertex_id for XFB Even on Valhall, vertex_id is zero-based in a transform feedback program. Lower that for transform feedback programs properly since it wouldn't happen automatically on Valhall. Fixes assertion fails. Fixes: 91ffd103510 ("pan/bi: Lower gl_VertexID in NIR") Signed-off-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24198> (cherry picked from commit 64ff2b3ed6d9c51c8087f865961e2684a170a5bc) --- .pick_status.json | 2 +- src/panfrost/util/pan_lower_xfb.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 751721b7afd..2821ed7e3f5 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1471,7 +1471,7 @@ "description": "panfrost: Lower vertex_id for XFB", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "91ffd1035105c2c04f4cc2687fb4f9ff63fb69a5" }, diff --git a/src/panfrost/util/pan_lower_xfb.c b/src/panfrost/util/pan_lower_xfb.c index 3876e60d1d3..56ddd323562 100644 --- a/src/panfrost/util/pan_lower_xfb.c +++ b/src/panfrost/util/pan_lower_xfb.c @@ -65,6 +65,20 @@ lower_xfb(nir_builder *b, nir_instr *instr, UNUSED void *data) return false; nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); + + /* In transform feedback programs, vertex ID becomes zero-based, so apply + * that lowering even on Valhall. + */ + if (intr->intrinsic == nir_intrinsic_load_vertex_id) { + b->cursor = nir_instr_remove(instr); + + nir_ssa_def *repl = + nir_iadd(b, nir_load_vertex_id_zero_base(b), nir_load_first_vertex(b)); + + nir_ssa_def_rewrite_uses(&intr->dest.ssa, repl); + return true; + } + if (intr->intrinsic != nir_intrinsic_store_output) return false;
