[Mesa-dev] [PATCH] u_primconvert: add primitive restart support
Brian Paul
brianp at vmware.com
Wed Mar 18 12:36:59 PDT 2015
On 03/17/2015 08:13 PM, Dave Airlie wrote:
> 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>
This is some pretty dense code. I know, I was working on adding prim
restart support a while back but never finished.
Changes look good AFAICT. Just a minor unsigned->boolean nit/question
below.
Reviewed-by: Brian Paul <brianp at vmware.com>
If it were me I might replace "prim_restart_idx" with "restart_index",
but not a big deal.
> ---
> 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,
boolean?
> 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
>
Maybe put a /* PR = Primitive Restart */ comment here?
> +#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);
> }
>
>
More information about the mesa-dev
mailing list