[Mesa-dev] [PATCH] u_primconvert: add primitive restart support

Dave Airlie airlied at gmail.com
Tue Mar 17 19:13:25 PDT 2015


This add primitive restart support to the prim conversion.

This involves changing the API for the translate functions
as we need to pass the prim restart index and the original
number of indices into the translate functions.

primitive restart is support for quads, quad strips
and polygons.

This deal with the case where the actual number of output
primitives is less than the initially calculated number,
by filling the rest of the output primitives with the restart
index, the other option is to reduce the output prim number,
but that will make the generator code a bit messier.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/gallium/auxiliary/indices/u_indices.c          |  36 ++--
 src/gallium/auxiliary/indices/u_indices.h          |   8 +-
 src/gallium/auxiliary/indices/u_indices_gen.py     | 198 +++++++++++++++------
 src/gallium/auxiliary/indices/u_primconvert.c      |   6 +-
 src/gallium/auxiliary/indices/u_unfilled_gen.py    |  20 ++-
 src/gallium/auxiliary/indices/u_unfilled_indices.c |  18 +-
 src/gallium/drivers/svga/svga_draw_elements.c      |   3 +-
 7 files changed, 202 insertions(+), 87 deletions(-)

diff --git a/src/gallium/auxiliary/indices/u_indices.c b/src/gallium/auxiliary/indices/u_indices.c
index 1b33f41..b20337f 100644
--- a/src/gallium/auxiliary/indices/u_indices.c
+++ b/src/gallium/auxiliary/indices/u_indices.c
@@ -27,18 +27,22 @@
 
 static void translate_memcpy_ushort( const void *in,
                                      unsigned start,
-                                     unsigned nr,
+                                     unsigned in_nr,
+                                     unsigned out_nr,
+                                     unsigned prim_restart_idx,
                                      void *out )
 {
-   memcpy(out, &((short *)in)[start], nr*sizeof(short));
+   memcpy(out, &((short *)in)[start], out_nr*sizeof(short));
 }
                               
 static void translate_memcpy_uint( const void *in,
                                    unsigned start,
-                                   unsigned nr,
+                                   unsigned in_nr,
+                                   unsigned out_nr,
+                                   unsigned prim_restart_idx,
                                    void *out )
 {
-   memcpy(out, &((int *)in)[start], nr*sizeof(int));
+   memcpy(out, &((int *)in)[start], out_nr*sizeof(int));
 }
                               
 
