more r500 vs r300 kickin
[mesa.git] / src / mesa / drivers / dri / ffb / ffb_rendertmp.h
1 /* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_rendertmp.h,v 1.2 2003/01/29 23:00:40 dawes Exp $ */
2
3 #define IMPL_LOCAL_VARS \
4 ffbContextPtr fmesa = FFB_CONTEXT(ctx); \
5 ffb_fbcPtr ffb = fmesa->regs; \
6 const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \
7 FFB_DELAYED_VIEWPORT_VARS; \
8 (void) fmesa; (void) ffb; (void) elt
9
10 #if (IND & FFB_FLAT_BIT)
11 #define FFB_DECLARE_CACHED_COLOR(NAME) \
12 unsigned int NAME;
13 #define FFB_COMPUTE_CACHED_COLOR(NAME, VTX) \
14 NAME = FFB_PACK_CONST_UBYTE_ARGB_COLOR((VTX)->color[0])
15 #define FFB_CACHED_COLOR_SAME(NAME1, NAME2) \
16 ((NAME1) == (NAME2))
17 #define FFB_CACHED_COLOR_SET(NAME) \
18 ffb->fg = (NAME)
19 #define FFB_CACHED_COLOR_UPDATE(NAME1, NAME2) \
20 ffb->fg = (NAME1) = (NAME2)
21 #define FFB_SET_PRIM_COLOR(COLOR_VERTEX) \
22 ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR((COLOR_VERTEX)->color[0])
23 #define FFB_PRIM_COLOR_COST 1
24 #define FFB_SET_VERTEX_COLOR(VTX) /**/
25 #define FFB_VERTEX_COLOR_COST 0
26 #else
27 #define FFB_DECLARE_CACHED_COLOR(NAME) /**/
28 #define FFB_COMPUTE_CACHED_COLOR(NAME, VTX) /**/
29 #define FFB_CACHED_COLOR_SAME(NAME1, NAME2) 0
30 #define FFB_CACHED_COLOR_SET(NAME1) /**/
31 #define FFB_CACHED_COLOR_UPDATE(NAME1, NAME2) /**/
32 #define FFB_SET_PRIM_COLOR(COLOR_VERTEX) /**/
33 #define FFB_PRIM_COLOR_COST 0
34 #if (IND & FFB_ALPHA_BIT)
35 #define FFB_SET_VERTEX_COLOR(VTX) \
36 ffb->alpha = FFB_GET_ALPHA(VTX); \
37 ffb->red = FFB_GET_RED(VTX); \
38 ffb->green = FFB_GET_GREEN(VTX); \
39 ffb->blue = FFB_GET_BLUE(VTX)
40 #define FFB_VERTEX_COLOR_COST 4
41 #else
42 #define FFB_SET_VERTEX_COLOR(VTX) \
43 ffb->red = FFB_GET_RED(VTX); \
44 ffb->green = FFB_GET_GREEN(VTX); \
45 ffb->blue = FFB_GET_BLUE(VTX)
46 #define FFB_VERTEX_COLOR_COST 3
47 #endif
48 #endif
49
50 #define RESET_STIPPLE ffb->lpat = fmesa->lpat;
51
52 #if !(IND & (FFB_TRI_CULL_BIT))
53 static void TAG(ffb_vb_points)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
54 {
55 GLint i;
56 IMPL_LOCAL_VARS;
57
58 #ifdef FFB_RENDER_TRACE
59 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
60 __FUNCTION__, start, count, flags);
61 #endif
62 ffbRenderPrimitive(ctx, GL_POINTS);
63 if (ctx->_TriangleCaps & DD_POINT_SMOOTH) {
64 for (i = start; i < count; i++) {
65 ffb_vertex *v0 = &fmesa->verts[ELT(i)];
66
67 FFBFifo(fmesa, 4);
68 ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR(v0->color[0]);
69 ffb->z = FFB_GET_Z(v0);
70 ffb->y = FFB_GET_Y(v0) + 0x8000 /* FIX ME */;
71 ffb->x = FFB_GET_X(v0) + 0x8000 /* FIX ME */;
72 }
73 } else {
74 for (i = start; i < count; i++) {
75 ffb_vertex *v0 = &fmesa->verts[ELT(i)];
76 FFBFifo(fmesa, 4);
77 ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR(v0->color[0]);
78 ffb->constz = Z_FROM_MESA(FFB_Z_TO_FLOAT(FFB_GET_Z(v0)));
79 ffb->bh = FFB_GET_Y(v0) >> 16;
80 ffb->bw = FFB_GET_X(v0) >> 16;
81 }
82 }
83
84 fmesa->ffbScreen->rp_active = 1;
85 }
86
87 static void TAG(ffb_vb_lines)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
88 {
89 GLint i;
90 IMPL_LOCAL_VARS;
91
92 #ifdef FFB_RENDER_TRACE
93 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
94 __FUNCTION__, start, count, flags);
95 #endif
96 ffbRenderPrimitive(ctx, GL_LINES);
97 for (i = start + 1; i < count; i += 2) {
98 ffb_vertex *v0 = &fmesa->verts[i - 1];
99 ffb_vertex *v1 = &fmesa->verts[i - 0];
100
101 FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST +
102 (FFB_VERTEX_COLOR_COST * 2) + 6));
103
104 RESET_STIPPLE;
105
106 FFB_SET_PRIM_COLOR(v1);
107
108 FFB_SET_VERTEX_COLOR(v0);
109 ffb->z = FFB_GET_Z(v0);
110 ffb->ryf = FFB_GET_Y(v0);
111 ffb->rxf = FFB_GET_X(v0);
112
113 FFB_SET_VERTEX_COLOR(v1);
114 ffb->z = FFB_GET_Z(v1);
115 ffb->y = FFB_GET_Y(v1);
116 ffb->x = FFB_GET_X(v1);
117 }
118 }
119
120 static void TAG(ffb_vb_line_loop)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
121 {
122 GLint i;
123 IMPL_LOCAL_VARS;
124
125 #ifdef FFB_RENDER_TRACE
126 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
127 __FUNCTION__, start, count, flags);
128 #endif
129 ffbRenderPrimitive(ctx, GL_LINE_LOOP);
130 if ((flags & PRIM_BEGIN) != 0) {
131 ffb_vertex *v0 = &fmesa->verts[ELT(start + 0)];
132 ffb_vertex *v1 = &fmesa->verts[ELT(start + 1)];
133
134 FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST +
135 ((FFB_VERTEX_COLOR_COST * 2) + (3 * 2))));
136
137 RESET_STIPPLE;
138
139 FFB_SET_PRIM_COLOR(v1);
140
141 FFB_SET_VERTEX_COLOR(v0);
142 ffb->z = FFB_GET_Z(v0);
143 ffb->ryf = FFB_GET_Y(v0);
144 ffb->rxf = FFB_GET_X(v0);
145
146 FFB_SET_VERTEX_COLOR(v1);
147 ffb->z = FFB_GET_Z(v1);
148 ffb->y = FFB_GET_Y(v1);
149 ffb->x = FFB_GET_X(v1);
150 }
151 for (i = start + 2; i < count; i++) {
152 ffb_vertex *v0 = &fmesa->verts[ELT(i)];
153
154 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
155 (FFB_VERTEX_COLOR_COST + 3)));
156
157 FFB_SET_PRIM_COLOR(v0);
158
159 FFB_SET_VERTEX_COLOR(v0);
160 ffb->z = FFB_GET_Z(v0);
161 ffb->y = FFB_GET_Y(v0);
162 ffb->x = FFB_GET_X(v0);
163 }
164 if ((flags & PRIM_END) != 0) {
165 ffb_vertex *v0 = &fmesa->verts[ELT(start)];
166
167 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
168 (FFB_VERTEX_COLOR_COST + 3)));
169
170 FFB_SET_PRIM_COLOR(v0);
171
172 FFB_SET_VERTEX_COLOR(v0);
173 ffb->z = FFB_GET_Z(v0);
174 ffb->y = FFB_GET_Y(v0);
175 ffb->x = FFB_GET_X(v0);
176 }
177
178 fmesa->ffbScreen->rp_active = 1;
179 }
180
181 static void TAG(ffb_vb_line_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
182 {
183 GLint i;
184 FFB_DECLARE_CACHED_COLOR(cached_fg)
185 IMPL_LOCAL_VARS;
186
187 #ifdef FFB_RENDER_TRACE
188 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
189 __FUNCTION__, start, count, flags);
190 #endif
191 ffbRenderPrimitive(ctx, GL_LINE_STRIP);
192 FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST +
193 ((FFB_VERTEX_COLOR_COST * 2) + (3 * 2))));
194
195 RESET_STIPPLE;
196
197 {
198 ffb_vertex *v0 = &fmesa->verts[ELT(start + 0)];
199 ffb_vertex *v1 = &fmesa->verts[ELT(start + 1)];
200
201 FFB_COMPUTE_CACHED_COLOR(cached_fg, v0);
202 FFB_CACHED_COLOR_SET(cached_fg);
203
204 FFB_SET_VERTEX_COLOR(v0);
205 ffb->z = FFB_GET_Z(v0);
206 ffb->ryf = FFB_GET_Y(v0);
207 ffb->rxf = FFB_GET_X(v0);
208
209 FFB_SET_VERTEX_COLOR(v1);
210 ffb->z = FFB_GET_Z(v1);
211 ffb->y = FFB_GET_Y(v1);
212 ffb->x = FFB_GET_X(v1);
213 }
214
215 for (i = start + 2; i < count; i++) {
216 ffb_vertex *v1 = &fmesa->verts[ELT(i - 0)];
217 FFB_DECLARE_CACHED_COLOR(new_fg)
218
219 FFB_COMPUTE_CACHED_COLOR(new_fg, v1);
220 if (FFB_CACHED_COLOR_SAME(cached_fg, new_fg)) {
221 FFBFifo(fmesa, ((FFB_VERTEX_COLOR_COST * 1) + (3 * 1)));
222 } else {
223 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
224 (FFB_VERTEX_COLOR_COST * 1) + (3 * 1)));
225 FFB_CACHED_COLOR_UPDATE(cached_fg, new_fg);
226 }
227
228 FFB_SET_VERTEX_COLOR(v1);
229 ffb->z = FFB_GET_Z(v1);
230 ffb->y = FFB_GET_Y(v1);
231 ffb->x = FFB_GET_X(v1);
232 }
233
234 fmesa->ffbScreen->rp_active = 1;
235 }
236 #endif /* !(IND & (FFB_TRI_CULL_BIT)) */
237
238 /* OK, now things start getting fun :-) */
239 #if (IND & (FFB_TRI_CULL_BIT))
240 #define FFB_AREA_DECLARE GLfloat cc, ex, ey, fx, fy;
241 #define FFB_COMPUTE_AREA_TRI(V0, V1, V2) \
242 { ex = (V1)->x - (V0)->x; \
243 ey = (V1)->y - (V0)->y; \
244 fx = (V2)->x - (V0)->x; \
245 fy = (V2)->y - (V0)->y; \
246 cc = ex*fy-ey*fx; \
247 }
248 #define FFB_COMPUTE_AREA_QUAD(V0, V1, V2, V3) \
249 { ex = (V2)->x - (V0)->x; \
250 ey = (V2)->y - (V0)->y; \
251 fx = (V3)->x - (V1)->x; \
252 fy = (V3)->y - (V1)->y; \
253 cc = ex*fy-ey*fx; \
254 }
255 #else
256 #define FFB_AREA_DECLARE /**/
257 #define FFB_COMPUTE_AREA_TRI(V0, V1, V2) do { } while(0)
258 #define FFB_COMPUTE_AREA_QUAD(V0, V1, V2, V3) do { } while(0)
259 #endif
260
261 #if (IND & FFB_TRI_CULL_BIT)
262 #define FFB_CULL_TRI(CULL_ACTION) \
263 if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \
264 CULL_ACTION \
265 }
266 #define FFB_CULL_QUAD(CULL_ACTION) \
267 if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \
268 CULL_ACTION \
269 }
270 #else
271 #define FFB_CULL_TRI(CULL_ACTION) do { } while (0)
272 #define FFB_CULL_QUAD(CULL_ACTION) do { } while (0)
273 #endif
274
275 static void TAG(ffb_vb_triangles)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
276 {
277 GLint i;
278 IMPL_LOCAL_VARS;
279
280 #ifdef FFB_RENDER_TRACE
281 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
282 __FUNCTION__, start, count, flags);
283 #endif
284 ffbRenderPrimitive(ctx, GL_TRIANGLES);
285 for (i = start + 2; i < count; i += 3) {
286 ffb_vertex *v0 = &fmesa->verts[ELT(i - 2)];
287 ffb_vertex *v1 = &fmesa->verts[ELT(i - 1)];
288 ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)];
289 FFB_AREA_DECLARE
290
291 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
292 FFB_CULL_TRI(continue;);
293
294 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
295 (FFB_VERTEX_COLOR_COST * 3) + 9));
296 FFB_SET_PRIM_COLOR(v2);
297
298 FFB_SET_VERTEX_COLOR(v0);
299 ffb->z = FFB_GET_Z(v0);
300 ffb->ryf = FFB_GET_Y(v0);
301 ffb->rxf = FFB_GET_X(v0);
302
303 FFB_SET_VERTEX_COLOR(v1);
304 ffb->z = FFB_GET_Z(v1);
305 ffb->y = FFB_GET_Y(v1);
306 ffb->x = FFB_GET_X(v1);
307
308 FFB_SET_VERTEX_COLOR(v2);
309 ffb->z = FFB_GET_Z(v2);
310 ffb->y = FFB_GET_Y(v2);
311 ffb->x = FFB_GET_X(v2);
312 }
313
314 fmesa->ffbScreen->rp_active = 1;
315 }
316
317 static void TAG(ffb_vb_tri_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
318 {
319 GLint i;
320 GLint parity = 0;
321 IMPL_LOCAL_VARS;
322
323 #ifdef FFB_RENDER_TRACE
324 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
325 __FUNCTION__, start, count, flags);
326 #endif
327 ffbRenderPrimitive(ctx, GL_TRIANGLE_STRIP);
328
329 i = start + 2;
330 goto something_clipped;
331
332 something_clipped:
333 for (; i < count; i++, parity ^= 1) {
334 ffb_vertex *v0 = &fmesa->verts[ELT(i - 2 + parity)];
335 ffb_vertex *v1 = &fmesa->verts[ELT(i - 1 - parity)];
336 ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)];
337 FFB_AREA_DECLARE
338
339 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
340 FFB_CULL_TRI(continue;);
341
342 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
343 (FFB_VERTEX_COLOR_COST * 3) + 9));
344 FFB_SET_PRIM_COLOR(v2);
345
346 FFB_SET_VERTEX_COLOR(v0);
347 ffb->z = FFB_GET_Z(v0);
348 ffb->ryf = FFB_GET_Y(v0);
349 ffb->rxf = FFB_GET_X(v0);
350
351 FFB_SET_VERTEX_COLOR(v1);
352 ffb->z = FFB_GET_Z(v1);
353 ffb->y = FFB_GET_Y(v1);
354 ffb->x = FFB_GET_X(v1);
355
356 FFB_SET_VERTEX_COLOR(v2);
357 ffb->z = FFB_GET_Z(v2);
358 ffb->y = FFB_GET_Y(v2);
359 ffb->x = FFB_GET_X(v2);
360
361 i++;
362 parity ^= 1;
363 break;
364 }
365
366 for (; i < count; i++, parity ^= 1) {
367 ffb_vertex *v0 = &fmesa->verts[ELT(i - 2 + parity)];
368 ffb_vertex *v1 = &fmesa->verts[ELT(i - 1 - parity)];
369 ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)];
370 FFB_AREA_DECLARE
371 (void) v0; (void) v1;
372
373 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
374 FFB_CULL_TRI(i++; parity^=1; goto something_clipped;);
375
376 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
377 (FFB_VERTEX_COLOR_COST * 1) + 3));
378 FFB_SET_PRIM_COLOR(v2);
379
380 FFB_SET_VERTEX_COLOR(v2);
381 ffb->z = FFB_GET_Z(v2);
382 ffb->y = FFB_GET_Y(v2);
383 ffb->x = FFB_GET_X(v2);
384 }
385
386 fmesa->ffbScreen->rp_active = 1;
387 }
388
389 static void TAG(ffb_vb_tri_fan)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
390 {
391 GLint i;
392 IMPL_LOCAL_VARS;
393
394 #ifdef FFB_RENDER_TRACE
395 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
396 __FUNCTION__, start, count, flags);
397 #endif
398 ffbRenderPrimitive(ctx, GL_TRIANGLE_FAN);
399
400 i = start + 2;
401 goto something_clipped;
402
403 something_clipped:
404 for ( ; i < count; i++) {
405 ffb_vertex *v0 = &fmesa->verts[ELT(start)];
406 ffb_vertex *v1 = &fmesa->verts[ELT(i - 1)];
407 ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)];
408 FFB_AREA_DECLARE
409
410 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
411 FFB_CULL_TRI(continue;);
412
413 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
414 (FFB_VERTEX_COLOR_COST * 3) + 9));
415 FFB_SET_PRIM_COLOR(v2);
416
417 FFB_SET_VERTEX_COLOR(v0);
418 ffb->z = FFB_GET_Z(v0);
419 ffb->ryf = FFB_GET_Y(v0);
420 ffb->rxf = FFB_GET_X(v0);
421
422 FFB_SET_VERTEX_COLOR(v1);
423 ffb->z = FFB_GET_Z(v1);
424 ffb->y = FFB_GET_Y(v1);
425 ffb->x = FFB_GET_X(v1);
426
427 FFB_SET_VERTEX_COLOR(v2);
428 ffb->z = FFB_GET_Z(v2);
429 ffb->y = FFB_GET_Y(v2);
430 ffb->x = FFB_GET_X(v2);
431
432 i++;
433 break;
434 }
435
436 for (; i < count; i++) {
437 ffb_vertex *v0 = &fmesa->verts[ELT(start)];
438 ffb_vertex *v1 = &fmesa->verts[ELT(i - 1)];
439 ffb_vertex *v2 = &fmesa->verts[ELT(i - 0)];
440 FFB_AREA_DECLARE
441 (void) v0; (void) v1;
442
443 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
444 FFB_CULL_TRI(i++; goto something_clipped;);
445
446 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
447 (FFB_VERTEX_COLOR_COST * 1) + 3));
448 FFB_SET_PRIM_COLOR(v2);
449
450 FFB_SET_VERTEX_COLOR(v2);
451 ffb->z = FFB_GET_Z(v2);
452 ffb->dmyf = FFB_GET_Y(v2);
453 ffb->dmxf = FFB_GET_X(v2);
454 }
455
456 fmesa->ffbScreen->rp_active = 1;
457 }
458
459 static void TAG(ffb_vb_poly)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
460 {
461 GLint i;
462 IMPL_LOCAL_VARS;
463
464 #ifdef FFB_RENDER_TRACE
465 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
466 __FUNCTION__, start, count, flags);
467 #endif
468 ffbRenderPrimitive(ctx, GL_POLYGON);
469
470 /* XXX Optimize XXX */
471 for (i = start + 2; i < count; i++) {
472 ffb_vertex *v0 = &fmesa->verts[ELT(i - 1)];
473 ffb_vertex *v1 = &fmesa->verts[ELT(i)];
474 ffb_vertex *v2 = &fmesa->verts[ELT(start)];
475 FFB_AREA_DECLARE
476
477 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
478 FFB_CULL_TRI(continue;);
479
480 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
481 (FFB_VERTEX_COLOR_COST * 3) + 9));
482 FFB_SET_PRIM_COLOR(v2);
483
484 FFB_SET_VERTEX_COLOR(v0);
485 ffb->z = FFB_GET_Z(v0);
486 ffb->ryf = FFB_GET_Y(v0);
487 ffb->rxf = FFB_GET_X(v0);
488
489 FFB_SET_VERTEX_COLOR(v1);
490 ffb->z = FFB_GET_Z(v1);
491 ffb->y = FFB_GET_Y(v1);
492 ffb->x = FFB_GET_X(v1);
493
494 FFB_SET_VERTEX_COLOR(v2);
495 ffb->z = FFB_GET_Z(v2);
496 ffb->y = FFB_GET_Y(v2);
497 ffb->x = FFB_GET_X(v2);
498 }
499
500 fmesa->ffbScreen->rp_active = 1;
501 }
502
503 static void TAG(ffb_vb_quads)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
504 {
505 GLint i;
506 IMPL_LOCAL_VARS;
507
508 #ifdef FFB_RENDER_TRACE
509 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
510 __FUNCTION__, start, count, flags);
511 #endif
512 ffbRenderPrimitive(ctx, GL_QUADS);
513
514 for (i = start + 3; i < count; i += 4) {
515 ffb_vertex *v0 = &fmesa->verts[ELT(i - 3)];
516 ffb_vertex *v1 = &fmesa->verts[ELT(i - 2)];
517 ffb_vertex *v2 = &fmesa->verts[ELT(i - 1)];
518 ffb_vertex *v3 = &fmesa->verts[ELT(i - 0)];
519 FFB_AREA_DECLARE
520
521 FFB_COMPUTE_AREA_QUAD(v0, v1, v2, v3);
522 FFB_CULL_QUAD(continue;);
523
524 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
525 (FFB_VERTEX_COLOR_COST * 4) + 12));
526 FFB_SET_PRIM_COLOR(v3);
527
528 FFB_SET_VERTEX_COLOR(v0);
529 ffb->z = FFB_GET_Z(v0);
530 ffb->ryf = FFB_GET_Y(v0);
531 ffb->rxf = FFB_GET_X(v0);
532
533 FFB_SET_VERTEX_COLOR(v1);
534 ffb->z = FFB_GET_Z(v1);
535 ffb->y = FFB_GET_Y(v1);
536 ffb->x = FFB_GET_X(v1);
537
538 FFB_SET_VERTEX_COLOR(v2);
539 ffb->z = FFB_GET_Z(v2);
540 ffb->y = FFB_GET_Y(v2);
541 ffb->x = FFB_GET_X(v2);
542
543 FFB_SET_VERTEX_COLOR(v3);
544 ffb->z = FFB_GET_Z(v3);
545 ffb->dmyf = FFB_GET_Y(v3);
546 ffb->dmxf = FFB_GET_X(v3);
547 }
548
549 fmesa->ffbScreen->rp_active = 1;
550 }
551
552 static void TAG(ffb_vb_quad_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
553 {
554 GLint i;
555 IMPL_LOCAL_VARS;
556
557 #ifdef FFB_RENDER_TRACE
558 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
559 __FUNCTION__, start, count, flags);
560 #endif
561 ffbRenderPrimitive(ctx, GL_QUAD_STRIP);
562
563 /* XXX Optimize XXX */
564 for (i = start + 3; i < count; i += 2) {
565 ffb_vertex *v0 = &fmesa->verts[ELT(i - 1)];
566 ffb_vertex *v1 = &fmesa->verts[ELT(i - 3)];
567 ffb_vertex *v2 = &fmesa->verts[ELT(i - 2)];
568 ffb_vertex *v3 = &fmesa->verts[ELT(i - 0)];
569 FFB_AREA_DECLARE
570
571 FFB_COMPUTE_AREA_QUAD(v0, v1, v2, v3);
572 FFB_CULL_QUAD(continue;);
573
574 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
575 (FFB_VERTEX_COLOR_COST * 4) + 12));
576 FFB_SET_PRIM_COLOR(v3);
577
578 FFB_DUMP_VERTEX(v0);
579 FFB_SET_VERTEX_COLOR(v0);
580 ffb->z = FFB_GET_Z(v0);
581 ffb->ryf = FFB_GET_Y(v0);
582 ffb->rxf = FFB_GET_X(v0);
583
584 FFB_DUMP_VERTEX(v1);
585 FFB_SET_VERTEX_COLOR(v1);
586 ffb->z = FFB_GET_Z(v1);
587 ffb->y = FFB_GET_Y(v1);
588 ffb->x = FFB_GET_X(v1);
589
590 FFB_DUMP_VERTEX(v2);
591 FFB_SET_VERTEX_COLOR(v2);
592 ffb->z = FFB_GET_Z(v2);
593 ffb->y = FFB_GET_Y(v2);
594 ffb->x = FFB_GET_X(v2);
595
596 FFB_DUMP_VERTEX(v3);
597 FFB_SET_VERTEX_COLOR(v3);
598 ffb->z = FFB_GET_Z(v3);
599 ffb->dmyf = FFB_GET_Y(v3);
600 ffb->dmxf = FFB_GET_X(v3);
601 }
602
603 fmesa->ffbScreen->rp_active = 1;
604 }
605
606 static void (*TAG(render_tab)[GL_POLYGON + 2])(GLcontext *, GLuint, GLuint, GLuint) =
607 {
608 #if !(IND & (FFB_TRI_CULL_BIT))
609 TAG(ffb_vb_points),
610 TAG(ffb_vb_lines),
611 TAG(ffb_vb_line_loop),
612 TAG(ffb_vb_line_strip),
613 #else
614 NULL,
615 NULL,
616 NULL,
617 NULL,
618 #endif
619 TAG(ffb_vb_triangles),
620 TAG(ffb_vb_tri_strip),
621 TAG(ffb_vb_tri_fan),
622 TAG(ffb_vb_quads),
623 TAG(ffb_vb_quad_strip),
624 TAG(ffb_vb_poly),
625 ffb_vb_noop,
626 };
627
628 #undef IND
629 #undef TAG
630
631 #undef IMPL_LOCAL_VARS
632 #undef FFB_DECLARE_CACHED_COLOR
633 #undef FFB_COMPUTE_CACHED_COLOR
634 #undef FFB_CACHED_COLOR_SAME
635 #undef FFB_CACHED_COLOR_SET
636 #undef FFB_CACHED_COLOR_UPDATE
637 #undef FFB_SET_PRIM_COLOR
638 #undef FFB_PRIM_COLOR_COST
639 #undef FFB_SET_VERTEX_COLOR
640 #undef FFB_VERTEX_COLOR_COST
641 #undef RESET_STIPPLE
642 #undef FFB_AREA_DECLARE
643 #undef FFB_COMPUTE_AREA_TRI
644 #undef FFB_COMPUTE_AREA_QUAD
645 #undef FFB_CULL_TRI
646 #undef FFB_CULL_QUAD