Am 26.05.2016 um 16:06 schrieb Brian Paul: > Tested with new piglit gl-3.2-adj-prims test. > --- > src/gallium/auxiliary/indices/u_indices.c | 52 ++++++++++++++++ > src/gallium/auxiliary/indices/u_indices_gen.py | 83 > +++++++++++++++++++++++++- > src/gallium/auxiliary/indices/u_indices_priv.h | 2 +- > 3 files changed, 134 insertions(+), 3 deletions(-) > > diff --git a/src/gallium/auxiliary/indices/u_indices.c > b/src/gallium/auxiliary/indices/u_indices.c > index 436f8f0..2b2d10c 100644 > --- a/src/gallium/auxiliary/indices/u_indices.c > +++ b/src/gallium/auxiliary/indices/u_indices.c > @@ -55,6 +55,8 @@ static void translate_memcpy_uint( const void *in, > * - Translate from first provoking vertex to last provoking vertex and > * vice versa. > * > + * Note that this function is used for indexed primitives. > + * > * \param hw_mask mask of (1 << PIPE_PRIM_x) flags indicating which types > * of primitives are supported by the hardware. > * \param prim incoming PIPE_PRIM_x > @@ -172,6 +174,30 @@ u_index_translator(unsigned hw_mask, > *out_nr = (nr - 2) * 3; > break; > > + case PIPE_PRIM_LINES_ADJACENCY: > + *out_translate = > translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim]; Can't you get that line out of the switch? (Not that this is really new...)
Patch looks good though (albeit I can't quite verify the index numbers...) Roland > + *out_prim = PIPE_PRIM_LINES_ADJACENCY; > + *out_nr = nr; > + break; > + > + case PIPE_PRIM_LINE_STRIP_ADJACENCY: > + *out_translate = > translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim]; > + *out_prim = PIPE_PRIM_LINES_ADJACENCY; > + *out_nr = (nr - 3) * 4; > + break; > + > + case PIPE_PRIM_TRIANGLES_ADJACENCY: > + *out_translate = > translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim]; > + *out_prim = PIPE_PRIM_TRIANGLES_ADJACENCY; > + *out_nr = nr; > + break; > + > + case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY: > + *out_translate = > translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim]; > + *out_prim = PIPE_PRIM_TRIANGLES_ADJACENCY; > + *out_nr = ((nr - 4) / 2) * 6; > + break; > + > default: > assert(0); > *out_translate = > translate[in_idx][out_idx][in_pv][out_pv][prim_restart][prim]; > @@ -193,6 +219,8 @@ u_index_translator(unsigned hw_mask, > * The generator functions generates a number of ushort or uint indexes > * for drawing the new type of primitive. > * > + * Note that this function is used for non-indexed primitives. > + * > * \param hw_mask a bitmask of (1 << PIPE_PRIM_x) values that indicates > * kind of primitives are supported by the driver. > * \param prim the PIPE_PRIM_x that the user wants to draw > @@ -294,6 +322,30 @@ u_index_generator(unsigned hw_mask, > *out_nr = (nr - 2) * 3; > return U_GENERATE_REUSABLE; > > + case PIPE_PRIM_LINES_ADJACENCY: > + *out_generate = generate[out_idx][in_pv][out_pv][prim]; > + *out_prim = PIPE_PRIM_LINES_ADJACENCY; > + *out_nr = nr; > + return U_GENERATE_REUSABLE; > + > + case PIPE_PRIM_LINE_STRIP_ADJACENCY: > + *out_generate = generate[out_idx][in_pv][out_pv][prim]; > + *out_prim = PIPE_PRIM_LINES_ADJACENCY; > + *out_nr = (nr - 3) * 4; > + return U_GENERATE_REUSABLE; > + > + case PIPE_PRIM_TRIANGLES_ADJACENCY: > + *out_generate = generate[out_idx][in_pv][out_pv][prim]; > + *out_prim = PIPE_PRIM_TRIANGLES_ADJACENCY; > + *out_nr = nr; > + return U_GENERATE_REUSABLE; > + > + case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY: > + *out_generate = generate[out_idx][in_pv][out_pv][prim]; > + *out_prim = PIPE_PRIM_TRIANGLES_ADJACENCY; > + *out_nr = ((nr - 4) / 2) * 6; > + return U_GENERATE_REUSABLE; > + > default: > assert(0); > *out_generate = generate[out_idx][in_pv][out_pv][PIPE_PRIM_POINTS]; > diff --git a/src/gallium/auxiliary/indices/u_indices_gen.py > b/src/gallium/auxiliary/indices/u_indices_gen.py > index 97c8e0d..fb6b310 100644 > --- a/src/gallium/auxiliary/indices/u_indices_gen.py > +++ b/src/gallium/auxiliary/indices/u_indices_gen.py > @@ -42,7 +42,11 @@ PRIMS=('points', > 'tristrip', > 'quads', > 'quadstrip', > - 'polygon') > + 'polygon', > + 'linesadj', > + 'linestripadj', > + 'trisadj', > + 'tristripadj') > > LONGPRIMS=('PIPE_PRIM_POINTS', > 'PIPE_PRIM_LINES', > @@ -53,7 +57,11 @@ LONGPRIMS=('PIPE_PRIM_POINTS', > 'PIPE_PRIM_TRIANGLE_STRIP', > 'PIPE_PRIM_QUADS', > 'PIPE_PRIM_QUAD_STRIP', > - 'PIPE_PRIM_POLYGON') > + 'PIPE_PRIM_POLYGON', > + 'PIPE_PRIM_LINES_ADJACENCY', > + 'PIPE_PRIM_LINE_STRIP_ADJACENCY', > + 'PIPE_PRIM_TRIANGLES_ADJACENCY', > + 'PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY') > > longprim = dict(zip(PRIMS, LONGPRIMS)) > intype_idx = dict(ubyte='IN_UBYTE', ushort='IN_USHORT', uint='IN_UINT') > @@ -123,6 +131,20 @@ def tri( intype, outtype, ptr, v0, v1, v2 ): > print ' (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';' > print ' (' + ptr + ')[2] = ' + vert( intype, outtype, v2 ) + ';' > > +def lineadj( intype, outtype, ptr, v0, v1, v2, v3 ): > + print ' (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';' > + print ' (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';' > + print ' (' + ptr + ')[2] = ' + vert( intype, outtype, v2 ) + ';' > + print ' (' + ptr + ')[3] = ' + vert( intype, outtype, v3 ) + ';' > + > +def triadj( intype, outtype, ptr, v0, v1, v2, v3, v4, v5 ): > + print ' (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';' > + print ' (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';' > + print ' (' + ptr + ')[2] = ' + vert( intype, outtype, v2 ) + ';' > + print ' (' + ptr + ')[3] = ' + vert( intype, outtype, v3 ) + ';' > + print ' (' + ptr + ')[4] = ' + vert( intype, outtype, v4 ) + ';' > + print ' (' + ptr + ')[5] = ' + vert( intype, outtype, v5 ) + ';' > + > def do_point( intype, outtype, ptr, v0 ): > point( intype, outtype, ptr, v0 ) > > @@ -149,6 +171,18 @@ def do_quad( intype, outtype, ptr, v0, v1, v2, v3, inpv, > outpv ): > do_tri( intype, outtype, ptr+'+0', v0, v1, v2, inpv, outpv ); > do_tri( intype, outtype, ptr+'+3', v0, v2, v3, inpv, outpv ); > > +def do_lineadj( intype, outtype, ptr, v0, v1, v2, v3, inpv, outpv ): > + if inpv == outpv: > + lineadj( intype, outtype, ptr, v0, v1, v2, v3 ) > + else: > + lineadj( intype, outtype, ptr, v3, v2, v1, v0 ) > + > +def do_triadj( intype, outtype, ptr, v0, v1, v2, v3, v4, v5, inpv, outpv ): > + if inpv == outpv: > + triadj( intype, outtype, ptr, v0, v1, v2, v3, v4, v5 ) > + else: > + triadj( intype, outtype, ptr, v4, v5, v0, v1, v2, v3 ) > + > def name(intype, outtype, inpv, outpv, pr, prim): > if intype == GENERATE: > return 'generate_' + prim + '_' + outtype + '_' + inpv + '2' + outpv > @@ -343,6 +377,47 @@ def quadstrip(intype, outtype, inpv, outpv, pr): > postamble() > > > +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 ' }' > + postamble() > + > + > +def linestripadj(intype, outtype, inpv, outpv, pr): > + preamble(intype, outtype, inpv, outpv, pr, prim='linestripadj') > + print ' for (i = start, j = 0; j < out_nr; j+=4, i++) {' > + do_lineadj( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3', inpv, > outpv ) > + print ' }' > + postamble() > + > + > +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', > + 'i+4', 'i+5', inpv, outpv ) > + print ' }' > + postamble() > + > + > +def tristripadj(intype, outtype, inpv, outpv, pr): > + preamble(intype, outtype, inpv, outpv, pr, prim='tristripadj') > + print ' for (i = start, j = 0; j < out_nr; i+=2, j+=6) { ' > + print ' if (i % 4 == 0) {' > + print ' /* even triangle */' > + do_triadj( intype, outtype, 'out+j', > + 'i+0', 'i+1', 'i+2', 'i+3', 'i+4', 'i+5', inpv, outpv ) > + print ' } else {' > + print ' /* odd triangle */' > + do_triadj( intype, outtype, 'out+j', > + 'i+2', 'i-2', 'i+0', 'i+3', 'i+4', 'i+6', inpv, outpv ) > + print ' }' > + print ' }' > + postamble() > + > + > def emit_funcs(): > for intype in INTYPES: > for outtype in OUTTYPES: > @@ -361,6 +436,10 @@ def emit_funcs(): > quads(intype, outtype, inpv, outpv, pr) > quadstrip(intype, outtype, inpv, outpv, pr) > polygon(intype, outtype, inpv, outpv, pr) > + linesadj(intype, outtype, inpv, outpv, pr) > + linestripadj(intype, outtype, inpv, outpv, pr) > + trisadj(intype, outtype, inpv, outpv, pr) > + tristripadj(intype, outtype, inpv, outpv, pr) > > def init(intype, outtype, inpv, outpv, pr, prim): > if intype == GENERATE: > diff --git a/src/gallium/auxiliary/indices/u_indices_priv.h > b/src/gallium/auxiliary/indices/u_indices_priv.h > index 9acf1ff..82374ea 100644 > --- a/src/gallium/auxiliary/indices/u_indices_priv.h > +++ b/src/gallium/auxiliary/indices/u_indices_priv.h > @@ -38,6 +38,6 @@ > #define OUT_COUNT 2 > > > -#define PRIM_COUNT (PIPE_PRIM_POLYGON + 1) > +#define PRIM_COUNT (PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY + 1) > > #endif > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev