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