blob: aa6849b53967fd2b22604c50fe7661b451d7ea01 [file] [log] [blame]
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.
*/
'''
import argparse
import itertools
import typing as T
GENERATE, UBYTE, USHORT, UINT = 'generate', 'ubyte', 'ushort', 'uint'
FIRST, LAST = 'first', 'last'
INTYPES = (GENERATE, UBYTE, USHORT, UINT)
OUTTYPES = (USHORT, UINT)
PRIMS=('tris',
'trifan',
'tristrip',
'quads',
'quadstrip',
'polygon',
'trisadj',
'tristripadj')
LONGPRIMS=('PIPE_PRIM_TRIANGLES',
'PIPE_PRIM_TRIANGLE_FAN',
'PIPE_PRIM_TRIANGLE_STRIP',
'PIPE_PRIM_QUADS',
'PIPE_PRIM_QUAD_STRIP',
'PIPE_PRIM_POLYGON',
'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')
def prolog(f: 'T.TextIO'):
f.write('/* File automatically generated by u_unfilled_gen.py */\n')
f.write(copyright)
f.write(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 u_generate_func generate_line[OUT_COUNT][PRIM_COUNT];
static u_translate_func translate_line[IN_COUNT][OUT_COUNT][PRIM_COUNT];
''')
def vert( intype, outtype, v0 ):
if intype == GENERATE:
return '(' + outtype + ')(' + v0 + ')'
else:
return '(' + outtype + ')in[' + v0 + ']'
def line(f: 'T.TextIO', intype, outtype, ptr, v0, v1 ):
f.write(' (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';\n')
f.write(' (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';\n')
# XXX: have the opportunity here to avoid over-drawing shared lines in
# tristrips, fans, etc, by integrating this into the calling functions
# and only emitting each line at most once.
#
def do_tri(f: 'T.TextIO', intype, outtype, ptr, v0, v1, v2 ):
line(f, intype, outtype, ptr, v0, v1 )
line(f, intype, outtype, ptr + '+2', v1, v2 )
line(f, intype, outtype, ptr + '+4', v2, v0 )
def do_quad(f: 'T.TextIO', intype, outtype, ptr, v0, v1, v2, v3 ):
line(f, intype, outtype, ptr, v0, v1 )
line(f, intype, outtype, ptr + '+2', v1, v2 )
line(f, intype, outtype, ptr + '+4', v2, v3 )
line(f, intype, outtype, ptr + '+6', v3, v0 )
def name(intype, outtype, prim):
if intype == GENERATE:
return 'generate_' + prim + '_' + outtype
else:
return 'translate_' + prim + '_' + intype + '2' + outtype
def preamble(f: 'T.TextIO', intype, outtype, prim):
f.write('static void ' + name( intype, outtype, prim ) + '(\n')
if intype != GENERATE:
f.write(' const void * _in,\n')
f.write(' unsigned start,\n')
if intype != GENERATE:
f.write(' unsigned in_nr,\n')
f.write(' unsigned out_nr,\n')
if intype != GENERATE:
f.write(' unsigned restart_index,\n')
f.write(' void *_out )\n')
f.write('{\n')
if intype != GENERATE:
f.write(' const ' + intype + '*in = (const ' + intype + '*)_in;\n')
f.write(' ' + outtype + ' *out = (' + outtype + '*)_out;\n')
f.write(' unsigned i, j;\n')
f.write(' (void)j;\n')
def postamble(f: 'T.TextIO'):
f.write('}\n')
def tris(f: 'T.TextIO', intype, outtype):
preamble(f, intype, outtype, prim='tris')
f.write(' for (i = start, j = 0; j < out_nr; j+=6, i+=3) {\n')
do_tri(f, intype, outtype, 'out+j', 'i', 'i+1', 'i+2' );
f.write(' }\n')
postamble(f)
def tristrip(f: 'T.TextIO', intype, outtype):
preamble(f, intype, outtype, prim='tristrip')
f.write(' for (i = start, j = 0; j < out_nr; j+=6, i++) {\n')
do_tri(f, intype, outtype, 'out+j', 'i', 'i+1/*+(i&1)*/', 'i+2/*-(i&1)*/' );
f.write(' }\n')
postamble(f)
def trifan(f: 'T.TextIO', intype, outtype):
preamble(f, intype, outtype, prim='trifan')
f.write(' for (i = start, j = 0; j < out_nr; j+=6, i++) {\n')
do_tri(f, intype, outtype, 'out+j', '0', 'i+1', 'i+2' );
f.write(' }\n')
postamble(f)
def polygon(f: 'T.TextIO', intype, outtype):
preamble(f, intype, outtype, prim='polygon')
f.write(' for (i = start, j = 0; j < out_nr; j+=2, i++) {\n')
line(f, intype, outtype, 'out+j', 'i', '(i+1)%(out_nr/2)\n' )
f.write(' }\n')
postamble(f)
def quads(f: 'T.TextIO', intype, outtype):
preamble(f, intype, outtype, prim='quads')
f.write(' for (i = start, j = 0; j < out_nr; j+=8, i+=4) {\n')
do_quad(f, intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3' );
f.write(' }\n')
postamble(f)
def quadstrip(f: 'T.TextIO', intype, outtype):
preamble(f, intype, outtype, prim='quadstrip')
f.write(' for (i = start, j = 0; j < out_nr; j+=8, i+=2) {\n')
do_quad(f, intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3' );
f.write(' }\n')
postamble(f)
def trisadj(f: 'T.TextIO', intype, outtype):
preamble(f, intype, outtype, prim='trisadj')
f.write(' for (i = start, j = 0; j < out_nr; j+=6, i+=6) {\n')
do_tri(f, intype, outtype, 'out+j', 'i', 'i+2', 'i+4' );
f.write(' }\n')
postamble(f)
def tristripadj(f: 'T.TextIO', intype, outtype):
preamble(f, intype, outtype, prim='tristripadj')
f.write(' for (i = start, j = 0; j < out_nr; j+=6, i+=2) {\n')
do_tri(f, intype, outtype, 'out+j', 'i', 'i+2', 'i+4' );
f.write(' }\n')
postamble(f)
def emit_funcs(f: 'T.TextIO'):
for intype, outtype in itertools.product(INTYPES, OUTTYPES):
tris(f, intype, outtype)
tristrip(f, intype, outtype)
trifan(f, intype, outtype)
quads(f, intype, outtype)
quadstrip(f, intype, outtype)
polygon(f, intype, outtype)
trisadj(f, intype, outtype)
tristripadj(f, intype, outtype)
def init(f: 'T.TextIO', intype, outtype, prim):
if intype == GENERATE:
f.write('generate_line[' +
outtype_idx[outtype] +
'][' + longprim[prim] +
'] = ' + name( intype, outtype, prim ) + ';\n')
else:
f.write('translate_line[' +
intype_idx[intype] +
'][' + outtype_idx[outtype] +
'][' + longprim[prim] +
'] = ' + name( intype, outtype, prim ) + ';\n')
def emit_all_inits(f: 'T.TextIO'):
for intype, outtype, prim in itertools.product(INTYPES, OUTTYPES, PRIMS):
init(f, intype, outtype, prim)
def emit_init(f: 'T.TextIO'):
f.write('void u_unfilled_init( void )\n')
f.write('{\n')
f.write(' static int firsttime = 1;\n')
f.write(' if (!firsttime) return;\n')
f.write(' firsttime = 0;\n')
emit_all_inits(f)
f.write('}\n')
def epilog(f: 'T.TextIO'):
f.write('#include "indices/u_unfilled_indices.c"\n')
def main():
parser = argparse.ArgumentParser()
parser.add_argument('output')
args = parser.parse_args()
with open(args.output, 'w') as f:
prolog(f)
emit_funcs(f)
emit_init(f)
epilog(f)
if __name__ == '__main__':
main()