Home | History | Annotate | Download | only in indices
      1 #!/usr/bin/env python
      2 copyright = '''
      3 /*
      4  * Copyright 2009 VMware, Inc.
      5  * All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * on the rights to use, copy, modify, merge, publish, distribute, sub
     11  * license, and/or sell copies of the Software, and to permit persons to whom
     12  * the Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the next
     15  * paragraph) shall be included in all copies or substantial portions of the
     16  * Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
     21  * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     24  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  */
     26 '''
     27 
     28 GENERATE, UBYTE, USHORT, UINT = 'generate', 'ubyte', 'ushort', 'uint'
     29 FIRST, LAST = 'first', 'last'
     30 
     31 INTYPES = (GENERATE, UBYTE, USHORT, UINT)
     32 OUTTYPES = (USHORT, UINT)
     33 PRIMS=('tris', 
     34        'trifan', 
     35        'tristrip', 
     36        'quads', 
     37        'quadstrip', 
     38        'polygon')
     39 
     40 LONGPRIMS=('PIPE_PRIM_TRIANGLES', 
     41            'PIPE_PRIM_TRIANGLE_FAN', 
     42            'PIPE_PRIM_TRIANGLE_STRIP', 
     43            'PIPE_PRIM_QUADS', 
     44            'PIPE_PRIM_QUAD_STRIP', 
     45            'PIPE_PRIM_POLYGON')
     46 
     47 longprim = dict(zip(PRIMS, LONGPRIMS))
     48 intype_idx = dict(ubyte='IN_UBYTE', ushort='IN_USHORT', uint='IN_UINT')
     49 outtype_idx = dict(ushort='OUT_USHORT', uint='OUT_UINT')
     50 
     51 
     52 def prolog():
     53     print '''/* File automatically generated by u_unfilled_gen.py */'''
     54     print copyright
     55     print r'''
     56 
     57 /**
     58  * @file
     59  * Functions to translate and generate index lists
     60  */
     61 
     62 #include "indices/u_indices.h"
     63 #include "indices/u_indices_priv.h"
     64 #include "pipe/p_compiler.h"
     65 #include "util/u_debug.h"
     66 #include "pipe/p_defines.h"
     67 #include "util/u_memory.h"
     68 
     69 
     70 static unsigned out_size_idx( unsigned index_size )
     71 {
     72    switch (index_size) {
     73    case 4: return OUT_UINT;
     74    case 2: return OUT_USHORT;
     75    default: assert(0); return OUT_USHORT;
     76    }
     77 }
     78 
     79 static unsigned in_size_idx( unsigned index_size )
     80 {
     81    switch (index_size) {
     82    case 4: return IN_UINT;
     83    case 2: return IN_USHORT;
     84    case 1: return IN_UBYTE;
     85    default: assert(0); return IN_UBYTE;
     86    }
     87 }
     88 
     89 
     90 static u_generate_func generate_line[OUT_COUNT][PRIM_COUNT];
     91 static u_translate_func translate_line[IN_COUNT][OUT_COUNT][PRIM_COUNT];
     92 
     93 '''
     94 
     95 def vert( intype, outtype, v0 ):
     96     if intype == GENERATE:
     97         return '(' + outtype + ')(' + v0 + ')'
     98     else:
     99         return '(' + outtype + ')in[' + v0 + ']'
    100 
    101 def line( intype, outtype, ptr, v0, v1 ):
    102     print '      (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';'
    103     print '      (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';'
    104 
    105 # XXX: have the opportunity here to avoid over-drawing shared lines in
    106 # tristrips, fans, etc, by integrating this into the calling functions
    107 # and only emitting each line at most once.
    108 # 
    109 def do_tri( intype, outtype, ptr, v0, v1, v2 ):
    110     line( intype, outtype, ptr, v0, v1 )
    111     line( intype, outtype, ptr + '+2', v1, v2 )
    112     line( intype, outtype, ptr + '+4', v2, v0 )
    113 
    114 def do_quad( intype, outtype, ptr, v0, v1, v2, v3 ):
    115     line( intype, outtype, ptr, v0, v1 )
    116     line( intype, outtype, ptr + '+2', v1, v2 )
    117     line( intype, outtype, ptr + '+4', v2, v3 )
    118     line( intype, outtype, ptr + '+6', v3, v0 )
    119 
    120 def name(intype, outtype, prim):
    121     if intype == GENERATE:
    122         return 'generate_' + prim + '_' + outtype
    123     else:
    124         return 'translate_' + prim + '_' + intype + '2' + outtype
    125 
    126 def preamble(intype, outtype, prim):
    127     print 'static void ' + name( intype, outtype, prim ) + '('
    128     if intype != GENERATE:
    129         print '    const void * _in,'
    130     print '    unsigned nr,'
    131     print '    void *_out )'
    132     print '{'
    133     if intype != GENERATE:
    134         print '  const ' + intype + '*in = (const ' + intype + '*)_in;'
    135     print '  ' + outtype + ' *out = (' + outtype + '*)_out;'
    136     print '  unsigned i, j;'
    137     print '  (void)j;'
    138 
    139 def postamble():
    140     print '}'
    141 
    142 
    143 def tris(intype, outtype):
    144     preamble(intype, outtype, prim='tris')
    145     print '  for (j = i = 0; j < nr; j+=6, i+=3) { '
    146     do_tri( intype, outtype, 'out+j',  'i', 'i+1', 'i+2' );
    147     print '   }'
    148     postamble()
    149 
    150 
    151 def tristrip(intype, outtype):
    152     preamble(intype, outtype, prim='tristrip')
    153     print '  for (j = i = 0; j < nr; j+=6, i++) { '
    154     do_tri( intype, outtype, 'out+j',  'i', 'i+1/*+(i&1)*/', 'i+2/*-(i&1)*/' );
    155     print '   }'
    156     postamble()
    157 
    158 
    159 def trifan(intype, outtype):
    160     preamble(intype, outtype, prim='trifan')
    161     print '  for (j = i = 0; j < nr; j+=6, i++) { '
    162     do_tri( intype, outtype, 'out+j',  '0', 'i+1', 'i+2' );
    163     print '   }'
    164     postamble()
    165 
    166 
    167 
    168 def polygon(intype, outtype):
    169     preamble(intype, outtype, prim='polygon')
    170     print '  for (j = i = 0; j < nr; j+=2, i++) { '
    171     line( intype, outtype, 'out+j', 'i', '(i+1)%(nr/2)' )
    172     print '   }'
    173     postamble()
    174 
    175 
    176 def quads(intype, outtype):
    177     preamble(intype, outtype, prim='quads')
    178     print '  for (j = i = 0; j < nr; j+=8, i+=4) { '
    179     do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3' );
    180     print '   }'
    181     postamble()
    182 
    183 
    184 def quadstrip(intype, outtype):
    185     preamble(intype, outtype, prim='quadstrip')
    186     print '  for (j = i = 0; j < nr; j+=8, i+=2) { '
    187     do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3' );
    188     print '   }'
    189     postamble()
    190 
    191 
    192 def emit_funcs():
    193     for intype in INTYPES:
    194         for outtype in OUTTYPES:
    195             tris(intype, outtype)
    196             tristrip(intype, outtype)
    197             trifan(intype, outtype)
    198             quads(intype, outtype)
    199             quadstrip(intype, outtype)
    200             polygon(intype, outtype)
    201 
    202 def init(intype, outtype, prim):
    203     if intype == GENERATE:
    204         print ('generate_line[' + 
    205                outtype_idx[outtype] + 
    206                '][' + longprim[prim] + 
    207                '] = ' + name( intype, outtype, prim ) + ';')
    208     else:
    209         print ('translate_line[' + 
    210                intype_idx[intype] + 
    211                '][' + outtype_idx[outtype] + 
    212                '][' + longprim[prim] + 
    213                '] = ' + name( intype, outtype, prim ) + ';')
    214 
    215 
    216 def emit_all_inits():
    217     for intype in INTYPES:
    218         for outtype in OUTTYPES:
    219             for prim in PRIMS:
    220                 init(intype, outtype, prim)
    221 
    222 def emit_init():
    223     print 'void u_unfilled_init( void )'
    224     print '{'
    225     print '  static int firsttime = 1;'
    226     print '  if (!firsttime) return;'
    227     print '  firsttime = 0;'
    228     emit_all_inits()
    229     print '}'
    230 
    231 
    232     
    233 
    234 def epilog():
    235     print '#include "indices/u_unfilled_indices.c"'
    236 
    237 
    238 def main():
    239     prolog()
    240     emit_funcs()
    241     emit_init()
    242     epilog()
    243 
    244 
    245 if __name__ == '__main__':
    246     main()
    247