diff options
Diffstat (limited to 'src/gallium/auxiliary/indices/u_indices_gen.py')
-rw-r--r-- | src/gallium/auxiliary/indices/u_indices_gen.py | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/indices/u_indices_gen.py b/src/gallium/auxiliary/indices/u_indices_gen.py new file mode 100644 index 00000000000..0dc58d0cd0e --- /dev/null +++ b/src/gallium/auxiliary/indices/u_indices_gen.py @@ -0,0 +1,319 @@ +#!/usr/bin/env python +copyright = ''' +/* + * Copyright 2009 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +''' + +GENERATE, UBYTE, USHORT, UINT = 'generate', 'ubyte', 'ushort', 'uint' +FIRST, LAST = 'first', 'last' + +INTYPES = (GENERATE, UBYTE, USHORT, UINT) +OUTTYPES = (USHORT, UINT) +PVS=(FIRST, LAST) +PRIMS=('points', + 'lines', + 'linestrip', + 'lineloop', + 'tris', + 'trifan', + 'tristrip', + 'quads', + 'quadstrip', + 'polygon') + +LONGPRIMS=('PIPE_PRIM_POINTS', + 'PIPE_PRIM_LINES', + 'PIPE_PRIM_LINE_STRIP', + 'PIPE_PRIM_LINE_LOOP', + 'PIPE_PRIM_TRIANGLES', + 'PIPE_PRIM_TRIANGLE_FAN', + 'PIPE_PRIM_TRIANGLE_STRIP', + 'PIPE_PRIM_QUADS', + 'PIPE_PRIM_QUAD_STRIP', + 'PIPE_PRIM_POLYGON') + +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') + + +def prolog(): + print '''/* File automatically generated by indices.py */''' + print copyright + print r''' + +/** + * @file + * Functions to translate and generate index lists + */ + +#include "indices/u_indices.h" +#include "indices/u_indices_priv.h" +#include "pipe/p_compiler.h" +#include "pipe/p_debug.h" +#include "pipe/p_defines.h" +#include "util/u_memory.h" + + +static unsigned out_size_idx( unsigned index_size ) +{ + switch (index_size) { + case 4: return OUT_UINT; + case 2: return OUT_USHORT; + default: assert(0); return OUT_USHORT; + } +} + +static unsigned in_size_idx( unsigned index_size ) +{ + switch (index_size) { + case 4: return IN_UINT; + case 2: return IN_USHORT; + case 1: return IN_UBYTE; + default: assert(0); return IN_UBYTE; + } +} + + +static u_translate_func translate[IN_COUNT][OUT_COUNT][PV_COUNT][PV_COUNT][PRIM_COUNT]; +static u_generate_func generate[OUT_COUNT][PV_COUNT][PV_COUNT][PRIM_COUNT]; + + +''' + +def vert( intype, outtype, v0 ): + if intype == GENERATE: + return '(' + outtype + ')(' + v0 + ')' + else: + return '(' + outtype + ')in[' + v0 + ']' + +def point( intype, outtype, ptr, v0 ): + print ' (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';' + +def line( intype, outtype, ptr, v0, v1 ): + print ' (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';' + print ' (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';' + +def tri( intype, outtype, ptr, v0, v1, v2 ): + print ' (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';' + print ' (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';' + print ' (' + ptr + ')[2] = ' + vert( intype, outtype, v2 ) + ';' + +def do_point( intype, outtype, ptr, v0 ): + point( intype, outtype, ptr, v0 ) + +def do_line( intype, outtype, ptr, v0, v1, inpv, outpv ): + if inpv == outpv: + line( intype, outtype, ptr, v0, v1 ) + else: + line( intype, outtype, ptr, v1, v0 ) + +def do_tri( intype, outtype, ptr, v0, v1, v2, inpv, outpv ): + if inpv == outpv: + tri( intype, outtype, ptr, v0, v1, v2 ) + else: + if inpv == FIRST: + tri( intype, outtype, ptr, v1, v2, v0 ) + else: + tri( intype, outtype, ptr, v2, v0, v1 ) + +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): + if intype == GENERATE: + return 'generate_' + prim + '_' + outtype + '_' + inpv + '2' + outpv + else: + return 'translate_' + prim + '_' + intype + '2' + outtype + '_' + inpv + '2' + outpv + +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 nr,' + print ' void *_out )' + print '{' + if intype != GENERATE: + print ' const ' + intype + '*in = (const ' + intype + '*)_in;' + print ' ' + outtype + ' *out = (' + outtype + '*)_out;' + print ' unsigned i, j;' + print ' (void)j;' + +def postamble(): + print '}' + + +def points(intype, outtype, inpv, outpv): + preamble(intype, outtype, inpv, outpv, prim='points') + print ' for (i = 0; i < nr; 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) { ' + 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++) { ' + 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++) { ' + do_line( intype, outtype, 'out+j', 'i', 'i+1', inpv, outpv ); + print ' }' + do_line( intype, outtype, 'out+j', 'i', '0', inpv, outpv ); + postamble() + +def tris(intype, outtype, inpv, outpv): + preamble(intype, outtype, inpv, outpv, prim='tris') + print ' for (i = 0; i < nr; 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 (j = i = 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: + do_tri( intype, outtype, 'out+j', 'i+(i&1)', 'i+1-(i&1)', 'i+2', inpv, outpv ); + print ' }' + postamble() + + +def trifan(intype, outtype, inpv, outpv): + preamble(intype, outtype, inpv, outpv, prim='trifan') + print ' for (j = i = 0; j < nr; j+=3, i++) { ' + do_tri( intype, outtype, 'out+j', '0', 'i+1', 'i+2', inpv, outpv ); + print ' }' + postamble() + + + +def polygon(intype, outtype, inpv, outpv): + preamble(intype, outtype, inpv, outpv, prim='polygon') + print ' for (j = i = 0; j < nr; j+=3, i++) { ' + if inpv == FIRST: + do_tri( intype, outtype, 'out+j', '0', 'i+1', 'i+2', inpv, outpv ); + else: + do_tri( intype, outtype, 'out+j', 'i+1', 'i+2', '0', inpv, outpv ); + print ' }' + postamble() + + +def quads(intype, outtype, inpv, outpv): + preamble(intype, outtype, inpv, outpv, prim='quads') + print ' for (j = i = 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() + + +def quadstrip(intype, outtype, inpv, outpv): + preamble(intype, outtype, inpv, outpv, prim='quadstrip') + print ' for (j = i = 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() + + +def emit_funcs(): + for intype in INTYPES: + 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): + if intype == GENERATE: + print ('generate[' + + outtype_idx[outtype] + + '][' + pv_idx[inpv] + + '][' + pv_idx[outpv] + + '][' + longprim[prim] + + '] = ' + name( intype, outtype, inpv, outpv, prim ) + ';') + else: + print ('translate[' + + intype_idx[intype] + + '][' + outtype_idx[outtype] + + '][' + pv_idx[inpv] + + '][' + pv_idx[outpv] + + '][' + longprim[prim] + + '] = ' + name( intype, outtype, inpv, outpv, prim ) + ';') + + +def emit_all_inits(): + for intype in INTYPES: + for outtype in OUTTYPES: + for inpv in PVS: + for outpv in PVS: + for prim in PRIMS: + init(intype, outtype, inpv, outpv, prim) + +def emit_init(): + print 'void u_index_init( void )' + print '{' + print ' static int firsttime = 1;' + print ' if (!firsttime) return;' + print ' firsttime = 0;' + emit_all_inits() + print '}' + + + + +def epilog(): + print '#include "indices/u_indices.c"' + + +def main(): + prolog() + emit_funcs() + emit_init() + epilog() + + +if __name__ == '__main__': + main() |