@@ -58,6 +62,7 @@ static void translate_memcpy_uint( const void *in,
  * \param nr  number of incoming vertices
  * \param in_pv  incoming provoking vertex convention (PV_FIRST or PV_LAST)
  * \param out_pv  desired provoking vertex convention (PV_FIRST or PV_LAST)
+ * \param prim_restart  whether primitive restart is disable or enabled
  * \param out_prim  returns new PIPE_PRIM_x we'll translate to
  * \param out_index_size  returns bytes per new index value (2 or 4)
  * \param out_nr  returns number of new vertices
@@ -69,6 +74,7 @@ int u_index_translator( unsigned hw_mask,
                         unsigned nr,
                         unsigned in_pv,
                         unsigned out_pv,
+                        unsigned prim_restart,
                         unsigned *out_prim,
                         unsigned *out_index_size,
                         unsigned *out_nr,
@@ -106,68 +112,68 @@ int u_index_translator( unsigned hw_mask,
    else {
       switch (prim) {
       case PIPE_PRIM_POINTS:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_POINTS;
          *out_nr = nr;
          break;
 
       case PIPE_PRIM_LINES:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_LINES;
          *out_nr = nr;
          break;
 
       case PIPE_PRIM_LINE_STRIP:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_LINES;
          *out_nr = (nr - 1) * 2;
          break;
 
       case PIPE_PRIM_LINE_LOOP:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_LINES;
          *out_nr = nr * 2;
          break;
 
       case PIPE_PRIM_TRIANGLES:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_TRIANGLES;
          *out_nr = nr;
          break;
 
       case PIPE_PRIM_TRIANGLE_STRIP:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_TRIANGLES;
          *out_nr = (nr - 2) * 3;
          break;
 
       case PIPE_PRIM_TRIANGLE_FAN:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_TRIANGLES;
          *out_nr = (nr - 2) * 3;
          break;
 
       case PIPE_PRIM_QUADS:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_TRIANGLES;
          *out_nr = (nr / 4) * 6;
          break;
 
       case PIPE_PRIM_QUAD_STRIP:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_TRIANGLES;
          *out_nr = (nr - 2) * 3;
          break;
 
       case PIPE_PRIM_POLYGON:
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_TRIANGLES;
          *out_nr = (nr - 2) * 3;
          break;
 
       default:
          assert(0);
-         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim];
+         *out_translate = translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim];
          *out_prim = PIPE_PRIM_POINTS;
          *out_nr = nr;
          return U_TRANSLATE_ERROR;
diff --git a/src/gallium/auxiliary/indices/u_indices.h b/src/gallium/auxiliary/indices/u_indices.h
index 54cd944..9b6b66d 100644
--- a/src/gallium/auxiliary/indices/u_indices.h
+++ b/src/gallium/auxiliary/indices/u_indices.h
@@ -31,6 +31,9 @@
 #define PV_LAST       1
 #define PV_COUNT      2
 
+#define PR_DISABLE 0
+#define PR_ENABLE 1
+#define PR_COUNT 2
 /**
  * Index translator function (for glDrawElements() case)
  *
@@ -42,7 +45,9 @@
  */
 typedef void (*u_translate_func)( const void *in,
                                   unsigned start,
-                                  unsigned nr,
+                                  unsigned in_nr,
+                                  unsigned out_nr,
+                                  unsigned prim_restart_idx,
                                   void *out );
 
 /**
@@ -77,6 +82,7 @@ int u_index_translator( unsigned hw_mask,
                         unsigned nr,
                         unsigned in_pv,   /* API */
                         unsigned out_pv,  /* hardware */
+                        unsigned prim_restart,
                         unsigned *out_prim,
                         unsigned *out_index_size,
                         unsigned *out_nr,
diff --git a/src/gallium/auxiliary/indices/u_indices_gen.py b/src/gallium/auxiliary/indices/u_indices_gen.py
index f05b70a..02075bd 100644
--- a/src/gallium/auxiliary/indices/u_indices_gen.py
+++ b/src/gallium/auxiliary/indices/u_indices_gen.py
@@ -27,10 +27,12 @@ copyright = '''
 
 GENERATE, UBYTE, USHORT, UINT = 'generate', 'ubyte', 'ushort', 'uint'
 FIRST, LAST = 'first', 'last'
+PRDISABLE, PRENABLE = 'prdisable', 'prenable'
 
 INTYPES = (GENERATE, UBYTE, USHORT, UINT)
 OUTTYPES = (USHORT, UINT)
 PVS=(FIRST, LAST)
+PRS=(PRDISABLE, PRENABLE)
 PRIMS=('points', 
        'lines', 
        'linestrip', 
@@ -57,7 +59,7 @@ longprim = dict(zip(PRIMS, LONGPRIMS))
 intype_idx = dict(ubyte='IN_UBYTE', ushort='IN_USHORT', uint='IN_UINT')
 outtype_idx = dict(ushort='OUT_USHORT', uint='OUT_UINT')
 pv_idx = dict(first='PV_FIRST', last='PV_LAST')
-
+pr_idx = dict(prdisable='PR_DISABLE', prenable='PR_ENABLE')
 
 def prolog():
     print '''/* File automatically generated by indices.py */'''
@@ -97,7 +99,7 @@ static unsigned in_size_idx( unsigned index_size )
 }
 
 
-static u_translate_func translate[IN_COUNT][OUT_COUNT][PV_COUNT][PV_COUNT][PRIM_COUNT];
+static u_translate_func translate[IN_COUNT][OUT_COUNT][PV_COUNT][PV_COUNT][PR_COUNT][PRIM_COUNT];
 static u_generate_func  generate[OUT_COUNT][PV_COUNT][PV_COUNT][PRIM_COUNT];
 
 
@@ -143,18 +145,22 @@ def do_quad( intype, outtype, ptr, v0, v1, v2, v3, inpv, outpv ):
     do_tri( intype, outtype, ptr+'+0',  v0, v1, v3, inpv, outpv );
     do_tri( intype, outtype, ptr+'+3',  v1, v2, v3, inpv, outpv );
 
-def name(intype, outtype, inpv, outpv, prim):
+def name(intype, outtype, inpv, outpv, pr, prim):
     if intype == GENERATE:
         return 'generate_' + prim + '_' + outtype + '_' + inpv + '2' + outpv
     else:
-        return 'translate_' + prim + '_' + intype + '2' + outtype + '_' + inpv + '2' + outpv
+        return 'translate_' + prim + '_' + intype + '2' + outtype + '_' + inpv + '2' + outpv + '_' + pr
 
-def preamble(intype, outtype, inpv, outpv, prim):
-    print 'static void ' + name( intype, outtype, inpv, outpv, prim ) + '('
+def preamble(intype, outtype, inpv, outpv, pr, prim):
+    print 'static void ' + name( intype, outtype, inpv, outpv, pr, prim ) + '('
     if intype != GENERATE:
         print '    const void * _in,'
     print '    unsigned start,'
-    print '    unsigned nr,'
+    if intype != GENERATE:
+        print '    unsigned in_nr,'
+    print '    unsigned out_nr,'
+    if intype != GENERATE:
+        print '    unsigned prim_restart_idx,'
     print '    void *_out )'
     print '{'
     if intype != GENERATE:
@@ -167,46 +173,46 @@ def postamble():
     print '}'
 
 
-def points(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='points')
-    print '  for (i = start; i < (nr+start); i++) { '
+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 '   }'
     postamble()
 
-def lines(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='lines')
-    print '  for (i = start; i < (nr+start); i+=2) { '
+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 '   }'
     postamble()
 
-def linestrip(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='linestrip')
-    print '  for (i = start, j = 0; j < nr; j+=2, i++) { '
+def linestrip(intype, outtype, inpv, outpv, pr):
+    preamble(intype, outtype, inpv, outpv, pr, prim='linestrip')
+    print '  for (i = start, j = 0; j < out_nr; j+=2, i++) { '
     do_line( intype, outtype, 'out+j',  'i', 'i+1', inpv, outpv );
     print '   }'
     postamble()
 
-def lineloop(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='lineloop')
-    print '  for (i = start, j = 0; j < nr - 2; j+=2, i++) { '
+def lineloop(intype, outtype, inpv, outpv, pr):
+    preamble(intype, outtype, inpv, outpv, pr, prim='lineloop')
+    print '  for (i = start, j = 0; j < out_nr - 2; j+=2, i++) { '
     do_line( intype, outtype, 'out+j',  'i', 'i+1', inpv, outpv );
     print '   }'
     do_line( intype, outtype, 'out+j',  'i', 'start', inpv, outpv );
     postamble()
 
-def tris(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='tris')
-    print '  for (i = start; i < (nr+start); i+=3) { '
+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 '   }'
     postamble()
 
 
-def tristrip(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='tristrip')
-    print '  for (i = start, j = 0; j < nr; j+=3, i++) { '
+def tristrip(intype, outtype, inpv, outpv, pr):
+    preamble(intype, outtype, inpv, outpv, pr, prim='tristrip')
+    print '  for (i = start, j = 0; j < out_nr; j+=3, i++) { '
     if inpv == FIRST:
         do_tri( intype, outtype, 'out+j',  'i', 'i+1+(i&1)', 'i+2-(i&1)', inpv, outpv );
     else:
@@ -215,18 +221,42 @@ def tristrip(intype, outtype, inpv, outpv):
     postamble()
 
 
-def trifan(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='trifan')
-    print '  for (i = start, j = 0; j < nr; j+=3, i++) { '
+def trifan(intype, outtype, inpv, outpv, pr):
+    preamble(intype, outtype, inpv, outpv, pr, prim='trifan')
+    print '  for (i = start, j = 0; j < out_nr; j+=3, i++) { '
     do_tri( intype, outtype, 'out+j',  'start', 'i+1', 'i+2', inpv, outpv );
     print '   }'
     postamble()
 
 
 
-def polygon(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='polygon')
-    print '  for (i = start, j = 0; j < nr; j+=3, i++) { '
+def polygon(intype, outtype, inpv, outpv, pr):
+    preamble(intype, outtype, inpv, outpv, pr, prim='polygon')
+    print '  for (i = start, j = 0; j < out_nr; j+=3, i++) { '
+    if pr == PRENABLE:
+        print 'restart:'
+        print '      if (i + 3 > in_nr) {'
+        print '         (out+j+0)[0] = prim_restart_idx;'
+        print '         (out+j+0)[1] = prim_restart_idx;'
+        print '         (out+j+0)[2] = prim_restart_idx;'
+        print '         continue;'
+        print '      }'
+        print '      if (in[i + 0] == prim_restart_idx) {'
+        print '         i += 1;'
+        print '         start = i;'
+        print '         goto restart;'
+        print '      }'
+        print '      if (in[i + 1] == prim_restart_idx) {'
+        print '         i += 2;'
+        print '         start = i;'
+        print '         goto restart;'
+        print '      }'
+        print '      if (in[i + 2] == prim_restart_idx) {'
+        print '         i += 3;'
+        print '         start = i;'
+        print '         goto restart;'
+        print '      }'
+
     if inpv == FIRST:
         do_tri( intype, outtype, 'out+j',  'start', 'i+1', 'i+2', inpv, outpv );
     else:
@@ -235,17 +265,72 @@ def polygon(intype, outtype, inpv, outpv):
     postamble()
 
 
-def quads(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='quads')
-    print '  for (i = start, j = 0; j < nr; j+=6, i+=4) { '
+def quads(intype, outtype, inpv, outpv, pr):
+    preamble(intype, outtype, inpv, outpv, pr, prim='quads')
+    print '  for (i = start, j = 0; j < out_nr; j+=6, i+=4) { '
+    if pr == PRENABLE:
+        print 'restart:'
+        print '      if (i + 4 > in_nr) {'
+        print '         (out+j+0)[0] = prim_restart_idx;'
+        print '         (out+j+0)[1] = prim_restart_idx;'
+        print '         (out+j+0)[2] = prim_restart_idx;'
+        print '         (out+j+3)[0] = prim_restart_idx;'
+        print '         (out+j+3)[1] = prim_restart_idx;'
+        print '         (out+j+3)[2] = prim_restart_idx;'
+        print '         continue;'
+        print '      }'
+        print '      if (in[i + 0] == prim_restart_idx) {'
+        print '         i += 1;'
+        print '         goto restart;'
+        print '      }'
+        print '      if (in[i + 1] == prim_restart_idx) {'
+        print '         i += 2;'
+        print '         goto restart;'
+        print '      }'
+        print '      if (in[i + 2] == prim_restart_idx) {'
+        print '         i += 3;'
+        print '         goto restart;'
+        print '      }'
+        print '      if (in[i + 3] == prim_restart_idx) {'
+        print '         i += 4;'
+        print '         goto restart;'
+        print '      }'
+        
     do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3', inpv, outpv );
     print '   }'
     postamble()
 
 
-def quadstrip(intype, outtype, inpv, outpv):
-    preamble(intype, outtype, inpv, outpv, prim='quadstrip')
-    print '  for (i = start, j = 0; j < nr; j+=6, i+=2) { '
+def quadstrip(intype, outtype, inpv, outpv, pr):
+    preamble(intype, outtype, inpv, outpv, pr, prim='quadstrip')
+    print '  for (i = start, j = 0; j < out_nr; j+=6, i+=2) { '
+    if pr == PRENABLE:
+        print 'restart:'
+        print '      if (i + 4 > in_nr) {'
+        print '         (out+j+0)[0] = prim_restart_idx;'
+        print '         (out+j+0)[1] = prim_restart_idx;'
+        print '         (out+j+0)[2] = prim_restart_idx;'
+        print '         (out+j+3)[0] = prim_restart_idx;'
+        print '         (out+j+3)[1] = prim_restart_idx;'
+        print '         (out+j+3)[2] = prim_restart_idx;'
+        print '         continue;'
+        print '      }'
+        print '      if (in[i + 0] == prim_restart_idx) {'
+        print '         i += 1;'
+        print '         goto restart;'
+        print '      }'
+        print '      if (in[i + 1] == prim_restart_idx) {'
+        print '         i += 2;'
+        print '         goto restart;'
+        print '      }'
+        print '      if (in[i + 2] == prim_restart_idx) {'
+        print '         i += 3;'
+        print '         goto restart;'
+        print '      }'
+        print '      if (in[i + 3] == prim_restart_idx) {'
+        print '         i += 4;'
+        print '         goto restart;'
+        print '      }'
     do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3', inpv, outpv );
     print '   }'
     postamble()
@@ -256,33 +341,37 @@ def emit_funcs():
         for outtype in OUTTYPES:
             for inpv in (FIRST, LAST):
                 for outpv in (FIRST, LAST):
-                    points(intype, outtype, inpv, outpv)
-                    lines(intype, outtype, inpv, outpv)
-                    linestrip(intype, outtype, inpv, outpv)
-                    lineloop(intype, outtype, inpv, outpv)
-                    tris(intype, outtype, inpv, outpv)
-                    tristrip(intype, outtype, inpv, outpv)
-                    trifan(intype, outtype, inpv, outpv)
-                    quads(intype, outtype, inpv, outpv)
-                    quadstrip(intype, outtype, inpv, outpv)
-                    polygon(intype, outtype, inpv, outpv)
-
-def init(intype, outtype, inpv, outpv, prim):
+                    for pr in (PRDISABLE, PRENABLE):
+                        if pr == PRENABLE and intype == GENERATE:
+                            continue
+                        points(intype, outtype, inpv, outpv, pr)
+                        lines(intype, outtype, inpv, outpv, pr)
+                        linestrip(intype, outtype, inpv, outpv, pr)
+                        lineloop(intype, outtype, inpv, outpv, pr)
+                        tris(intype, outtype, inpv, outpv, pr)
+                        tristrip(intype, outtype, inpv, outpv, pr)
+                        trifan(intype, outtype, inpv, outpv, pr)
+                        quads(intype, outtype, inpv, outpv, pr)
+                        quadstrip(intype, outtype, inpv, outpv, pr)
+                        polygon(intype, outtype, inpv, outpv, pr)
+
+def init(intype, outtype, inpv, outpv, pr, prim):
     if intype == GENERATE:
         print ('generate[' + 
                outtype_idx[outtype] + 
                '][' + pv_idx[inpv] + 
                '][' + pv_idx[outpv] + 
                '][' + longprim[prim] + 
-               '] = ' + name( intype, outtype, inpv, outpv, prim ) + ';')
+               '] = ' + name( intype, outtype, inpv, outpv, pr, prim ) + ';')
     else:
         print ('translate[' + 
                intype_idx[intype] + 
                '][' + outtype_idx[outtype] + 
                '][' + pv_idx[inpv] + 
-               '][' + pv_idx[outpv] + 
+               '][' + pv_idx[outpv] +
+               '][' + pr_idx[pr] + 
                '][' + longprim[prim] + 
-               '] = ' + name( intype, outtype, inpv, outpv, prim ) + ';')
+               '] = ' + name( intype, outtype, inpv, outpv, pr, prim ) + ';')
 
 
 def emit_all_inits():
@@ -290,8 +379,9 @@ def emit_all_inits():
         for outtype in OUTTYPES:
             for inpv in PVS:
                 for outpv in PVS:
-                    for prim in PRIMS:
-                        init(intype, outtype, inpv, outpv, prim)
+                    for pr in PRS:
+                        for prim in PRIMS:
+                            init(intype, outtype, inpv, outpv, pr, prim)
 
 def emit_init():
     print 'void u_index_init( void )'
diff --git a/src/gallium/auxiliary/indices/u_primconvert.c b/src/gallium/auxiliary/indices/u_primconvert.c
index cebb818..00e65aa 100644
--- a/src/gallium/auxiliary/indices/u_primconvert.c
+++ b/src/gallium/auxiliary/indices/u_primconvert.c
@@ -129,11 +129,13 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
    new_info.index_bias = info->index_bias;
    new_info.start_instance = info->start_instance;
    new_info.instance_count = info->instance_count;
-
+   new_info.primitive_restart = info->primitive_restart;
+   new_info.restart_index = info->restart_index;
    if (info->indexed) {
       u_index_translator(pc->primtypes_mask,
                          info->mode, pc->saved_ib.index_size, info->count,
                          pc->api_pv, pc->api_pv,
+                         info->primitive_restart ? PR_ENABLE : PR_DISABLE,
                          &new_info.mode, &new_ib.index_size, &new_info.count,
                          &trans_func);
       src = ib->user_buffer;
@@ -159,7 +161,7 @@ util_primconvert_draw_vbo(struct primconvert_context *pc,
                   &new_ib.offset, &new_ib.buffer, &dst);
 
    if (info->indexed) {
-      trans_func(src, info->start, new_info.count, dst);
+      trans_func(src, info->start, info->count, new_info.count, info->restart_index, dst);
    }
    else {
       gen_func(info->start, new_info.count, dst);
diff --git a/src/gallium/auxiliary/indices/u_unfilled_gen.py b/src/gallium/auxiliary/indices/u_unfilled_gen.py
index 8864972..c8a2893 100644
--- a/src/gallium/auxiliary/indices/u_unfilled_gen.py
+++ b/src/gallium/auxiliary/indices/u_unfilled_gen.py
@@ -128,7 +128,11 @@ def preamble(intype, outtype, prim):
     if intype != GENERATE:
         print '    const void * _in,'
     print '    unsigned start,'
-    print '    unsigned nr,'
+    if intype != GENERATE:
+        print '    unsigned in_nr,'
+    print '    unsigned out_nr,'
+    if intype != GENERATE:
+        print '    unsigned prim_restart_idx,'
     print '    void *_out )'
     print '{'
     if intype != GENERATE:
@@ -143,7 +147,7 @@ def postamble():
 
 def tris(intype, outtype):
     preamble(intype, outtype, prim='tris')
-    print '  for (i = start, j = 0; j < nr; j+=6, i+=3) { '
+    print '  for (i = start, j = 0; j < out_nr; j+=6, i+=3) { '
     do_tri( intype, outtype, 'out+j',  'i', 'i+1', 'i+2' );
     print '   }'
     postamble()
@@ -151,7 +155,7 @@ def tris(intype, outtype):
 
 def tristrip(intype, outtype):
     preamble(intype, outtype, prim='tristrip')
-    print '  for (i = start, j = 0; j < nr; j+=6, i++) { '
+    print '  for (i = start, j = 0; j < out_nr; j+=6, i++) { '
     do_tri( intype, outtype, 'out+j',  'i', 'i+1/*+(i&1)*/', 'i+2/*-(i&1)*/' );
     print '   }'
     postamble()
@@ -159,7 +163,7 @@ def tristrip(intype, outtype):
 
 def trifan(intype, outtype):
     preamble(intype, outtype, prim='trifan')
-    print '  for (i = start, j = 0; j < nr; j+=6, i++) { '
+    print '  for (i = start, j = 0; j < out_nr; j+=6, i++) { '
     do_tri( intype, outtype, 'out+j',  '0', 'i+1', 'i+2' );
     print '   }'
     postamble()
@@ -168,15 +172,15 @@ def trifan(intype, outtype):
 
 def polygon(intype, outtype):
     preamble(intype, outtype, prim='polygon')
-    print '  for (i = start, j = 0; j < nr; j+=2, i++) { '
-    line( intype, outtype, 'out+j', 'i', '(i+1)%(nr/2)' )
+    print '  for (i = start, j = 0; j < out_nr; j+=2, i++) { '
+    line( intype, outtype, 'out+j', 'i', '(i+1)%(out_nr/2)' )
     print '   }'
     postamble()
 
 
 def quads(intype, outtype):
     preamble(intype, outtype, prim='quads')
-    print '  for (i = start, j = 0; j < nr; j+=8, i+=4) { '
+    print '  for (i = start, j = 0; j < out_nr; j+=8, i+=4) { '
     do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3' );
     print '   }'
     postamble()
@@ -184,7 +188,7 @@ def quads(intype, outtype):
 
 def quadstrip(intype, outtype):
     preamble(intype, outtype, prim='quadstrip')
-    print '  for (i = start, j = 0; j < nr; j+=8, i+=2) { '
+    print '  for (i = start, j = 0; j < out_nr; j+=8, i+=2) { '
     do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3' );
     print '   }'
     postamble()
diff --git a/src/gallium/auxiliary/indices/u_unfilled_indices.c b/src/gallium/auxiliary/indices/u_unfilled_indices.c
index 7a74c39..71ca6dd 100644
--- a/src/gallium/auxiliary/indices/u_unfilled_indices.c
+++ b/src/gallium/auxiliary/indices/u_unfilled_indices.c
@@ -28,30 +28,36 @@
 
 static void translate_ubyte_ushort( const void *in,
                                     unsigned start,
-                                    unsigned nr,
+                                    unsigned in_nr,
+                                    unsigned out_nr,
+                                    unsigned prim_restart_idx,
                                     void *out )
 {
    const ubyte *in_ub = (const ubyte *)in;
    ushort *out_us = (ushort *)out;
    unsigned i;
-   for (i = 0; i < nr; i++)
+   for (i = 0; i < out_nr; i++)
       out_us[i] = (ushort) in_ub[i+start];
 }
 
 static void translate_memcpy_ushort( const void *in,
                                      unsigned start,
-                                     unsigned nr,
+                                     unsigned in_nr,
+                                     unsigned out_nr,
+                                     unsigned prim_restart_idx,
                                      void *out )
 {
-   memcpy(out, &((short *)in)[start], nr*sizeof(short));
+   memcpy(out, &((short *)in)[start], out_nr*sizeof(short));
 }
                               
 static void translate_memcpy_uint( const void *in,
                                    unsigned start,
-                                   unsigned nr,
+                                   unsigned in_nr,
+                                   unsigned out_nr,
+                                   unsigned prim_restart_idx,
                                    void *out )
 {
-   memcpy(out, &((int *)in)[start], nr*sizeof(int));
+   memcpy(out, &((int *)in)[start], out_nr*sizeof(int));
 }
 
 
diff --git a/src/gallium/drivers/svga/svga_draw_elements.c b/src/gallium/drivers/svga/svga_draw_elements.c
index 3384095..038500a 100644
--- a/src/gallium/drivers/svga/svga_draw_elements.c
+++ b/src/gallium/drivers/svga/svga_draw_elements.c
@@ -70,7 +70,7 @@ translate_indices(struct svga_hwtnl *hwtnl, struct pipe_resource *src,
    if (dst_map == NULL)
       goto fail;
 
-   translate((const char *) src_map + offset, 0, nr, dst_map);
+   translate((const char *) src_map + offset, 0, 0, nr, 0, dst_map);
 
    pipe_buffer_unmap(pipe, src_transfer);
    pipe_buffer_unmap(pipe, dst_transfer);
@@ -153,6 +153,7 @@ svga_hwtnl_draw_range_elements(struct svga_hwtnl *hwtnl,
                                     count,
                                     hwtnl->api_pv,
                                     hwtnl->hw_pv,
+                                    PR_DISABLE,
                                     &gen_prim, &gen_size, &gen_nr, &gen_func);
    }
 
-- 
2.1.0



More information about the mesa-dev mailing list