gallium/auxiliary/indices: add start param
authorRob Clark <robclark@freedesktop.org>
Fri, 25 Oct 2013 19:22:06 +0000 (15:22 -0400)
committerRob Clark <robclark@freedesktop.org>
Tue, 29 Oct 2013 20:49:43 +0000 (16:49 -0400)
Add 'start' parameter to generator/translator.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/indices/u_indices.c
src/gallium/auxiliary/indices/u_indices.h
src/gallium/auxiliary/indices/u_indices_gen.py
src/gallium/auxiliary/indices/u_unfilled_gen.py
src/gallium/auxiliary/indices/u_unfilled_indices.c
src/gallium/drivers/svga/svga_draw_arrays.c
src/gallium/drivers/svga/svga_draw_elements.c

index 72c46f7d2303337824ce8a2d2bfdc72b494e1b76..30b54b9fb6afbcf7775a7606e6c15e8d0256ae98 100644 (file)
 #include "u_indices_priv.h"
 
 static void translate_memcpy_ushort( const void *in,
+                                     unsigned start,
                                      unsigned nr,
                                      void *out )
 {
-   memcpy(out, in, nr*sizeof(short));
+   memcpy(out, &((short *)in)[start], nr*sizeof(short));
 }
                               
 static void translate_memcpy_uint( const void *in,
+                                   unsigned start,
                                    unsigned nr,
                                    void *out )
 {
-   memcpy(out, in, nr*sizeof(int));
+   memcpy(out, &((int *)in)[start], nr*sizeof(int));
 }
                               
 
index be522c6725284de7b9a7f3d51f34e48812cf025d..331d0fd0042899e525841f2c5498833fd8deb935 100644 (file)
 #define PV_LAST       1
 #define PV_COUNT      2
 
+/**
+ * Index translator function (for glDrawElements() case)
+ *
+ * \param in     the input index buffer
+ * \param start  the index of the first vertex (pipe_draw_info::start)
+ * \param nr     the number of vertices (pipe_draw_info::count)
+ * \param out    output buffer big enough or nr vertices (of
+ *    @out_index_size bytes each)
+ */
 typedef void (*u_translate_func)( const void *in,
+                                  unsigned start,
                                   unsigned nr,
                                   void *out );
 
