2 #define IMPL_LOCAL_VARS \
3 ffbContextPtr fmesa = FFB_CONTEXT(ctx); \
4 ffb_fbcPtr ffb = fmesa->regs; \
5 const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \
6 FFB_DELAYED_VIEWPORT_VARS; \
7 (void) fmesa; (void) ffb; (void) elt
9 #if (IND & FFB_FLAT_BIT)
10 #define FFB_DECLARE_CACHED_COLOR(NAME) \
12 #define FFB_COMPUTE_CACHED_COLOR(NAME, VTX) \
13 NAME = FFB_PACK_CONST_UBYTE_ARGB_COLOR((VTX)->color[0])
14 #define FFB_CACHED_COLOR_SAME(NAME1, NAME2) \
16 #define FFB_CACHED_COLOR_SET(NAME) \
18 #define FFB_CACHED_COLOR_UPDATE(NAME1, NAME2) \
19 ffb->fg = (NAME1) = (NAME2)
20 #define FFB_SET_PRIM_COLOR(COLOR_VERTEX) \
21 ffb->fg = FFB_PACK_CONST_UBYTE_ARGB_COLOR((COLOR_VERTEX)->color[0])
22 #define FFB_PRIM_COLOR_COST 1
23 #define FFB_SET_VERTEX_COLOR(VTX) /**/
24 #define FFB_VERTEX_COLOR_COST 0
26 #define FFB_DECLARE_CACHED_COLOR(NAME) /**/
27 #define FFB_COMPUTE_CACHED_COLOR(NAME, VTX) /**/
28 #define FFB_CACHED_COLOR_SAME(NAME1, NAME2) 0
29 #define FFB_CACHED_COLOR_SET(NAME1) /**/
30 #define FFB_CACHED_COLOR_UPDATE(NAME1, NAME2) /**/
31 #define FFB_SET_PRIM_COLOR(COLOR_VERTEX) /**/
32 #define FFB_PRIM_COLOR_COST 0
33 #if (IND & FFB_ALPHA_BIT)
34 #define FFB_SET_VERTEX_COLOR(VTX) \
35 ffb->alpha = FFB_GET_ALPHA(VTX); \
36 ffb->red = FFB_GET_RED(VTX); \
37 ffb->green = FFB_GET_GREEN(VTX); \
38 ffb->blue = FFB_GET_BLUE(VTX)
39 #define FFB_VERTEX_COLOR_COST 4
41 #define FFB_SET_VERTEX_COLOR(VTX) \
42 ffb->red = FFB_GET_RED(VTX); \
43 ffb->green = FFB_GET_GREEN(VTX); \
44 ffb->blue = FFB_GET_BLUE(VTX)
45 #define FFB_VERTEX_COLOR_COST 3
49 #define RESET_STIPPLE ffb->lpat = fmesa->lpat;
51 #if !(IND & (FFB_TRI_CULL_BIT))
52 static void TAG(ffb_vb_points
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
57 #ifdef FFB_RENDER_TRACE
58 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
59 __FUNCTION__
, start
, count
, flags
);
61 ffbRenderPrimitive(ctx
, GL_POINTS
);
62 if (ctx
->_TriangleCaps
& DD_POINT_SMOOTH
) {
63 for (i
= start
; i
< count
; i
++) {
64 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
)];
67 ffb
->fg
= FFB_PACK_CONST_UBYTE_ARGB_COLOR(v0
->color
[0]);
68 ffb
->z
= FFB_GET_Z(v0
);
69 ffb
->y
= FFB_GET_Y(v0
) + 0x8000 /* FIX ME */;
70 ffb
->x
= FFB_GET_X(v0
) + 0x8000 /* FIX ME */;
73 for (i
= start
; i
< count
; i
++) {
74 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
)];
76 ffb
->fg
= FFB_PACK_CONST_UBYTE_ARGB_COLOR(v0
->color
[0]);
77 ffb
->constz
= Z_FROM_MESA(FFB_Z_TO_FLOAT(FFB_GET_Z(v0
)));
78 ffb
->bh
= FFB_GET_Y(v0
) >> 16;
79 ffb
->bw
= FFB_GET_X(v0
) >> 16;
83 fmesa
->ffbScreen
->rp_active
= 1;
86 static void TAG(ffb_vb_lines
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
91 #ifdef FFB_RENDER_TRACE
92 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
93 __FUNCTION__
, start
, count
, flags
);
95 ffbRenderPrimitive(ctx
, GL_LINES
);
96 for (i
= start
+ 1; i
< count
; i
+= 2) {
97 ffb_vertex
*v0
= &fmesa
->verts
[i
- 1];
98 ffb_vertex
*v1
= &fmesa
->verts
[i
- 0];
100 FFBFifo(fmesa
, (1 + FFB_PRIM_COLOR_COST
+
101 (FFB_VERTEX_COLOR_COST
* 2) + 6));
105 FFB_SET_PRIM_COLOR(v1
);
107 FFB_SET_VERTEX_COLOR(v0
);
108 ffb
->z
= FFB_GET_Z(v0
);
109 ffb
->ryf
= FFB_GET_Y(v0
);
110 ffb
->rxf
= FFB_GET_X(v0
);
112 FFB_SET_VERTEX_COLOR(v1
);
113 ffb
->z
= FFB_GET_Z(v1
);
114 ffb
->y
= FFB_GET_Y(v1
);
115 ffb
->x
= FFB_GET_X(v1
);
119 static void TAG(ffb_vb_line_loop
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
124 #ifdef FFB_RENDER_TRACE
125 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
126 __FUNCTION__
, start
, count
, flags
);
128 ffbRenderPrimitive(ctx
, GL_LINE_LOOP
);
129 if ((flags
& PRIM_BEGIN
) != 0) {
130 ffb_vertex
*v0
= &fmesa
->verts
[ELT(start
+ 0)];
131 ffb_vertex
*v1
= &fmesa
->verts
[ELT(start
+ 1)];
133 FFBFifo(fmesa
, (1 + FFB_PRIM_COLOR_COST
+
134 ((FFB_VERTEX_COLOR_COST
* 2) + (3 * 2))));
138 FFB_SET_PRIM_COLOR(v1
);
140 FFB_SET_VERTEX_COLOR(v0
);
141 ffb
->z
= FFB_GET_Z(v0
);
142 ffb
->ryf
= FFB_GET_Y(v0
);
143 ffb
->rxf
= FFB_GET_X(v0
);
145 FFB_SET_VERTEX_COLOR(v1
);
146 ffb
->z
= FFB_GET_Z(v1
);
147 ffb
->y
= FFB_GET_Y(v1
);
148 ffb
->x
= FFB_GET_X(v1
);
150 for (i
= start
+ 2; i
< count
; i
++) {
151 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
)];
153 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
154 (FFB_VERTEX_COLOR_COST
+ 3)));
156 FFB_SET_PRIM_COLOR(v0
);
158 FFB_SET_VERTEX_COLOR(v0
);
159 ffb
->z
= FFB_GET_Z(v0
);
160 ffb
->y
= FFB_GET_Y(v0
);
161 ffb
->x
= FFB_GET_X(v0
);
163 if ((flags
& PRIM_END
) != 0) {
164 ffb_vertex
*v0
= &fmesa
->verts
[ELT(start
)];
166 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
167 (FFB_VERTEX_COLOR_COST
+ 3)));
169 FFB_SET_PRIM_COLOR(v0
);
171 FFB_SET_VERTEX_COLOR(v0
);
172 ffb
->z
= FFB_GET_Z(v0
);
173 ffb
->y
= FFB_GET_Y(v0
);
174 ffb
->x
= FFB_GET_X(v0
);
177 fmesa
->ffbScreen
->rp_active
= 1;
180 static void TAG(ffb_vb_line_strip
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
183 FFB_DECLARE_CACHED_COLOR(cached_fg
)
186 #ifdef FFB_RENDER_TRACE
187 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
188 __FUNCTION__
, start
, count
, flags
);
190 ffbRenderPrimitive(ctx
, GL_LINE_STRIP
);
191 FFBFifo(fmesa
, (1 + FFB_PRIM_COLOR_COST
+
192 ((FFB_VERTEX_COLOR_COST
* 2) + (3 * 2))));
197 ffb_vertex
*v0
= &fmesa
->verts
[ELT(start
+ 0)];
198 ffb_vertex
*v1
= &fmesa
->verts
[ELT(start
+ 1)];
200 FFB_COMPUTE_CACHED_COLOR(cached_fg
, v0
);
201 FFB_CACHED_COLOR_SET(cached_fg
);
203 FFB_SET_VERTEX_COLOR(v0
);
204 ffb
->z
= FFB_GET_Z(v0
);
205 ffb
->ryf
= FFB_GET_Y(v0
);
206 ffb
->rxf
= FFB_GET_X(v0
);
208 FFB_SET_VERTEX_COLOR(v1
);
209 ffb
->z
= FFB_GET_Z(v1
);
210 ffb
->y
= FFB_GET_Y(v1
);
211 ffb
->x
= FFB_GET_X(v1
);
214 for (i
= start
+ 2; i
< count
; i
++) {
215 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 0)];
216 FFB_DECLARE_CACHED_COLOR(new_fg
)
218 FFB_COMPUTE_CACHED_COLOR(new_fg
, v1
);
219 if (FFB_CACHED_COLOR_SAME(cached_fg
, new_fg
)) {
220 FFBFifo(fmesa
, ((FFB_VERTEX_COLOR_COST
* 1) + (3 * 1)));
222 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
223 (FFB_VERTEX_COLOR_COST
* 1) + (3 * 1)));
224 FFB_CACHED_COLOR_UPDATE(cached_fg
, new_fg
);
227 FFB_SET_VERTEX_COLOR(v1
);
228 ffb
->z
= FFB_GET_Z(v1
);
229 ffb
->y
= FFB_GET_Y(v1
);
230 ffb
->x
= FFB_GET_X(v1
);
233 fmesa
->ffbScreen
->rp_active
= 1;
235 #endif /* !(IND & (FFB_TRI_CULL_BIT)) */
237 /* OK, now things start getting fun :-) */
238 #if (IND & (FFB_TRI_CULL_BIT))
239 #define FFB_AREA_DECLARE GLfloat cc, ex, ey, fx, fy;
240 #define FFB_COMPUTE_AREA_TRI(V0, V1, V2) \
241 { ex = (V1)->x - (V0)->x; \
242 ey = (V1)->y - (V0)->y; \
243 fx = (V2)->x - (V0)->x; \
244 fy = (V2)->y - (V0)->y; \
247 #define FFB_COMPUTE_AREA_QUAD(V0, V1, V2, V3) \
248 { ex = (V2)->x - (V0)->x; \
249 ey = (V2)->y - (V0)->y; \
250 fx = (V3)->x - (V1)->x; \
251 fy = (V3)->y - (V1)->y; \
255 #define FFB_AREA_DECLARE /**/
256 #define FFB_COMPUTE_AREA_TRI(V0, V1, V2) do { } while(0)
257 #define FFB_COMPUTE_AREA_QUAD(V0, V1, V2, V3) do { } while(0)
260 #if (IND & FFB_TRI_CULL_BIT)
261 #define FFB_CULL_TRI(CULL_ACTION) \
262 if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \
265 #define FFB_CULL_QUAD(CULL_ACTION) \
266 if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \
270 #define FFB_CULL_TRI(CULL_ACTION) do { } while (0)
271 #define FFB_CULL_QUAD(CULL_ACTION) do { } while (0)
274 static void TAG(ffb_vb_triangles
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
279 #ifdef FFB_RENDER_TRACE
280 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
281 __FUNCTION__
, start
, count
, flags
);
283 ffbRenderPrimitive(ctx
, GL_TRIANGLES
);
284 for (i
= start
+ 2; i
< count
; i
+= 3) {
285 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
- 2)];
286 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 1)];
287 ffb_vertex
*v2
= &fmesa
->verts
[ELT(i
- 0)];
290 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
291 FFB_CULL_TRI(continue;);
293 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
294 (FFB_VERTEX_COLOR_COST
* 3) + 9));
295 FFB_SET_PRIM_COLOR(v2
);
297 FFB_SET_VERTEX_COLOR(v0
);
298 ffb
->z
= FFB_GET_Z(v0
);
299 ffb
->ryf
= FFB_GET_Y(v0
);
300 ffb
->rxf
= FFB_GET_X(v0
);
302 FFB_SET_VERTEX_COLOR(v1
);
303 ffb
->z
= FFB_GET_Z(v1
);
304 ffb
->y
= FFB_GET_Y(v1
);
305 ffb
->x
= FFB_GET_X(v1
);
307 FFB_SET_VERTEX_COLOR(v2
);
308 ffb
->z
= FFB_GET_Z(v2
);
309 ffb
->y
= FFB_GET_Y(v2
);
310 ffb
->x
= FFB_GET_X(v2
);
313 fmesa
->ffbScreen
->rp_active
= 1;
316 static void TAG(ffb_vb_tri_strip
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
322 #ifdef FFB_RENDER_TRACE
323 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
324 __FUNCTION__
, start
, count
, flags
);
326 ffbRenderPrimitive(ctx
, GL_TRIANGLE_STRIP
);
329 goto something_clipped
;
332 for (; i
< count
; i
++, parity
^= 1) {
333 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
- 2 + parity
)];
334 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 1 - parity
)];
335 ffb_vertex
*v2
= &fmesa
->verts
[ELT(i
- 0)];
338 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
339 FFB_CULL_TRI(continue;);
341 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
342 (FFB_VERTEX_COLOR_COST
* 3) + 9));
343 FFB_SET_PRIM_COLOR(v2
);
345 FFB_SET_VERTEX_COLOR(v0
);
346 ffb
->z
= FFB_GET_Z(v0
);
347 ffb
->ryf
= FFB_GET_Y(v0
);
348 ffb
->rxf
= FFB_GET_X(v0
);
350 FFB_SET_VERTEX_COLOR(v1
);
351 ffb
->z
= FFB_GET_Z(v1
);
352 ffb
->y
= FFB_GET_Y(v1
);
353 ffb
->x
= FFB_GET_X(v1
);
355 FFB_SET_VERTEX_COLOR(v2
);
356 ffb
->z
= FFB_GET_Z(v2
);
357 ffb
->y
= FFB_GET_Y(v2
);
358 ffb
->x
= FFB_GET_X(v2
);
365 for (; i
< count
; i
++, parity
^= 1) {
366 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
- 2 + parity
)];
367 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 1 - parity
)];
368 ffb_vertex
*v2
= &fmesa
->verts
[ELT(i
- 0)];
370 (void) v0
; (void) v1
;
372 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
373 FFB_CULL_TRI(i
++; parity
^=1; goto something_clipped
;);
375 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
376 (FFB_VERTEX_COLOR_COST
* 1) + 3));
377 FFB_SET_PRIM_COLOR(v2
);
379 FFB_SET_VERTEX_COLOR(v2
);
380 ffb
->z
= FFB_GET_Z(v2
);
381 ffb
->y
= FFB_GET_Y(v2
);
382 ffb
->x
= FFB_GET_X(v2
);
385 fmesa
->ffbScreen
->rp_active
= 1;
388 static void TAG(ffb_vb_tri_fan
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
393 #ifdef FFB_RENDER_TRACE
394 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
395 __FUNCTION__
, start
, count
, flags
);
397 ffbRenderPrimitive(ctx
, GL_TRIANGLE_FAN
);
400 goto something_clipped
;
403 for ( ; i
< count
; i
++) {
404 ffb_vertex
*v0
= &fmesa
->verts
[ELT(start
)];
405 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 1)];
406 ffb_vertex
*v2
= &fmesa
->verts
[ELT(i
- 0)];
409 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
410 FFB_CULL_TRI(continue;);
412 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
413 (FFB_VERTEX_COLOR_COST
* 3) + 9));
414 FFB_SET_PRIM_COLOR(v2
);
416 FFB_SET_VERTEX_COLOR(v0
);
417 ffb
->z
= FFB_GET_Z(v0
);
418 ffb
->ryf
= FFB_GET_Y(v0
);
419 ffb
->rxf
= FFB_GET_X(v0
);
421 FFB_SET_VERTEX_COLOR(v1
);
422 ffb
->z
= FFB_GET_Z(v1
);
423 ffb
->y
= FFB_GET_Y(v1
);
424 ffb
->x
= FFB_GET_X(v1
);
426 FFB_SET_VERTEX_COLOR(v2
);
427 ffb
->z
= FFB_GET_Z(v2
);
428 ffb
->y
= FFB_GET_Y(v2
);
429 ffb
->x
= FFB_GET_X(v2
);
435 for (; i
< count
; i
++) {
436 ffb_vertex
*v0
= &fmesa
->verts
[ELT(start
)];
437 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 1)];
438 ffb_vertex
*v2
= &fmesa
->verts
[ELT(i
- 0)];
440 (void) v0
; (void) v1
;
442 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
443 FFB_CULL_TRI(i
++; goto something_clipped
;);
445 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
446 (FFB_VERTEX_COLOR_COST
* 1) + 3));
447 FFB_SET_PRIM_COLOR(v2
);
449 FFB_SET_VERTEX_COLOR(v2
);
450 ffb
->z
= FFB_GET_Z(v2
);
451 ffb
->dmyf
= FFB_GET_Y(v2
);
452 ffb
->dmxf
= FFB_GET_X(v2
);
455 fmesa
->ffbScreen
->rp_active
= 1;
458 static void TAG(ffb_vb_poly
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
463 #ifdef FFB_RENDER_TRACE
464 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
465 __FUNCTION__
, start
, count
, flags
);
467 ffbRenderPrimitive(ctx
, GL_POLYGON
);
469 /* XXX Optimize XXX */
470 for (i
= start
+ 2; i
< count
; i
++) {
471 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
- 1)];
472 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
)];
473 ffb_vertex
*v2
= &fmesa
->verts
[ELT(start
)];
476 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
477 FFB_CULL_TRI(continue;);
479 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
480 (FFB_VERTEX_COLOR_COST
* 3) + 9));
481 FFB_SET_PRIM_COLOR(v2
);
483 FFB_SET_VERTEX_COLOR(v0
);
484 ffb
->z
= FFB_GET_Z(v0
);
485 ffb
->ryf
= FFB_GET_Y(v0
);
486 ffb
->rxf
= FFB_GET_X(v0
);
488 FFB_SET_VERTEX_COLOR(v1
);
489 ffb
->z
= FFB_GET_Z(v1
);
490 ffb
->y
= FFB_GET_Y(v1
);
491 ffb
->x
= FFB_GET_X(v1
);
493 FFB_SET_VERTEX_COLOR(v2
);
494 ffb
->z
= FFB_GET_Z(v2
);
495 ffb
->y
= FFB_GET_Y(v2
);
496 ffb
->x
= FFB_GET_X(v2
);
499 fmesa
->ffbScreen
->rp_active
= 1;
502 static void TAG(ffb_vb_quads
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
507 #ifdef FFB_RENDER_TRACE
508 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
509 __FUNCTION__
, start
, count
, flags
);
511 ffbRenderPrimitive(ctx
, GL_QUADS
);
513 for (i
= start
+ 3; i
< count
; i
+= 4) {
514 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
- 3)];
515 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 2)];
516 ffb_vertex
*v2
= &fmesa
->verts
[ELT(i
- 1)];
517 ffb_vertex
*v3
= &fmesa
->verts
[ELT(i
- 0)];
520 FFB_COMPUTE_AREA_QUAD(v0
, v1
, v2
, v3
);
521 FFB_CULL_QUAD(continue;);
523 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
524 (FFB_VERTEX_COLOR_COST
* 4) + 12));
525 FFB_SET_PRIM_COLOR(v3
);
527 FFB_SET_VERTEX_COLOR(v0
);
528 ffb
->z
= FFB_GET_Z(v0
);
529 ffb
->ryf
= FFB_GET_Y(v0
);
530 ffb
->rxf
= FFB_GET_X(v0
);
532 FFB_SET_VERTEX_COLOR(v1
);
533 ffb
->z
= FFB_GET_Z(v1
);
534 ffb
->y
= FFB_GET_Y(v1
);
535 ffb
->x
= FFB_GET_X(v1
);
537 FFB_SET_VERTEX_COLOR(v2
);
538 ffb
->z
= FFB_GET_Z(v2
);
539 ffb
->y
= FFB_GET_Y(v2
);
540 ffb
->x
= FFB_GET_X(v2
);
542 FFB_SET_VERTEX_COLOR(v3
);
543 ffb
->z
= FFB_GET_Z(v3
);
544 ffb
->dmyf
= FFB_GET_Y(v3
);
545 ffb
->dmxf
= FFB_GET_X(v3
);
548 fmesa
->ffbScreen
->rp_active
= 1;
551 static void TAG(ffb_vb_quad_strip
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
556 #ifdef FFB_RENDER_TRACE
557 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
558 __FUNCTION__
, start
, count
, flags
);
560 ffbRenderPrimitive(ctx
, GL_QUAD_STRIP
);
562 /* XXX Optimize XXX */
563 for (i
= start
+ 3; i
< count
; i
+= 2) {
564 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
- 1)];
565 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 3)];
566 ffb_vertex
*v2
= &fmesa
->verts
[ELT(i
- 2)];
567 ffb_vertex
*v3
= &fmesa
->verts
[ELT(i
- 0)];
570 FFB_COMPUTE_AREA_QUAD(v0
, v1
, v2
, v3
);
571 FFB_CULL_QUAD(continue;);
573 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
574 (FFB_VERTEX_COLOR_COST
* 4) + 12));
575 FFB_SET_PRIM_COLOR(v3
);
578 FFB_SET_VERTEX_COLOR(v0
);
579 ffb
->z
= FFB_GET_Z(v0
);
580 ffb
->ryf
= FFB_GET_Y(v0
);
581 ffb
->rxf
= FFB_GET_X(v0
);
584 FFB_SET_VERTEX_COLOR(v1
);
585 ffb
->z
= FFB_GET_Z(v1
);
586 ffb
->y
= FFB_GET_Y(v1
);
587 ffb
->x
= FFB_GET_X(v1
);
590 FFB_SET_VERTEX_COLOR(v2
);
591 ffb
->z
= FFB_GET_Z(v2
);
592 ffb
->y
= FFB_GET_Y(v2
);
593 ffb
->x
= FFB_GET_X(v2
);
596 FFB_SET_VERTEX_COLOR(v3
);
597 ffb
->z
= FFB_GET_Z(v3
);
598 ffb
->dmyf
= FFB_GET_Y(v3
);
599 ffb
->dmxf
= FFB_GET_X(v3
);
602 fmesa
->ffbScreen
->rp_active
= 1;
605 static void (*TAG(render_tab
)[GL_POLYGON
+ 2])(GLcontext
*, GLuint
, GLuint
, GLuint
) =
607 #if !(IND & (FFB_TRI_CULL_BIT))
610 TAG(ffb_vb_line_loop
),
611 TAG(ffb_vb_line_strip
),
618 TAG(ffb_vb_triangles
),
619 TAG(ffb_vb_tri_strip
),
622 TAG(ffb_vb_quad_strip
),
630 #undef IMPL_LOCAL_VARS
631 #undef FFB_DECLARE_CACHED_COLOR
632 #undef FFB_COMPUTE_CACHED_COLOR
633 #undef FFB_CACHED_COLOR_SAME
634 #undef FFB_CACHED_COLOR_SET
635 #undef FFB_CACHED_COLOR_UPDATE
636 #undef FFB_SET_PRIM_COLOR
637 #undef FFB_PRIM_COLOR_COST
638 #undef FFB_SET_VERTEX_COLOR
639 #undef FFB_VERTEX_COLOR_COST
641 #undef FFB_AREA_DECLARE
642 #undef FFB_COMPUTE_AREA_TRI
643 #undef FFB_COMPUTE_AREA_QUAD