gallium/auxiliary/indices: consistently apply start only to input
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Wed, 17 Jul 2019 08:21:08 +0000 (10:21 +0200)
committerErik Faye-Lund <erik.faye-lund@collabora.com>
Sat, 31 Aug 2019 19:45:52 +0000 (19:45 +0000)
The majority of these only apply the start argument to the input, but a
few of them also does for the output-array. util_primconvert, the only
user of this argument expects this pass a non-zero start-argument does
not expect this to be applied to the output; if it is, it will write
outside of allocated memory, leading to VRAM corruption.

The reason this doesn't seem to have been noticed before, is that no
driver currently use util_primconvert to convert a primitive-type to
itself, which is the cases where this was broken. But for Zink, this
will no longer be true, because we need to eliminate the use of 8-bit
index-buffers.

Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Fixes: 28f3f8d413f ("gallium/auxiliary/indices: add start param")
Reviewed-by: Rob Clark <robdclark@chromium.org>
src/gallium/auxiliary/indices/u_indices_gen.py

index 2d9297854c5741c09e6418d40ab23bba9577ebc6..498878746d26ccdd314fcbdb6779c552ed489918 100644 (file)
@@ -211,15 +211,15 @@ def postamble():
 
 def points(intype, outtype, inpv, outpv, pr):
     preamble(intype, outtype, inpv, outpv, pr, prim='points')
-    print('  for (i = start; i < (out_nr+start); i++) { ')
-    do_point( intype, outtype, 'out+i',  'i' );
+    print('  for (i = start, j = 0; j < out_nr; j++, i++) { ')
+    do_point( intype, outtype, 'out+j',  'i' );
     print('   }')
     postamble()
 
 def lines(intype, outtype, inpv, outpv, pr):
     preamble(intype, outtype, inpv, outpv, pr, prim='lines')
-    print('  for (i = start; i < (out_nr+start); i+=2) { ')
-    do_line( intype, outtype, 'out+i',  'i', 'i+1', inpv, outpv );
+    print('  for (i = start, j = 0; j < out_nr; j+=2, i+=2) { ')
+    do_line( intype, outtype, 'out+j',  'i', 'i+1', inpv, outpv );
     print('   }')
     postamble()
 
@@ -240,8 +240,8 @@ def lineloop(intype, outtype, inpv, outpv, pr):
 
 def tris(intype, outtype, inpv, outpv, pr):
     preamble(intype, outtype, inpv, outpv, pr, prim='tris')
-    print('  for (i = start; i < (out_nr+start); i+=3) { ')
-    do_tri( intype, outtype, 'out+i',  'i', 'i+1', 'i+2', inpv, outpv );
+    print('  for (i = start, j = 0; j < out_nr; j+=3, i+=3) { ')
+    do_tri( intype, outtype, 'out+j',  'i', 'i+1', 'i+2', inpv, outpv );
     print('   }')
     postamble()
 
@@ -377,8 +377,8 @@ def quadstrip(intype, outtype, inpv, outpv, pr):
 
 def linesadj(intype, outtype, inpv, outpv, pr):
     preamble(intype, outtype, inpv, outpv, pr, prim='linesadj')
-    print('  for (i = start; i < (out_nr+start); i+=4) { ')
-    do_lineadj( intype, outtype, 'out+i',  'i+0', 'i+1', 'i+2', 'i+3', inpv, outpv )
+    print('  for (i = start, j = 0; j < out_nr; j+=4, i+=4) { ')
+    do_lineadj( intype, outtype, 'out+j',  'i+0', 'i+1', 'i+2', 'i+3', inpv, outpv )
     print('  }')
     postamble()
 
@@ -393,8 +393,8 @@ def linestripadj(intype, outtype, inpv, outpv, pr):
 
 def trisadj(intype, outtype, inpv, outpv, pr):
     preamble(intype, outtype, inpv, outpv, pr, prim='trisadj')
-    print('  for (i = start; i < (out_nr+start); i+=6) { ')
-    do_triadj( intype, outtype, 'out+i',  'i+0', 'i+1', 'i+2', 'i+3',
+    print('  for (i = start, j = 0; j < out_nr; j+=6, i+=6) { ')
+    do_triadj( intype, outtype, 'out+j',  'i+0', 'i+1', 'i+2', 'i+3',
                'i+4', 'i+5', inpv, outpv )
     print('  }')
     postamble()