#!/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 "util/u_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()