Initial mach64 driver import for DRI mach64-0-0-6 branch,
[mesa.git] / src / mesa / drivers / dri / mach64 / mach64_vb.c
1 /* $XFree86$ */ /* -*- mode: c; c-basic-offset: 3 -*- */
2 /*
3 * Copyright 2000 Gareth Hughes
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * GARETH HUGHES BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25 /*
26 * Authors:
27 * Gareth Hughes <gareth@valinux.com>
28 * Leif Delgass <ldelgass@retinalburn.net>
29 * José Fonseca <j_r_fonseca@yahoo.co.uk>
30 */
31
32 #include "glheader.h"
33 #include "mtypes.h"
34 #include "imports.h"
35 #include "macros.h"
36 #include "colormac.h"
37
38 #include "swrast_setup/swrast_setup.h"
39 #include "tnl/t_context.h"
40
41 #include "mach64_context.h"
42 #include "mach64_vb.h"
43 #include "mach64_ioctl.h"
44 #include "mach64_tris.h"
45 #include "mach64_state.h"
46
47
48 #define MACH64_TEX1_BIT 0x1
49 #define MACH64_TEX0_BIT 0x2
50 #define MACH64_RGBA_BIT 0x4
51 #define MACH64_SPEC_BIT 0x8
52 #define MACH64_FOG_BIT 0x10
53 #define MACH64_XYZW_BIT 0x20
54 #define MACH64_PTEX_BIT 0x40
55 #define MACH64_MAX_SETUP 0x80
56
57 static struct {
58 void (*emit)( GLcontext *, GLuint, GLuint, void *, GLuint );
59 interp_func interp;
60 copy_pv_func copy_pv;
61 GLboolean (*check_tex_sizes)( GLcontext *ctx );
62 GLuint vertex_size;
63 GLuint vertex_stride_shift;
64 GLuint vertex_format;
65 } setup_tab[MACH64_MAX_SETUP];
66
67 #define TINY_VERTEX_FORMAT 1
68 #define NOTEX_VERTEX_FORMAT 2
69 #define TEX0_VERTEX_FORMAT 3
70 #define TEX1_VERTEX_FORMAT 4
71 #define PROJ_TEX1_VERTEX_FORMAT 0
72 #define TEX2_VERTEX_FORMAT 0
73 #define TEX3_VERTEX_FORMAT 0
74 #define PROJ_TEX3_VERTEX_FORMAT 0
75
76 #define DO_XYZW (IND & MACH64_XYZW_BIT)
77 #define DO_RGBA (IND & MACH64_RGBA_BIT)
78 #define DO_SPEC (IND & MACH64_SPEC_BIT)
79 #define DO_FOG (IND & MACH64_FOG_BIT)
80 #define DO_TEX0 (IND & MACH64_TEX0_BIT)
81 #define DO_TEX1 (IND & MACH64_TEX1_BIT)
82 #define DO_TEX2 0
83 #define DO_TEX3 0
84 #define DO_PTEX (IND & MACH64_PTEX_BIT)
85
86 #define VERTEX mach64Vertex
87 #define LOCALVARS mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
88 #define GET_VIEWPORT_MAT() mmesa->hw_viewport
89 #define GET_TEXSOURCE(n) mmesa->tmu_source[n]
90 #define GET_VERTEX_FORMAT() mmesa->vertex_format
91 #define GET_VERTEX_STORE() mmesa->verts
92 #define GET_VERTEX_STRIDE_SHIFT() mmesa->vertex_stride_shift
93
94 #define HAVE_HW_VIEWPORT 0
95 #define HAVE_HW_DIVIDE 0
96 #define HAVE_RGBA_COLOR 0
97 #define HAVE_TINY_VERTICES 1
98 #define HAVE_NOTEX_VERTICES 1
99 #define HAVE_TEX0_VERTICES 1
100 #define HAVE_TEX1_VERTICES 1
101 #define HAVE_TEX2_VERTICES 0
102 #define HAVE_TEX3_VERTICES 0
103 #define HAVE_PTEX_VERTICES 0
104
105 #define UNVIEWPORT_VARS \
106 const GLfloat dx = - (GLfloat)mmesa->drawX - SUBPIXEL_X; \
107 const GLfloat dy = (mmesa->driDrawable->h + \
108 (GLfloat)mmesa->drawY + SUBPIXEL_Y); \
109 const GLfloat sz = 1.0 / mmesa->depth_scale
110
111 #if MACH64_NATIVE_VTXFMT
112
113 #define UNVIEWPORT_X(x) ((GLfloat)(x) / 4.0) + dx
114 #define UNVIEWPORT_Y(y) - ((GLfloat)(y) / 4.0) + dy
115 #define UNVIEWPORT_Z(z) (GLfloat)((z) >> 15) * sz
116
117 #else
118
119 #define UNVIEWPORT_X(x) x + dx;
120 #define UNVIEWPORT_Y(y) - y + dy;
121 #define UNVIEWPORT_Z(z) z * sz;
122
123 #endif
124
125 #define PTEX_FALLBACK() FALLBACK(MACH64_CONTEXT(ctx), MACH64_FALLBACK_TEXTURE, 1)
126
127 #define IMPORT_FLOAT_COLORS mach64_import_float_colors
128 #define IMPORT_FLOAT_SPEC_COLORS mach64_import_float_spec_colors
129
130 #define INTERP_VERTEX setup_tab[mmesa->SetupIndex].interp
131 #define COPY_PV_VERTEX setup_tab[mmesa->SetupIndex].copy_pv
132
133 /***********************************************************************
134 * Generate pv-copying and translation functions *
135 ***********************************************************************/
136
137 #if MACH64_NATIVE_VTXFMT
138
139 #define TAG(x) mach64_##x
140 #include "mach64_native_vb.c"
141
142 #else
143
144 #define TAG(x) mach64_##x
145 #include "tnl_dd/t_dd_vb.c"
146
147 #endif
148
149 /***********************************************************************
150 * Generate vertex emit and interp functions *
151 ***********************************************************************/
152
153
154 #if MACH64_NATIVE_VTXFMT
155
156 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT)
157 #define TAG(x) x##_wg
158 #include "mach64_native_vbtmp.h"
159
160 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT)
161 #define TAG(x) x##_wgs
162 #include "mach64_native_vbtmp.h"
163
164 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT)
165 #define TAG(x) x##_wgt0
166 #include "mach64_native_vbtmp.h"
167
168 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
169 #define TAG(x) x##_wgt0t1
170 #include "mach64_native_vbtmp.h"
171
172 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_PTEX_BIT)
173 #define TAG(x) x##_wgpt0
174 #include "mach64_native_vbtmp.h"
175
176 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
177 #define TAG(x) x##_wgst0
178 #include "mach64_native_vbtmp.h"
179
180 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
181 MACH64_TEX1_BIT)
182 #define TAG(x) x##_wgst0t1
183 #include "mach64_native_vbtmp.h"
184
185 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
186 MACH64_PTEX_BIT)
187 #define TAG(x) x##_wgspt0
188 #include "mach64_native_vbtmp.h"
189
190 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT)
191 #define TAG(x) x##_wgf
192 #include "mach64_native_vbtmp.h"
193
194 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT)
195 #define TAG(x) x##_wgfs
196 #include "mach64_native_vbtmp.h"
197
198 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT)
199 #define TAG(x) x##_wgft0
200 #include "mach64_native_vbtmp.h"
201
202 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|\
203 MACH64_TEX1_BIT)
204 #define TAG(x) x##_wgft0t1
205 #include "mach64_native_vbtmp.h"
206
207 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|\
208 MACH64_PTEX_BIT)
209 #define TAG(x) x##_wgfpt0
210 #include "mach64_native_vbtmp.h"
211
212 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
213 MACH64_TEX0_BIT)
214 #define TAG(x) x##_wgfst0
215 #include "mach64_native_vbtmp.h"
216
217 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
218 MACH64_TEX0_BIT|MACH64_TEX1_BIT)
219 #define TAG(x) x##_wgfst0t1
220 #include "mach64_native_vbtmp.h"
221
222 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
223 MACH64_TEX0_BIT|MACH64_PTEX_BIT)
224 #define TAG(x) x##_wgfspt0
225 #include "mach64_native_vbtmp.h"
226
227 #define IND (MACH64_TEX0_BIT)
228 #define TAG(x) x##_t0
229 #include "mach64_native_vbtmp.h"
230
231 #define IND (MACH64_TEX0_BIT|MACH64_TEX1_BIT)
232 #define TAG(x) x##_t0t1
233 #include "mach64_native_vbtmp.h"
234
235 #define IND (MACH64_FOG_BIT)
236 #define TAG(x) x##_f
237 #include "mach64_native_vbtmp.h"
238
239 #define IND (MACH64_FOG_BIT|MACH64_TEX0_BIT)
240 #define TAG(x) x##_ft0
241 #include "mach64_native_vbtmp.h"
242
243 #define IND (MACH64_FOG_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
244 #define TAG(x) x##_ft0t1
245 #include "mach64_native_vbtmp.h"
246
247 #define IND (MACH64_RGBA_BIT)
248 #define TAG(x) x##_g
249 #include "mach64_native_vbtmp.h"
250
251 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT)
252 #define TAG(x) x##_gs
253 #include "mach64_native_vbtmp.h"
254
255 #define IND (MACH64_RGBA_BIT|MACH64_TEX0_BIT)
256 #define TAG(x) x##_gt0
257 #include "mach64_native_vbtmp.h"
258
259 #define IND (MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
260 #define TAG(x) x##_gt0t1
261 #include "mach64_native_vbtmp.h"
262
263 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
264 #define TAG(x) x##_gst0
265 #include "mach64_native_vbtmp.h"
266
267 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
268 #define TAG(x) x##_gst0t1
269 #include "mach64_native_vbtmp.h"
270
271 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT)
272 #define TAG(x) x##_gf
273 #include "mach64_native_vbtmp.h"
274
275 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT)
276 #define TAG(x) x##_gfs
277 #include "mach64_native_vbtmp.h"
278
279 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT)
280 #define TAG(x) x##_gft0
281 #include "mach64_native_vbtmp.h"
282
283 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
284 #define TAG(x) x##_gft0t1
285 #include "mach64_native_vbtmp.h"
286
287 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
288 #define TAG(x) x##_gfst0
289 #include "mach64_native_vbtmp.h"
290
291 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
292 MACH64_TEX1_BIT)
293 #define TAG(x) x##_gfst0t1
294 #include "mach64_native_vbtmp.h"
295
296 #else
297
298 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT)
299 #define TAG(x) x##_wg
300 #include "mach64_vbtmp.h"
301
302 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT)
303 #define TAG(x) x##_wgs
304 #include "mach64_vbtmp.h"
305
306 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT)
307 #define TAG(x) x##_wgt0
308 #include "mach64_vbtmp.h"
309
310 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
311 #define TAG(x) x##_wgt0t1
312 #include "mach64_vbtmp.h"
313
314 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_PTEX_BIT)
315 #define TAG(x) x##_wgpt0
316 #include "mach64_vbtmp.h"
317
318 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
319 #define TAG(x) x##_wgst0
320 #include "mach64_vbtmp.h"
321
322 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
323 MACH64_TEX1_BIT)
324 #define TAG(x) x##_wgst0t1
325 #include "mach64_vbtmp.h"
326
327 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
328 MACH64_PTEX_BIT)
329 #define TAG(x) x##_wgspt0
330 #include "mach64_vbtmp.h"
331
332 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT)
333 #define TAG(x) x##_wgf
334 #include "mach64_vbtmp.h"
335
336 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT)
337 #define TAG(x) x##_wgfs
338 #include "mach64_vbtmp.h"
339
340 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT)
341 #define TAG(x) x##_wgft0
342 #include "mach64_vbtmp.h"
343
344 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|\
345 MACH64_TEX1_BIT)
346 #define TAG(x) x##_wgft0t1
347 #include "mach64_vbtmp.h"
348
349 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|\
350 MACH64_PTEX_BIT)
351 #define TAG(x) x##_wgfpt0
352 #include "mach64_vbtmp.h"
353
354 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
355 MACH64_TEX0_BIT)
356 #define TAG(x) x##_wgfst0
357 #include "mach64_vbtmp.h"
358
359 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
360 MACH64_TEX0_BIT|MACH64_TEX1_BIT)
361 #define TAG(x) x##_wgfst0t1
362 #include "mach64_vbtmp.h"
363
364 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
365 MACH64_TEX0_BIT|MACH64_PTEX_BIT)
366 #define TAG(x) x##_wgfspt0
367 #include "mach64_vbtmp.h"
368
369 #define IND (MACH64_TEX0_BIT)
370 #define TAG(x) x##_t0
371 #include "mach64_vbtmp.h"
372
373 #define IND (MACH64_TEX0_BIT|MACH64_TEX1_BIT)
374 #define TAG(x) x##_t0t1
375 #include "mach64_vbtmp.h"
376
377 #define IND (MACH64_FOG_BIT)
378 #define TAG(x) x##_f
379 #include "mach64_vbtmp.h"
380
381 #define IND (MACH64_FOG_BIT|MACH64_TEX0_BIT)
382 #define TAG(x) x##_ft0
383 #include "mach64_vbtmp.h"
384
385 #define IND (MACH64_FOG_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
386 #define TAG(x) x##_ft0t1
387 #include "mach64_vbtmp.h"
388
389 #define IND (MACH64_RGBA_BIT)
390 #define TAG(x) x##_g
391 #include "mach64_vbtmp.h"
392
393 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT)
394 #define TAG(x) x##_gs
395 #include "mach64_vbtmp.h"
396
397 #define IND (MACH64_RGBA_BIT|MACH64_TEX0_BIT)
398 #define TAG(x) x##_gt0
399 #include "mach64_vbtmp.h"
400
401 #define IND (MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
402 #define TAG(x) x##_gt0t1
403 #include "mach64_vbtmp.h"
404
405 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
406 #define TAG(x) x##_gst0
407 #include "mach64_vbtmp.h"
408
409 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
410 #define TAG(x) x##_gst0t1
411 #include "mach64_vbtmp.h"
412
413 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT)
414 #define TAG(x) x##_gf
415 #include "mach64_vbtmp.h"
416
417 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT)
418 #define TAG(x) x##_gfs
419 #include "mach64_vbtmp.h"
420
421 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT)
422 #define TAG(x) x##_gft0
423 #include "mach64_vbtmp.h"
424
425 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
426 #define TAG(x) x##_gft0t1
427 #include "mach64_vbtmp.h"
428
429 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
430 #define TAG(x) x##_gfst0
431 #include "mach64_vbtmp.h"
432
433 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
434 MACH64_TEX1_BIT)
435 #define TAG(x) x##_gfst0t1
436 #include "mach64_vbtmp.h"
437
438 #endif
439
440 static void init_setup_tab( void )
441 {
442 init_wg();
443 init_wgs();
444 init_wgt0();
445 init_wgt0t1();
446 init_wgpt0();
447 init_wgst0();
448 init_wgst0t1();
449 init_wgspt0();
450 init_wgf();
451 init_wgfs();
452 init_wgft0();
453 init_wgft0t1();
454 init_wgfpt0();
455 init_wgfst0();
456 init_wgfst0t1();
457 init_wgfspt0();
458 init_t0();
459 init_t0t1();
460 init_f();
461 init_ft0();
462 init_ft0t1();
463 init_g();
464 init_gs();
465 init_gt0();
466 init_gt0t1();
467 init_gst0();
468 init_gst0t1();
469 init_gf();
470 init_gfs();
471 init_gft0();
472 init_gft0t1();
473 init_gfst0();
474 init_gfst0t1();
475 }
476
477
478
479 void mach64PrintSetupFlags( char *msg, GLuint flags )
480 {
481 fprintf( stderr, "%s: %d %s%s%s%s%s%s%s\n",
482 msg,
483 (int)flags,
484 (flags & MACH64_XYZW_BIT) ? " xyzw," : "",
485 (flags & MACH64_RGBA_BIT) ? " rgba," : "",
486 (flags & MACH64_SPEC_BIT) ? " spec," : "",
487 (flags & MACH64_FOG_BIT) ? " fog," : "",
488 (flags & MACH64_TEX0_BIT) ? " tex-0," : "",
489 (flags & MACH64_TEX1_BIT) ? " tex-1," : "",
490 (flags & MACH64_PTEX_BIT) ? " ptex," : "");
491 }
492
493
494
495
496 void mach64CheckTexSizes( GLcontext *ctx )
497 {
498 mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
499
500 if (!setup_tab[mmesa->SetupIndex].check_tex_sizes(ctx)) {
501 TNLcontext *tnl = TNL_CONTEXT(ctx);
502
503 /* Invalidate stored verts
504 */
505 mmesa->SetupNewInputs = ~0;
506 mmesa->SetupIndex |= MACH64_PTEX_BIT;
507
508 if (!mmesa->Fallback &&
509 !(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
510 tnl->Driver.Render.Interp = setup_tab[mmesa->SetupIndex].interp;
511 tnl->Driver.Render.CopyPV = setup_tab[mmesa->SetupIndex].copy_pv;
512 }
513 }
514 }
515
516 void mach64BuildVertices( GLcontext *ctx,
517 GLuint start,
518 GLuint count,
519 GLuint newinputs )
520 {
521 mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
522 GLubyte *v = ((GLubyte *)mmesa->verts + (start<<mmesa->vertex_stride_shift));
523 GLuint stride = 1<<mmesa->vertex_stride_shift;
524
525 newinputs |= mmesa->SetupNewInputs;
526 mmesa->SetupNewInputs = 0;
527
528 if (!newinputs)
529 return;
530
531 if (newinputs & VERT_BIT_POS) {
532 setup_tab[mmesa->SetupIndex].emit( ctx, start, count, v, stride );
533 } else {
534 GLuint ind = 0;
535
536 if (newinputs & VERT_BIT_COLOR0)
537 ind |= MACH64_RGBA_BIT;
538
539 if (newinputs & VERT_BIT_COLOR1)
540 ind |= MACH64_SPEC_BIT;
541
542 if (newinputs & VERT_BIT_TEX0)
543 ind |= MACH64_TEX0_BIT;
544
545 if (newinputs & VERT_BIT_TEX1)
546 ind |= MACH64_TEX1_BIT;
547
548 if (newinputs & VERT_BIT_FOG)
549 ind |= MACH64_FOG_BIT;
550
551 if (mmesa->SetupIndex & MACH64_PTEX_BIT)
552 ind = ~0;
553
554 ind &= mmesa->SetupIndex;
555
556 if (ind) {
557 setup_tab[ind].emit( ctx, start, count, v, stride );
558 }
559 }
560 }
561
562 void mach64ChooseVertexState( GLcontext *ctx )
563 {
564 TNLcontext *tnl = TNL_CONTEXT(ctx);
565 mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
566 GLuint ind = MACH64_XYZW_BIT|MACH64_RGBA_BIT;
567
568 if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
569 ind |= MACH64_SPEC_BIT;
570
571 if (ctx->Fog.Enabled)
572 ind |= MACH64_FOG_BIT;
573
574 if (ctx->Texture._EnabledUnits) {
575 ind |= MACH64_TEX0_BIT;
576 if (ctx->Texture.Unit[0]._ReallyEnabled &&
577 ctx->Texture.Unit[1]._ReallyEnabled) {
578 ind |= MACH64_TEX1_BIT;
579 }
580 }
581
582 mmesa->SetupIndex = ind;
583
584 if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) {
585 tnl->Driver.Render.Interp = mach64_interp_extras;
586 tnl->Driver.Render.CopyPV = mach64_copy_pv_extras;
587 } else {
588 tnl->Driver.Render.Interp = setup_tab[ind].interp;
589 tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv;
590 }
591
592 #if 0
593 if (MACH64_DEBUG & DEBUG_VERBOSE_MSG) {
594 mach64PrintSetupFlags( __FUNCTION__, ind );
595 }
596 #endif
597
598 if (setup_tab[ind].vertex_format != mmesa->vertex_format) {
599 FLUSH_BATCH(mmesa);
600 mmesa->vertex_format = setup_tab[ind].vertex_format;
601 mmesa->vertex_size = setup_tab[ind].vertex_size;
602 mmesa->vertex_stride_shift = setup_tab[ind].vertex_stride_shift;
603 }
604 }
605
606
607 #if 0
608 void mach64_emit_contiguous_verts( GLcontext *ctx,
609 GLuint start,
610 GLuint count )
611 {
612 mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
613 GLuint vertex_size = mmesa->vertex_size * 4;
614 GLuint *dest = mach64AllocDmaLow( mmesa, (count-start) * vertex_size);
615 setup_tab[mmesa->SetupIndex].emit( ctx, start, count, dest, vertex_size );
616 }
617 #endif
618
619
620 void mach64InitVB( GLcontext *ctx )
621 {
622 mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
623 GLuint size = TNL_CONTEXT(ctx)->vb.Size;
624
625 mmesa->verts = (char *)ALIGN_MALLOC(size * 4 * 16, 32);
626
627 {
628 static int firsttime = 1;
629 if (firsttime) {
630 init_setup_tab();
631 firsttime = 0;
632 }
633 }
634 }
635
636
637 void mach64FreeVB( GLcontext *ctx )
638 {
639 mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
640 if (mmesa->verts) {
641 ALIGN_FREE(mmesa->verts);
642 mmesa->verts = 0;
643 }
644 }