464 lines
16 KiB
Python
464 lines
16 KiB
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'
|
|
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"
|
|
|
|
#include "c99_compat.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 * restrict _in,')
|
|
print(' unsigned start,')
|
|
if intype != GENERATE:
|
|
print(' unsigned in_nr,')
|
|
print(' unsigned out_nr,')
|
|
if intype != GENERATE:
|
|
print(' unsigned restart_index,')
|
|
print(' void * restrict _out )')
|
|
print('{')
|
|
if intype != GENERATE:
|
|
print(' const ' + intype + '* restrict in = (const ' + intype + '* restrict)_in;')
|
|
print(' ' + outtype + ' * restrict out = (' + outtype + '* restrict)_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()
|