| from __future__ import print_function |
| |
| 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' |
| PRDISABLE, PRENABLE = 'prdisable', 'prenable' |
| |
| INTYPES = (GENERATE, UBYTE, USHORT, UINT) |
| OUTTYPES = (USHORT, UINT) |
| PVS=(FIRST, LAST) |
| PRS=(PRDISABLE, PRENABLE) |
| PRIMS=('points', |
| 'lines', |
| 'linestrip', |
| 'lineloop', |
| 'tris', |
| 'trifan', |
| 'tristrip', |
| 'quads', |
| 'quadstrip', |
| 'polygon', |
| 'linesadj', |
| 'linestripadj', |
| 'trisadj', |
| 'tristripadj') |
| |
| 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', |
| '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') |
| 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 u_indices_gen.py */''') |
| print(copyright) |
| print(r''' |
| |
| /** |
| * @file |
| * Functions to translate and generate index lists |
| */ |
| |
| #include "indices/u_indices_priv.h" |
| #include "util/u_debug.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][PR_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 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 ) |
| |
| 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 ): |
| if inpv == LAST: |
| do_tri( intype, outtype, ptr+'+0', v0, v1, v3, inpv, outpv ); |
| do_tri( intype, outtype, ptr+'+3', v1, v2, v3, inpv, outpv ); |
| else: |
| 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 |
| else: |
| return 'translate_' + prim + '_' + intype + '2' + outtype + '_' + inpv + '2' + outpv + '_' + pr |
| |
| 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,') |
| if intype != GENERATE: |
| print(' unsigned in_nr,') |
| print(' unsigned out_nr,') |
| if intype != GENERATE: |
| print(' unsigned restart_index,') |
| 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 prim_restart(in_verts, out_verts, out_prims, close_func = None): |
| print('restart:') |
| print(' if (i + ' + str(in_verts) + ' > in_nr) {') |
| for i in range(out_prims): |
| for j in range(out_verts): |
| print(' (out+j+' + str(out_verts * i) + ')[' + str(j) + '] = restart_index;') |
| print(' continue;') |
| print(' }') |
| for i in range(in_verts): |
| print(' if (in[i + ' + str(i) + '] == restart_index) {') |
| print(' i += ' + str(i + 1) + ';') |
| |
| if close_func is not None: |
| close_func(i) |
| |
| print(' goto restart;') |
| print(' }') |
| |
| def points(intype, outtype, inpv, outpv, pr): |
| preamble(intype, outtype, inpv, outpv, pr, prim='points') |
| print(' for (i = start, j = 0; j < out_nr; j++, i++) { ') |
| do_point( intype, outtype, 'out+j', 'i' ); |
| print(' }') |
| postamble() |
| |
| def lines(intype, outtype, inpv, outpv, pr): |
| preamble(intype, outtype, inpv, outpv, pr, prim='lines') |
| print(' for (i = start, j = 0; j < out_nr; j+=2, i+=2) { ') |
| do_line( intype, outtype, 'out+j', 'i', 'i+1', inpv, outpv ); |
| print(' }') |
| postamble() |
| |
| 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, pr): |
| preamble(intype, outtype, inpv, outpv, pr, prim='lineloop') |
| print(' unsigned end = start;') |
| print(' for (i = start, j = 0; j < out_nr - 2; j+=2, i++) { ') |
| if pr == PRENABLE: |
| def close_func(index): |
| do_line( intype, outtype, 'out+j', 'end', 'start', inpv, outpv ) |
| print(' start = i;') |
| print(' end = start;') |
| print(' j += 2;') |
| |
| prim_restart(2, 2, 1, close_func) |
| |
| do_line( intype, outtype, 'out+j', 'i', 'i+1', inpv, outpv ); |
| print(' end = i+1;') |
| print(' }') |
| do_line( intype, outtype, 'out+j', 'end', 'start', inpv, outpv ); |
| postamble() |
| |
| def tris(intype, outtype, inpv, outpv, pr): |
| preamble(intype, outtype, inpv, outpv, pr, prim='tris') |
| print(' for (i = start, j = 0; j < out_nr; j+=3, i+=3) { ') |
| do_tri( intype, outtype, 'out+j', 'i', 'i+1', 'i+2', inpv, outpv ); |
| print(' }') |
| postamble() |
| |
| |
| 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: |
| 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, pr): |
| preamble(intype, outtype, inpv, outpv, pr, prim='trifan') |
| print(' for (i = start, j = 0; j < out_nr; j+=3, i++) { ') |
| |
| if pr == PRENABLE: |
| def close_func(index): |
| print(' start = i;') |
| prim_restart(3, 3, 1, close_func) |
| |
| if inpv == FIRST: |
| do_tri( intype, outtype, 'out+j', 'i+1', 'i+2', 'start', inpv, outpv ); |
| else: |
| do_tri( intype, outtype, 'out+j', 'start', 'i+1', 'i+2', inpv, outpv ); |
| |
| print(' }') |
| postamble() |
| |
| |
| |
| 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: |
| def close_func(index): |
| print(' start = i;') |
| prim_restart(3, 3, 1, close_func) |
| |
| if inpv == FIRST: |
| do_tri( intype, outtype, 'out+j', 'start', 'i+1', 'i+2', inpv, outpv ); |
| else: |
| do_tri( intype, outtype, 'out+j', 'i+1', 'i+2', 'start', inpv, outpv ); |
| print(' }') |
| postamble() |
| |
| |
| 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: |
| prim_restart(4, 3, 2) |
| |
| do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3', inpv, outpv ); |
| print(' }') |
| postamble() |
| |
| |
| 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: |
| prim_restart(4, 3, 2) |
| |
| if inpv == LAST: |
| do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3', inpv, outpv ); |
| else: |
| do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+3', 'i+2', inpv, outpv ); |
| print(' }') |
| postamble() |
| |
| |
| def linesadj(intype, outtype, inpv, outpv, pr): |
| preamble(intype, outtype, inpv, outpv, pr, prim='linesadj') |
| print(' for (i = start, j = 0; j < out_nr; j+=4, i+=4) { ') |
| do_lineadj( intype, outtype, 'out+j', '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, j = 0; j < out_nr; j+=6, i+=6) { ') |
| do_triadj( intype, outtype, 'out+j', '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: |
| for inpv in (FIRST, LAST): |
| for outpv in (FIRST, LAST): |
| 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) |
| 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: |
| print ('generate[' + |
| outtype_idx[outtype] + |
| '][' + pv_idx[inpv] + |
| '][' + pv_idx[outpv] + |
| '][' + longprim[prim] + |
| '] = ' + name( intype, outtype, inpv, outpv, pr, prim ) + ';') |
| else: |
| print ('translate[' + |
| intype_idx[intype] + |
| '][' + outtype_idx[outtype] + |
| '][' + pv_idx[inpv] + |
| '][' + pv_idx[outpv] + |
| '][' + pr_idx[pr] + |
| '][' + longprim[prim] + |
| '] = ' + name( intype, outtype, inpv, outpv, pr, prim ) + ';') |
| |
| |
| def emit_all_inits(): |
| for intype in INTYPES: |
| for outtype in OUTTYPES: |
| for inpv in PVS: |
| for outpv in PVS: |
| for pr in PRS: |
| for prim in PRIMS: |
| init(intype, outtype, inpv, outpv, pr, 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() |