Merge commit 'origin/gallium-0.1' into gallium-0.2
[mesa.git] / src / mesa / drivers / dri / mach64 / mach64_vb.c
1 /* -*- 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 "main/glheader.h"
33 #include "main/mtypes.h"
34 #include "main/imports.h"
35 #include "main/macros.h"
36 #include "main/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 tnl_interp_func interp;
60 tnl_copy_pv_func copy_pv;
61 GLboolean (*check_tex_sizes)( GLcontext *ctx );
62 GLuint vertex_size;
63 GLuint vertex_format;
64 } setup_tab[MACH64_MAX_SETUP];
65
66 #define TINY_VERTEX_FORMAT 1
67 #define NOTEX_VERTEX_FORMAT 2
68 #define TEX0_VERTEX_FORMAT 3
69 #define TEX1_VERTEX_FORMAT 4
70 #define PROJ_TEX1_VERTEX_FORMAT 0
71 #define TEX2_VERTEX_FORMAT 0
72 #define TEX3_VERTEX_FORMAT 0
73 #define PROJ_TEX3_VERTEX_FORMAT 0
74
75 #define DO_XYZW (IND & MACH64_XYZW_BIT)
76 #define DO_RGBA (IND & MACH64_RGBA_BIT)
77 #define DO_SPEC (IND & MACH64_SPEC_BIT)
78 #define DO_FOG (IND & MACH64_FOG_BIT)
79 #define DO_TEX0 (IND & MACH64_TEX0_BIT)
80 #define DO_TEX1 (IND & MACH64_TEX1_BIT)
81 #define DO_TEX2 0
82 #define DO_TEX3 0
83 #define DO_PTEX (IND & MACH64_PTEX_BIT)
84
85 #define VERTEX mach64Vertex
86 #define LOCALVARS mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
87 #define GET_VIEWPORT_MAT() mmesa->hw_viewport
88 #define GET_TEXSOURCE(n) mmesa->tmu_source[n]
89 #define GET_VERTEX_FORMAT() mmesa->vertex_format
90 #define GET_VERTEX_STORE() mmesa->verts
91 #define GET_VERTEX_SIZE() mmesa->vertex_size * sizeof(GLuint)
92
93 #define HAVE_HW_VIEWPORT 0
94 #define HAVE_HW_DIVIDE 0
95 #define HAVE_RGBA_COLOR 0
96 #define HAVE_TINY_VERTICES 1
97 #define HAVE_NOTEX_VERTICES 1
98 #define HAVE_TEX0_VERTICES 1
99 #define HAVE_TEX1_VERTICES 1
100 #define HAVE_TEX2_VERTICES 0
101 #define HAVE_TEX3_VERTICES 0
102 #define HAVE_PTEX_VERTICES 0
103
104 #define UNVIEWPORT_VARS \
105 const GLfloat dx = - (GLfloat)mmesa->drawX - SUBPIXEL_X; \
106 const GLfloat dy = (mmesa->driDrawable->h + \
107 (GLfloat)mmesa->drawY + SUBPIXEL_Y); \
108 const GLfloat sz = 1.0 / mmesa->depth_scale
109
110 #if MACH64_NATIVE_VTXFMT
111
112 #define UNVIEWPORT_X(x) ((GLfloat)(x) / 4.0) + dx
113 #define UNVIEWPORT_Y(y) - ((GLfloat)(y) / 4.0) + dy
114 #define UNVIEWPORT_Z(z) (GLfloat)((z) >> 15) * sz
115
116 #else
117
118 #define UNVIEWPORT_X(x) x + dx;
119 #define UNVIEWPORT_Y(y) - y + dy;
120 #define UNVIEWPORT_Z(z) z * sz;
121
122 #endif
123
124 #define PTEX_FALLBACK() FALLBACK(MACH64_CONTEXT(ctx), MACH64_FALLBACK_TEXTURE, 1)
125
126 #define IMPORT_FLOAT_COLORS mach64_import_float_colors
127 #define IMPORT_FLOAT_SPEC_COLORS mach64_import_float_spec_colors
128
129 #define INTERP_VERTEX setup_tab[mmesa->SetupIndex].interp
130 #define COPY_PV_VERTEX setup_tab[mmesa->SetupIndex].copy_pv
131
132 /***********************************************************************
133 * Generate pv-copying and translation functions *
134 ***********************************************************************/
135
136 #if MACH64_NATIVE_VTXFMT
137
138 #define TAG(x) mach64_##x
139 #include "mach64_native_vb.c"
140
141 #else
142
143 #define TAG(x) mach64_##x
144 #include "tnl_dd/t_dd_vb.c"
145
146 #endif
147
148 /***********************************************************************
149 * Generate vertex emit and interp functions *
150 ***********************************************************************/
151
152
153 #if MACH64_NATIVE_VTXFMT
154
155 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT)
156 #define TAG(x) x##_wg
157 #include "mach64_native_vbtmp.h"
158
159 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT)
160 #define TAG(x) x##_wgs
161 #include "mach64_native_vbtmp.h"
162
163 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT)
164 #define TAG(x) x##_wgt0
165 #include "mach64_native_vbtmp.h"
166
167 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
168 #define TAG(x) x##_wgt0t1
169 #include "mach64_native_vbtmp.h"
170
171 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_PTEX_BIT)
172 #define TAG(x) x##_wgpt0
173 #include "mach64_native_vbtmp.h"
174
175 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
176 #define TAG(x) x##_wgst0
177 #include "mach64_native_vbtmp.h"
178
179 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
180 MACH64_TEX1_BIT)
181 #define TAG(x) x##_wgst0t1
182 #include "mach64_native_vbtmp.h"
183
184 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
185 MACH64_PTEX_BIT)
186 #define TAG(x) x##_wgspt0
187 #include "mach64_native_vbtmp.h"
188
189 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT)
190 #define TAG(x) x##_wgf
191 #include "mach64_native_vbtmp.h"
192
193 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT)
194 #define TAG(x) x##_wgfs
195 #include "mach64_native_vbtmp.h"
196
197 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT)
198 #define TAG(x) x##_wgft0
199 #include "mach64_native_vbtmp.h"
200
201 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|\
202 MACH64_TEX1_BIT)
203 #define TAG(x) x##_wgft0t1
204 #include "mach64_native_vbtmp.h"
205
206 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|\
207 MACH64_PTEX_BIT)
208 #define TAG(x) x##_wgfpt0
209 #include "mach64_native_vbtmp.h"
210
211 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
212 MACH64_TEX0_BIT)
213 #define TAG(x) x##_wgfst0
214 #include "mach64_native_vbtmp.h"
215
216 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
217 MACH64_TEX0_BIT|MACH64_TEX1_BIT)
218 #define TAG(x) x##_wgfst0t1
219 #include "mach64_native_vbtmp.h"
220
221 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
222 MACH64_TEX0_BIT|MACH64_PTEX_BIT)
223 #define TAG(x) x##_wgfspt0
224 #include "mach64_native_vbtmp.h"
225
226 #define IND (MACH64_TEX0_BIT)
227 #define TAG(x) x##_t0
228 #include "mach64_native_vbtmp.h"
229
230 #define IND (MACH64_TEX0_BIT|MACH64_TEX1_BIT)
231 #define TAG(x) x##_t0t1
232 #include "mach64_native_vbtmp.h"
233
234 #define IND (MACH64_FOG_BIT)
235 #define TAG(x) x##_f
236 #include "mach64_native_vbtmp.h"
237
238 #define IND (MACH64_FOG_BIT|MACH64_TEX0_BIT)
239 #define TAG(x) x##_ft0
240 #include "mach64_native_vbtmp.h"
241
242 #define IND (MACH64_FOG_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
243 #define TAG(x) x##_ft0t1
244 #include "mach64_native_vbtmp.h"
245
246 #define IND (MACH64_RGBA_BIT)
247 #define TAG(x) x##_g
248 #include "mach64_native_vbtmp.h"
249
250 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT)
251 #define TAG(x) x##_gs
252 #include "mach64_native_vbtmp.h"
253
254 #define IND (MACH64_RGBA_BIT|MACH64_TEX0_BIT)
255 #define TAG(x) x##_gt0
256 #include "mach64_native_vbtmp.h"
257
258 #define IND (MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
259 #define TAG(x) x##_gt0t1
260 #include "mach64_native_vbtmp.h"
261
262 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
263 #define TAG(x) x##_gst0
264 #include "mach64_native_vbtmp.h"
265
266 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
267 #define TAG(x) x##_gst0t1
268 #include "mach64_native_vbtmp.h"
269
270 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT)
271 #define TAG(x) x##_gf
272 #include "mach64_native_vbtmp.h"
273
274 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT)
275 #define TAG(x) x##_gfs
276 #include "mach64_native_vbtmp.h"
277
278 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT)
279 #define TAG(x) x##_gft0
280 #include "mach64_native_vbtmp.h"
281
282 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
283 #define TAG(x) x##_gft0t1
284 #include "mach64_native_vbtmp.h"
285
286 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
287 #define TAG(x) x##_gfst0
288 #include "mach64_native_vbtmp.h"
289
290 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
291 MACH64_TEX1_BIT)
292 #define TAG(x) x##_gfst0t1
293 #include "mach64_native_vbtmp.h"
294
295 #else
296
297 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT)
298 #define TAG(x) x##_wg
299 #include "mach64_vbtmp.h"
300
301 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT)
302 #define TAG(x) x##_wgs
303 #include "mach64_vbtmp.h"
304
305 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT)
306 #define TAG(x) x##_wgt0
307 #include "mach64_vbtmp.h"
308
309 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
310 #define TAG(x) x##_wgt0t1
311 #include "mach64_vbtmp.h"
312
313 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_PTEX_BIT)
314 #define TAG(x) x##_wgpt0
315 #include "mach64_vbtmp.h"
316
317 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
318 #define TAG(x) x##_wgst0
319 #include "mach64_vbtmp.h"
320
321 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
322 MACH64_TEX1_BIT)
323 #define TAG(x) x##_wgst0t1
324 #include "mach64_vbtmp.h"
325
326 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
327 MACH64_PTEX_BIT)
328 #define TAG(x) x##_wgspt0
329 #include "mach64_vbtmp.h"
330
331 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT)
332 #define TAG(x) x##_wgf
333 #include "mach64_vbtmp.h"
334
335 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT)
336 #define TAG(x) x##_wgfs
337 #include "mach64_vbtmp.h"
338
339 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT)
340 #define TAG(x) x##_wgft0
341 #include "mach64_vbtmp.h"
342
343 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|\
344 MACH64_TEX1_BIT)
345 #define TAG(x) x##_wgft0t1
346 #include "mach64_vbtmp.h"
347
348 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|\
349 MACH64_PTEX_BIT)
350 #define TAG(x) x##_wgfpt0
351 #include "mach64_vbtmp.h"
352
353 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
354 MACH64_TEX0_BIT)
355 #define TAG(x) x##_wgfst0
356 #include "mach64_vbtmp.h"
357
358 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
359 MACH64_TEX0_BIT|MACH64_TEX1_BIT)
360 #define TAG(x) x##_wgfst0t1
361 #include "mach64_vbtmp.h"
362
363 #define IND (MACH64_XYZW_BIT|MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|\
364 MACH64_TEX0_BIT|MACH64_PTEX_BIT)
365 #define TAG(x) x##_wgfspt0
366 #include "mach64_vbtmp.h"
367
368 #define IND (MACH64_TEX0_BIT)
369 #define TAG(x) x##_t0
370 #include "mach64_vbtmp.h"
371
372 #define IND (MACH64_TEX0_BIT|MACH64_TEX1_BIT)
373 #define TAG(x) x##_t0t1
374 #include "mach64_vbtmp.h"
375
376 #define IND (MACH64_FOG_BIT)
377 #define TAG(x) x##_f
378 #include "mach64_vbtmp.h"
379
380 #define IND (MACH64_FOG_BIT|MACH64_TEX0_BIT)
381 #define TAG(x) x##_ft0
382 #include "mach64_vbtmp.h"
383
384 #define IND (MACH64_FOG_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
385 #define TAG(x) x##_ft0t1
386 #include "mach64_vbtmp.h"
387
388 #define IND (MACH64_RGBA_BIT)
389 #define TAG(x) x##_g
390 #include "mach64_vbtmp.h"
391
392 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT)
393 #define TAG(x) x##_gs
394 #include "mach64_vbtmp.h"
395
396 #define IND (MACH64_RGBA_BIT|MACH64_TEX0_BIT)
397 #define TAG(x) x##_gt0
398 #include "mach64_vbtmp.h"
399
400 #define IND (MACH64_RGBA_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
401 #define TAG(x) x##_gt0t1
402 #include "mach64_vbtmp.h"
403
404 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
405 #define TAG(x) x##_gst0
406 #include "mach64_vbtmp.h"
407
408 #define IND (MACH64_RGBA_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
409 #define TAG(x) x##_gst0t1
410 #include "mach64_vbtmp.h"
411
412 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT)
413 #define TAG(x) x##_gf
414 #include "mach64_vbtmp.h"
415
416 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT)
417 #define TAG(x) x##_gfs
418 #include "mach64_vbtmp.h"
419
420 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT)
421 #define TAG(x) x##_gft0
422 #include "mach64_vbtmp.h"
423
424 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_TEX0_BIT|MACH64_TEX1_BIT)
425 #define TAG(x) x##_gft0t1
426 #include "mach64_vbtmp.h"
427
428 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT)
429 #define TAG(x) x##_gfst0
430 #include "mach64_vbtmp.h"
431
432 #define IND (MACH64_RGBA_BIT|MACH64_FOG_BIT|MACH64_SPEC_BIT|MACH64_TEX0_BIT|\
433 MACH64_TEX1_BIT)
434 #define TAG(x) x##_gfst0t1
435 #include "mach64_vbtmp.h"
436
437 #endif
438
439 static void init_setup_tab( void )
440 {
441 init_wg();
442 init_wgs();
443 init_wgt0();
444 init_wgt0t1();
445 init_wgpt0();
446 init_wgst0();
447 init_wgst0t1();
448 init_wgspt0();
449 init_wgf();
450 init_wgfs();
451 init_wgft0();
452 init_wgft0t1();
453 init_wgfpt0();
454 init_wgfst0();
455 init_wgfst0t1();
456 init_wgfspt0();
457 init_t0();
458 init_t0t1();
459 init_f();
460 init_ft0();
461 init_ft0t1();
462 init_g();
463 init_gs();
464 init_gt0();
465 init_gt0t1();
466 init_gst0();
467 init_gst0t1();
468 init_gf();
469 init_gfs();
470 init_gft0();
471 init_gft0t1();
472 init_gfst0();
473 init_gfst0t1();
474 }
475
476
477
478 void mach64PrintSetupFlags( char *msg, GLuint flags )
479 {
480 fprintf( stderr, "%s: %d %s%s%s%s%s%s%s\n",
481 msg,
482 (int)flags,
483 (flags & MACH64_XYZW_BIT) ? " xyzw," : "",
484 (flags & MACH64_RGBA_BIT) ? " rgba," : "",
485 (flags & MACH64_SPEC_BIT) ? " spec," : "",
486 (flags & MACH64_FOG_BIT) ? " fog," : "",
487 (flags & MACH64_TEX0_BIT) ? " tex-0," : "",
488 (flags & MACH64_TEX1_BIT) ? " tex-1," : "",
489 (flags & MACH64_PTEX_BIT) ? " ptex," : "");
490 }
491
492
493
494
495 void mach64CheckTexSizes( GLcontext *ctx )
496 {
497 mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
498
499 if (!setup_tab[mmesa->SetupIndex].check_tex_sizes(ctx)) {
500 TNLcontext *tnl = TNL_CONTEXT(ctx);
501
502 /* Invalidate stored verts
503 */
504 mmesa->SetupNewInputs = ~0;
505 mmesa->SetupIndex |= MACH64_PTEX_BIT;
506
507 if (!mmesa->Fallback &&
508 !(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
509 tnl->Driver.Render.Interp = setup_tab[mmesa->SetupIndex].interp;
510 tnl->Driver.Render.CopyPV = setup_tab[mmesa->SetupIndex].copy_pv;
511 }
512 }
513 }
514
515 void mach64BuildVertices( GLcontext *ctx,
516 GLuint start,
517 GLuint count,
518 GLuint newinputs )
519 {
520 mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
521 GLuint stride = mmesa->vertex_size * sizeof(int);
522 GLubyte *v = ((GLubyte *)mmesa->verts + (start * stride));
523
524 newinputs |= mmesa->SetupNewInputs;
525 mmesa->SetupNewInputs = 0;
526
527 if (!newinputs)
528 return;
529
530 if (newinputs & VERT_BIT_POS) {
531 setup_tab[mmesa->SetupIndex].emit( ctx, start, count, v, stride );
532 } else {
533 GLuint ind = 0;
534
535 if (newinputs & VERT_BIT_COLOR0)
536 ind |= MACH64_RGBA_BIT;
537
538 if (newinputs & VERT_BIT_COLOR1)
539 ind |= MACH64_SPEC_BIT;
540
541 if (newinputs & VERT_BIT_TEX0)
542 ind |= MACH64_TEX0_BIT;
543
544 if (newinputs & VERT_BIT_TEX1)
545 ind |= MACH64_TEX1_BIT;
546
547 if (newinputs & VERT_BIT_FOG)
548 ind |= MACH64_FOG_BIT;
549
550 if (mmesa->SetupIndex & MACH64_PTEX_BIT)
551 ind = ~0;
552
553 ind &= mmesa->SetupIndex;
554
555 if (ind) {
556 setup_tab[ind].emit( ctx, start, count, v, stride );
557 }
558 }
559 }
560
561 void mach64ChooseVertexState( GLcontext *ctx )
562 {
563 TNLcontext *tnl = TNL_CONTEXT(ctx);
564 mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
565 GLuint ind = MACH64_XYZW_BIT|MACH64_RGBA_BIT;
566
567 if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
568 ind |= MACH64_SPEC_BIT;
569
570 if (ctx->Fog.Enabled)
571 ind |= MACH64_FOG_BIT;
572
573 if (ctx->Texture._EnabledUnits) {
574 ind |= MACH64_TEX0_BIT;
575 if (ctx->Texture.Unit[0]._ReallyEnabled &&
576 ctx->Texture.Unit[1]._ReallyEnabled) {
577 ind |= MACH64_TEX1_BIT;
578 }
579 }
580
581 mmesa->SetupIndex = ind;
582
583 if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) {
584 tnl->Driver.Render.Interp = mach64_interp_extras;
585 tnl->Driver.Render.CopyPV = mach64_copy_pv_extras;
586 } else {
587 tnl->Driver.Render.Interp = setup_tab[ind].interp;
588 tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv;
589 }
590
591 #if 0
592 if (MACH64_DEBUG & DEBUG_VERBOSE_MSG) {
593 mach64PrintSetupFlags( __FUNCTION__, ind );
594 }
595 #endif
596
597 if (setup_tab[ind].vertex_format != mmesa->vertex_format) {
598 FLUSH_BATCH(mmesa);
599 mmesa->vertex_format = setup_tab[ind].vertex_format;
600 mmesa->vertex_size = setup_tab[ind].vertex_size;
601 }
602 }
603
604
605 #if 0
606 void mach64_emit_contiguous_verts( GLcontext *ctx,
607 GLuint start,
608 GLuint count )
609 {
610 mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
611 GLuint vertex_size = mmesa->vertex_size * 4;
612 GLuint *dest = mach64AllocDmaLow( mmesa, (count-start) * vertex_size);
613 setup_tab[mmesa->SetupIndex].emit( ctx, start, count, dest, vertex_size );
614 }
615 #endif
616
617
618 void mach64InitVB( GLcontext *ctx )
619 {
620 mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
621 GLuint size = TNL_CONTEXT(ctx)->vb.Size;
622
623 mmesa->verts = (GLubyte *)ALIGN_MALLOC(size * 4 * 16, 32);
624
625 {
626 static int firsttime = 1;
627 if (firsttime) {
628 init_setup_tab();
629 firsttime = 0;
630 }
631 }
632 }
633
634
635 void mach64FreeVB( GLcontext *ctx )
636 {
637 mach64ContextPtr mmesa = MACH64_CONTEXT(ctx);
638 if (mmesa->verts) {
639 ALIGN_FREE(mmesa->verts);
640 mmesa->verts = 0;
641 }
642 }