1#!/usr/bin/env python
2copyright = '''
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
28GENERATE, UBYTE, USHORT, UINT = 'generate', 'ubyte', 'ushort', 'uint'
29FIRST, LAST = 'first', 'last'
30
31INTYPES = (GENERATE, UBYTE, USHORT, UINT)
32OUTTYPES = (USHORT, UINT)
33PVS=(FIRST, LAST)
34PRIMS=('points',
35       'lines',
36       'linestrip',
37       'lineloop',
38       'tris',
39       'trifan',
40       'tristrip',
41       'quads',
42       'quadstrip',
43       'polygon')
44
45LONGPRIMS=('PIPE_PRIM_POINTS',
46           'PIPE_PRIM_LINES',
47           'PIPE_PRIM_LINE_STRIP',
48           'PIPE_PRIM_LINE_LOOP',
49           'PIPE_PRIM_TRIANGLES',
50           'PIPE_PRIM_TRIANGLE_FAN',
51           'PIPE_PRIM_TRIANGLE_STRIP',
52           'PIPE_PRIM_QUADS',
53           'PIPE_PRIM_QUAD_STRIP',
54           'PIPE_PRIM_POLYGON')
55
56longprim = dict(zip(PRIMS, LONGPRIMS))
57intype_idx = dict(ubyte='IN_UBYTE', ushort='IN_USHORT', uint='IN_UINT')
58outtype_idx = dict(ushort='OUT_USHORT', uint='OUT_UINT')
59pv_idx = dict(first='PV_FIRST', last='PV_LAST')
60
61
62def prolog():
63    print '''/* File automatically generated by indices.py */'''
64    print copyright
65    print r'''
66
67/**
68 * @file
69 * Functions to translate and generate index lists
70 */
71
72#include "indices/u_indices.h"
73#include "indices/u_indices_priv.h"
74#include "pipe/p_compiler.h"
75#include "util/u_debug.h"
76#include "pipe/p_defines.h"
77#include "util/u_memory.h"
78
79
80static unsigned out_size_idx( unsigned index_size )
81{
82   switch (index_size) {
83   case 4: return OUT_UINT;
84   case 2: return OUT_USHORT;
85   default: assert(0); return OUT_USHORT;
86   }
87}
88
89static unsigned in_size_idx( unsigned index_size )
90{
91   switch (index_size) {
92   case 4: return IN_UINT;
93   case 2: return IN_USHORT;
94   case 1: return IN_UBYTE;
95   default: assert(0); return IN_UBYTE;
96   }
97}
98
99
100static u_translate_func translate[IN_COUNT][OUT_COUNT][PV_COUNT][PV_COUNT][PRIM_COUNT];
101static u_generate_func  generate[OUT_COUNT][PV_COUNT][PV_COUNT][PRIM_COUNT];
102
103
104'''
105
106def vert( intype, outtype, v0 ):
107    if intype == GENERATE:
108        return '(' + outtype + ')(' + v0 + ')'
109    else:
110        return '(' + outtype + ')in[' + v0 + ']'
111
112def point( intype, outtype, ptr, v0 ):
113    print '      (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';'
114
115def line( intype, outtype, ptr, v0, v1 ):
116    print '      (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';'
117    print '      (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';'
118
119def tri( intype, outtype, ptr, v0, v1, v2 ):
120    print '      (' + ptr + ')[0] = ' + vert( intype, outtype, v0 ) + ';'
121    print '      (' + ptr + ')[1] = ' + vert( intype, outtype, v1 ) + ';'
122    print '      (' + ptr + ')[2] = ' + vert( intype, outtype, v2 ) + ';'
123
124def do_point( intype, outtype, ptr, v0 ):
125    point( intype, outtype, ptr, v0 )
126
127def do_line( intype, outtype, ptr, v0, v1, inpv, outpv ):
128    if inpv == outpv:
129        line( intype, outtype, ptr, v0, v1 )
130    else:
131        line( intype, outtype, ptr, v1, v0 )
132
133def do_tri( intype, outtype, ptr, v0, v1, v2, inpv, outpv ):
134    if inpv == outpv:
135        tri( intype, outtype, ptr, v0, v1, v2 )
136    else:
137        if inpv == FIRST:
138            tri( intype, outtype, ptr, v1, v2, v0 )
139        else:
140            tri( intype, outtype, ptr, v2, v0, v1 )
141
142def do_quad( intype, outtype, ptr, v0, v1, v2, v3, inpv, outpv ):
143    do_tri( intype, outtype, ptr+'+0',  v0, v1, v3, inpv, outpv );
144    do_tri( intype, outtype, ptr+'+3',  v1, v2, v3, inpv, outpv );
145
146def name(intype, outtype, inpv, outpv, prim):
147    if intype == GENERATE:
148        return 'generate_' + prim + '_' + outtype + '_' + inpv + '2' + outpv
149    else:
150        return 'translate_' + prim + '_' + intype + '2' + outtype + '_' + inpv + '2' + outpv
151
152def preamble(intype, outtype, inpv, outpv, prim):
153    print 'static void ' + name( intype, outtype, inpv, outpv, prim ) + '('
154    if intype != GENERATE:
155        print '    const void * _in,'
156    print '    unsigned nr,'
157    print '    void *_out )'
158    print '{'
159    if intype != GENERATE:
160        print '  const ' + intype + '*in = (const ' + intype + '*)_in;'
161    print '  ' + outtype + ' *out = (' + outtype + '*)_out;'
162    print '  unsigned i, j;'
163    print '  (void)j;'
164
165def postamble():
166    print '}'
167
168
169def points(intype, outtype, inpv, outpv):
170    preamble(intype, outtype, inpv, outpv, prim='points')
171    print '  for (i = 0; i < nr; i++) { '
172    do_point( intype, outtype, 'out+i',  'i' );
173    print '   }'
174    postamble()
175
176def lines(intype, outtype, inpv, outpv):
177    preamble(intype, outtype, inpv, outpv, prim='lines')
178    print '  for (i = 0; i < nr; i+=2) { '
179    do_line( intype, outtype, 'out+i',  'i', 'i+1', inpv, outpv );
180    print '   }'
181    postamble()
182
183def linestrip(intype, outtype, inpv, outpv):
184    preamble(intype, outtype, inpv, outpv, prim='linestrip')
185    print '  for (j = i = 0; j < nr; j+=2, i++) { '
186    do_line( intype, outtype, 'out+j',  'i', 'i+1', inpv, outpv );
187    print '   }'
188    postamble()
189
190def lineloop(intype, outtype, inpv, outpv):
191    preamble(intype, outtype, inpv, outpv, prim='lineloop')
192    print '  for (j = i = 0; j < nr - 2; j+=2, i++) { '
193    do_line( intype, outtype, 'out+j',  'i', 'i+1', inpv, outpv );
194    print '   }'
195    do_line( intype, outtype, 'out+j',  'i', '0', inpv, outpv );
196    postamble()
197
198def tris(intype, outtype, inpv, outpv):
199    preamble(intype, outtype, inpv, outpv, prim='tris')
200    print '  for (i = 0; i < nr; i+=3) { '
201    do_tri( intype, outtype, 'out+i',  'i', 'i+1', 'i+2', inpv, outpv );
202    print '   }'
203    postamble()
204
205
206def tristrip(intype, outtype, inpv, outpv):
207    preamble(intype, outtype, inpv, outpv, prim='tristrip')
208    print '  for (j = i = 0; j < nr; j+=3, i++) { '
209    if inpv == FIRST:
210        do_tri( intype, outtype, 'out+j',  'i', 'i+1+(i&1)', 'i+2-(i&1)', inpv, outpv );
211    else:
212        do_tri( intype, outtype, 'out+j',  'i+(i&1)', 'i+1-(i&1)', 'i+2', inpv, outpv );
213    print '   }'
214    postamble()
215
216
217def trifan(intype, outtype, inpv, outpv):
218    preamble(intype, outtype, inpv, outpv, prim='trifan')
219    print '  for (j = i = 0; j < nr; j+=3, i++) { '
220    do_tri( intype, outtype, 'out+j',  '0', 'i+1', 'i+2', inpv, outpv );
221    print '   }'
222    postamble()
223
224
225
226def polygon(intype, outtype, inpv, outpv):
227    preamble(intype, outtype, inpv, outpv, prim='polygon')
228    print '  for (j = i = 0; j < nr; j+=3, i++) { '
229    if inpv == FIRST:
230        do_tri( intype, outtype, 'out+j',  '0', 'i+1', 'i+2', inpv, outpv );
231    else:
232        do_tri( intype, outtype, 'out+j',  'i+1', 'i+2', '0', inpv, outpv );
233    print '   }'
234    postamble()
235
236
237def quads(intype, outtype, inpv, outpv):
238    preamble(intype, outtype, inpv, outpv, prim='quads')
239    print '  for (j = i = 0; j < nr; j+=6, i+=4) { '
240    do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+2', 'i+3', inpv, outpv );
241    print '   }'
242    postamble()
243
244
245def quadstrip(intype, outtype, inpv, outpv):
246    preamble(intype, outtype, inpv, outpv, prim='quadstrip')
247    print '  for (j = i = 0; j < nr; j+=6, i+=2) { '
248    do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3', inpv, outpv );
249    print '   }'
250    postamble()
251
252
253def emit_funcs():
254    for intype in INTYPES:
255        for outtype in OUTTYPES:
256            for inpv in (FIRST, LAST):
257                for outpv in (FIRST, LAST):
258                    points(intype, outtype, inpv, outpv)
259                    lines(intype, outtype, inpv, outpv)
260                    linestrip(intype, outtype, inpv, outpv)
261                    lineloop(intype, outtype, inpv, outpv)
262                    tris(intype, outtype, inpv, outpv)
263                    tristrip(intype, outtype, inpv, outpv)
264                    trifan(intype, outtype, inpv, outpv)
265                    quads(intype, outtype, inpv, outpv)
266                    quadstrip(intype, outtype, inpv, outpv)
267                    polygon(intype, outtype, inpv, outpv)
268
269def init(intype, outtype, inpv, outpv, prim):
270    if intype == GENERATE:
271        print ('generate[' +
272               outtype_idx[outtype] +
273               '][' + pv_idx[inpv] +
274               '][' + pv_idx[outpv] +
275               '][' + longprim[prim] +
276               '] = ' + name( intype, outtype, inpv, outpv, prim ) + ';')
277    else:
278        print ('translate[' +
279               intype_idx[intype] +
280               '][' + outtype_idx[outtype] +
281               '][' + pv_idx[inpv] +
282               '][' + pv_idx[outpv] +
283               '][' + longprim[prim] +
284               '] = ' + name( intype, outtype, inpv, outpv, prim ) + ';')
285
286
287def emit_all_inits():
288    for intype in INTYPES:
289        for outtype in OUTTYPES:
290            for inpv in PVS:
291                for outpv in PVS:
292                    for prim in PRIMS:
293                        init(intype, outtype, inpv, outpv, prim)
294
295def emit_init():
296    print 'void u_index_init( void )'
297    print '{'
298    print '  static int firsttime = 1;'
299    print '  if (!firsttime) return;'
300    print '  firsttime = 0;'
301    emit_all_inits()
302    print '}'
303
304
305
306
307def epilog():
308    print '#include "indices/u_indices.c"'
309
310
311def main():
312    prolog()
313    emit_funcs()
314    emit_init()
315    epilog()
316
317
318if __name__ == '__main__':
319    main()
320