-typedef void (*u_generate_func)( unsigned nr,
+/**
+ * Index generator function (for glDrawArrays() case)
+ *
+ * \param start  the index of the first vertex (pipe_draw_info::start)
+ * \param nr     the number of vertices (pipe_draw_info::count)
+ * \param out    output buffer big enough or nr vertices (of
+ *    @out_index_size bytes each)
+ */
+typedef void (*u_generate_func)( unsigned start,
+                                 unsigned nr,
                                  void *out );
 
 
index af63d099302a411049fb35e455069a4c7a606a41..2714df87cfbad2a899a3753e3c16dae73b35cba5 100644 (file)
@@ -153,6 +153,7 @@ def preamble(intype, outtype, inpv, outpv, prim):
     print 'static void ' + name( intype, outtype, inpv, outpv, prim ) + '('
     if intype != GENERATE:
         print '    const void * _in,'
+    print '    unsigned start,'
     print '    unsigned nr,'
     print '    void *_out )'
     print '{'
@@ -168,28 +169,28 @@ def postamble():
 
 def points(intype, outtype, inpv, outpv):
     preamble(intype, outtype, inpv, outpv, prim='points')
-    print '  for (i = 0; i < nr; i++) { '
+    print '  for (i = start; i < (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 = 0; i < nr; i+=2) { '
+    print '  for (i = start; i < (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 (j = i = 0; j < nr; j+=2, i++) { '
+    print '  for (i = start, j = 0; j < 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 (j = i = 0; j < nr - 2; j+=2, i++) { '
+    print '  for (i = start, j = 0; j < nr - 2; j+=2, i++) { '
     do_line( intype, outtype, 'out+j',  'i', 'i+1', inpv, outpv );
     print '   }'
     do_line( intype, outtype, 'out+j',  'i', '0', inpv, outpv );
@@ -197,7 +198,7 @@ def lineloop(intype, outtype, inpv, outpv):
 
 def tris(intype, outtype, inpv, outpv):
     preamble(intype, outtype, inpv, outpv, prim='tris')
-    print '  for (i = 0; i < nr; i+=3) { '
+    print '  for (i = start; i < (nr+start); i+=3) { '
     do_tri( intype, outtype, 'out+i',  'i', 'i+1', 'i+2', inpv, outpv );
     print '   }'
     postamble()
@@ -205,7 +206,7 @@ def tris(intype, outtype, inpv, outpv):
 
 def tristrip(intype, outtype, inpv, outpv):
     preamble(intype, outtype, inpv, outpv, prim='tristrip')
-    print '  for (j = i = 0; j < nr; j+=3, i++) { '
+    print '  for (i = start, j = 0; j < 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:
@@ -216,7 +217,7 @@ def tristrip(intype, outtype, inpv, outpv):
 
 def trifan(intype, outtype, inpv, outpv):
     preamble(intype, outtype, inpv, outpv, prim='trifan')
-    print '  for (j = i = 0; j < nr; j+=3, i++) { '
+    print '  for (i = start, j = 0; j < nr; j+=3, i++) { '
     do_tri( intype, outtype, 'out+j',  '0', 'i+1', 'i+2', inpv, outpv );
     print '   }'
     postamble()
@@ -225,7 +226,7 @@ def trifan(intype, outtype, inpv, outpv):
 
 def polygon(intype, outtype, inpv, outpv):
     preamble(intype, outtype, inpv, outpv, prim='polygon')
-    print '  for (j = i = 0; j < nr; j+=3, i++) { '
+    print '  for (i = start, j = 0; j < nr; j+=3, i++) { '
     if inpv == FIRST:
         do_tri( intype, outtype, 'out+j',  '0', 'i+1', 'i+2', inpv, outpv );
     else:
@@ -236,7 +237,7 @@ def polygon(intype, outtype, inpv, outpv):
 
 def quads(intype, outtype, inpv, outpv):
     preamble(intype, outtype, inpv, outpv, prim='quads')
-    print '  for (j = i = 0; j < nr; j+=6, i+=4) { '
+    print '  for (i = start, j = 0; j < nr; j+=6, i+=4) { '
     do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3', inpv, outpv );
     print '   }'
     postamble()
@@ -244,7 +245,7 @@ def quads(intype, outtype, inpv, outpv):
 
 def quadstrip(intype, outtype, inpv, outpv):
     preamble(intype, outtype, inpv, outpv, prim='quadstrip')
-    print '  for (j = i = 0; j < nr; j+=6, i+=2) { '
+    print '  for (i = start, j = 0; j < nr; j+=6, i+=2) { '
     do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3', inpv, outpv );
     print '   }'
     postamble()
index 085c47a114ac87eef4e668c187b1aac81d381633..88649724521f928561f199547dba826ebfcd1729 100644 (file)
@@ -127,6 +127,7 @@ def preamble(intype, outtype, prim):
     print 'static void ' + name( intype, outtype, prim ) + '('
     if intype != GENERATE:
         print '    const void * _in,'
+    print '    unsigned start,'
     print '    unsigned nr,'
     print '    void *_out )'
     print '{'
@@ -142,7 +143,7 @@ def postamble():
 
 def tris(intype, outtype):
     preamble(intype, outtype, prim='tris')
-    print '  for (j = i = 0; j < nr; j+=6, i+=3) { '
+    print '  for (i = start, j = 0; j < nr; j+=6, i+=3) { '
     do_tri( intype, outtype, 'out+j',  'i', 'i+1', 'i+2' );
     print '   }'
     postamble()
@@ -150,7 +151,7 @@ def tris(intype, outtype):
 
 def tristrip(intype, outtype):
     preamble(intype, outtype, prim='tristrip')
-    print '  for (j = i = 0; j < nr; j+=6, i++) { '
+    print '  for (i = start, j = 0; j < nr; j+=6, i++) { '
     do_tri( intype, outtype, 'out+j',  'i', 'i+1/*+(i&1)*/', 'i+2/*-(i&1)*/' );
     print '   }'
     postamble()
@@ -158,7 +159,7 @@ def tristrip(intype, outtype):
 
 def trifan(intype, outtype):
     preamble(intype, outtype, prim='trifan')
-    print '  for (j = i = 0; j < nr; j+=6, i++) { '
+    print '  for (i = start, j = 0; j < nr; j+=6, i++) { '
     do_tri( intype, outtype, 'out+j',  '0', 'i+1', 'i+2' );
     print '   }'
     postamble()
@@ -167,7 +168,7 @@ def trifan(intype, outtype):
 
 def polygon(intype, outtype):
     preamble(intype, outtype, prim='polygon')
-    print '  for (j = i = 0; j < nr; j+=2, i++) { '
+    print '  for (i = start, j = 0; j < nr; j+=2, i++) { '
     line( intype, outtype, 'out+j', 'i', '(i+1)%(nr/2)' )
     print '   }'
     postamble()
@@ -175,7 +176,7 @@ def polygon(intype, outtype):
 
 def quads(intype, outtype):
     preamble(intype, outtype, prim='quads')
-    print '  for (j = i = 0; j < nr; j+=8, i+=4) { '
+    print '  for (i = start, j = 0; j < nr; j+=8, i+=4) { '
     do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3' );
     print '   }'
     postamble()
@@ -183,7 +184,7 @@ def quads(intype, outtype):
 
 def quadstrip(intype, outtype):
     preamble(intype, outtype, prim='quadstrip')
-    print '  for (j = i = 0; j < nr; j+=8, i+=2) { '
+    print '  for (i = start, j = 0; j < nr; j+=8, i+=2) { '
     do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3' );
     print '   }'
     postamble()
index 25c61d97bdfdca6b3e6a6d8dc78aa253b8ba81e5..7a74c39135edac33d2976ce015bd7e720573338d 100644 (file)
@@ -27,6 +27,7 @@
 
 
 static void translate_ubyte_ushort( const void *in,
+                                    unsigned start,
                                     unsigned nr,
                                     void *out )
 {
@@ -34,40 +35,44 @@ static void translate_ubyte_ushort( const void *in,
    ushort *out_us = (ushort *)out;
    unsigned i;
    for (i = 0; i < nr; i++)
-      out_us[i] = (ushort) in_ub[i];
+      out_us[i] = (ushort) in_ub[i+start];
 }
 
 static void translate_memcpy_ushort( const void *in,
+                                     unsigned start,
                                      unsigned nr,
                                      void *out )
 {
-   memcpy(out, in, nr*sizeof(short));
+   memcpy(out, &((short *)in)[start], nr*sizeof(short));
 }
                               
 static void translate_memcpy_uint( const void *in,
+                                   unsigned start,
                                    unsigned nr,
                                    void *out )
 {
-   memcpy(out, in, nr*sizeof(int));
+   memcpy(out, &((int *)in)[start], nr*sizeof(int));
 }
 
 
-static void generate_linear_ushort( unsigned nr,
+static void generate_linear_ushort( unsigned start,
+                                    unsigned nr,
                                     void *out )
 {
    ushort *out_us = (ushort *)out;
    unsigned i;
    for (i = 0; i < nr; i++)
-      out_us[i] = (ushort) i;
+      out_us[i] = (ushort)(i + start);
 }
                               
-static void generate_linear_uint( unsigned nr,
+static void generate_linear_uint( unsigned start,
+                                  unsigned nr,
                                   void *out )
 {
    unsigned *out_ui = (unsigned *)out;
    unsigned i;
    for (i = 0; i < nr; i++)
-      out_ui[i] = i;
+      out_ui[i] = i + start;
 }
 
 
index 5f03483390faa75cd7ecebae04f95c0e8104d72d..89a5dc1da779a688c0e982573578530de65be494 100644 (file)
@@ -58,7 +58,7 @@ generate_indices(struct svga_hwtnl *hwtnl,
    if (dst_map == NULL)
       goto fail;
 
-   generate(nr, dst_map);
+   generate(0, nr, dst_map);
 
    pipe_buffer_unmap(pipe, transfer);
 
index b68dad0c3bb466e804b14c245f57b630e511c14c..fb5f1c91b296317f3c7908b7bd23f0aae0d62ad7 100644 (file)
@@ -61,7 +61,7 @@ translate_indices(struct svga_hwtnl *hwtnl, struct pipe_resource *src,
    if (dst_map == NULL)
       goto fail;
 
-   translate((const char *) src_map + offset, nr, dst_map);
+   translate((const char *) src_map + offset, 0, nr, dst_map);
 
    pipe_buffer_unmap(pipe, src_transfer);
    pipe_buffer_unmap(pipe, dst_transfer);