gallium/indices: implement prim-restart for line-loops
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Mon, 22 Jun 2020 16:38:03 +0000 (18:38 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 18 Aug 2020 12:12:27 +0000 (12:12 +0000)
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5976>

src/gallium/auxiliary/indices/u_indices_gen.py

index e2177c31614f9d3d0ac25752f7782f54c10a7dd8..ea53502f7024c056b0cf613ef353b80bad86ac95 100644 (file)
@@ -208,7 +208,7 @@ def preamble(intype, outtype, inpv, outpv, pr, prim):
 def postamble():
     print('}')
 
-def prim_restart(in_verts, out_verts, out_prims):
+def prim_restart(in_verts, out_verts, out_prims, close_func = None):
     print('restart:')
     print('      if (i + ' + str(in_verts) + ' > in_nr) {')
     for i in range(out_prims):
@@ -219,6 +219,10 @@ def prim_restart(in_verts, out_verts, out_prims):
     for i in range(in_verts):
         print('      if (in[i + ' + str(i) + '] == restart_index) {')
         print('         i += ' + str(i + 1) + ';')
+
+        if close_func is not None:
+            close_func(i)
+
         print('         goto restart;')
         print('      }')
 
@@ -245,10 +249,21 @@ def linestrip(intype, outtype, inpv, outpv, pr):
 
 def lineloop(intype, outtype, inpv, outpv, pr):
     preamble(intype, outtype, inpv, outpv, pr, prim='lineloop')
+    print('  unsigned end = start;')
     print('  for (i = start, j = 0; j < out_nr - 2; j+=2, i++) { ')
+    if pr == PRENABLE:
+        def close_func(index):
+            do_line( intype, outtype, 'out+j',  'end', 'start', inpv, outpv )
+            print('         start = i;')
+            print('         end = start;')
+            print('         j += 2;')
+
+        prim_restart(2, 2, 1, close_func)
+
     do_line( intype, outtype, 'out+j',  'i', 'i+1', inpv, outpv );
+    print('      end = i+1;')
     print('   }')
-    do_line( intype, outtype, 'out+j',  'i', 'start', inpv, outpv );
+    do_line( intype, outtype, 'out+j',  'end', 'start', inpv, outpv );
     postamble()
 
 def tris(intype, outtype, inpv, outpv, pr):