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;
 

Reply via email to