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)
33PRIMS=('tris',
34       'trifan',
35       'tristrip',
36       'quads',
37       'quadstrip',
38       'polygon')
39
40LONGPRIMS=('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
47longprim = dict(zip(PRIMS, LONGPRIMS))
48intype_idx = dict(ubyte='IN_UBYTE', ushort='IN_USHORT', uint='IN_UINT')
49outtype_idx = dict(ushort='OUT_USHORT', uint='OUT_UINT')
50
51
52def 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
70static 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
79static 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
90static u_generate_func generate_line[OUT_COUNT][PRIM_COUNT];
91static u_translate_func translate_line[IN_COUNT][OUT_COUNT][PRIM_COUNT];
92
93'''
94
95def vert( intype, outtype, v0 ):
96    if intype == GENERATE:
97        return '(' + outtype + ')(' + v0 + ')'
98    else:
99        return '(' + outtype + ')in[' + v0 + ']'
100
101def 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#
109def 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
114def 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
120def name(intype, outtype, prim):
121    if intype == GENERATE:
122        return 'generate_' + prim + '_' + outtype
123    else:
124        return 'translate_' + prim + '_' + intype + '2' + outtype
125
126def 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
139def postamble():
140    print '}'
141
142
143def 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
151def 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
159def 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
168def 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
176def 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
184def 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
192def 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
202def 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
216def emit_all_inits():
217    for intype in INTYPES:
218        for outtype in OUTTYPES:
219            for prim in PRIMS:
220                init(intype, outtype, prim)
221
222def 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
234def epilog():
235    print '#include "indices/u_unfilled_indices.c"'
236
237
238def main():
239    prolog()
240    emit_funcs()
241    emit_init()
242    epilog()
243
244
245if __name__ == '__main__':
246    main()
247