1 /* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_rendertmp.h,v 1.2 2003/01/29 23:00:40 dawes Exp $ */
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
10 #if (IND & FFB_FLAT_BIT)
11 #define FFB_DECLARE_CACHED_COLOR(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) \
17 #define FFB_CACHED_COLOR_SET(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
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
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
50 #define RESET_STIPPLE ffb->lpat = fmesa->lpat;
52 #if !(IND & (FFB_TRI_CULL_BIT))
53 static void TAG(ffb_vb_points
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
58 #ifdef FFB_RENDER_TRACE
59 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
60 __FUNCTION__
, start
, count
, flags
);
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
)];
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 */;
74 for (i
= start
; i
< count
; i
++) {
75 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
)];
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;
84 fmesa
->ffbScreen
->rp_active
= 1;
87 static void TAG(ffb_vb_lines
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
92 #ifdef FFB_RENDER_TRACE
93 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
94 __FUNCTION__
, start
, count
, flags
);
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];
101 FFBFifo(fmesa
, (1 + FFB_PRIM_COLOR_COST
+
102 (FFB_VERTEX_COLOR_COST
* 2) + 6));
106 FFB_SET_PRIM_COLOR(v1
);
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
);
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
);
120 static void TAG(ffb_vb_line_loop
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
125 #ifdef FFB_RENDER_TRACE
126 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
127 __FUNCTION__
, start
, count
, flags
);
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)];
134 FFBFifo(fmesa
, (1 + FFB_PRIM_COLOR_COST
+
135 ((FFB_VERTEX_COLOR_COST
* 2) + (3 * 2))));
139 FFB_SET_PRIM_COLOR(v1
);
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
);
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
);
151 for (i
= start
+ 2; i
< count
; i
++) {
152 ffb_vertex
*v0
= &fmesa
->verts
[ELT(i
)];
154 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
155 (FFB_VERTEX_COLOR_COST
+ 3)));
157 FFB_SET_PRIM_COLOR(v0
);
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
);
164 if ((flags
& PRIM_END
) != 0) {
165 ffb_vertex
*v0
= &fmesa
->verts
[ELT(start
)];
167 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
168 (FFB_VERTEX_COLOR_COST
+ 3)));
170 FFB_SET_PRIM_COLOR(v0
);
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
);
178 fmesa
->ffbScreen
->rp_active
= 1;
181 static void TAG(ffb_vb_line_strip
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
184 FFB_DECLARE_CACHED_COLOR(cached_fg
)
187 #ifdef FFB_RENDER_TRACE
188 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
189 __FUNCTION__
, start
, count
, flags
);
191 ffbRenderPrimitive(ctx
, GL_LINE_STRIP
);
192 FFBFifo(fmesa
, (1 + FFB_PRIM_COLOR_COST
+
193 ((FFB_VERTEX_COLOR_COST
* 2) + (3 * 2))));
198 ffb_vertex
*v0
= &fmesa
->verts
[ELT(start
+ 0)];
199 ffb_vertex
*v1
= &fmesa
->verts
[ELT(start
+ 1)];
201 FFB_COMPUTE_CACHED_COLOR(cached_fg
, v0
);
202 FFB_CACHED_COLOR_SET(cached_fg
);
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
);
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
);
215 for (i
= start
+ 2; i
< count
; i
++) {
216 ffb_vertex
*v1
= &fmesa
->verts
[ELT(i
- 0)];
217 FFB_DECLARE_CACHED_COLOR(new_fg
)
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)));
223 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
224 (FFB_VERTEX_COLOR_COST
* 1) + (3 * 1)));
225 FFB_CACHED_COLOR_UPDATE(cached_fg
, new_fg
);
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
);
234 fmesa
->ffbScreen
->rp_active
= 1;
236 #endif /* !(IND & (FFB_TRI_CULL_BIT)) */
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; \
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; \
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)
261 #if (IND & FFB_TRI_CULL_BIT)
262 #define FFB_CULL_TRI(CULL_ACTION) \
263 if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \
266 #define FFB_CULL_QUAD(CULL_ACTION) \
267 if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \
271 #define FFB_CULL_TRI(CULL_ACTION) do { } while (0)
272 #define FFB_CULL_QUAD(CULL_ACTION) do { } while (0)
275 static void TAG(ffb_vb_triangles
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
280 #ifdef FFB_RENDER_TRACE
281 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
282 __FUNCTION__
, start
, count
, flags
);
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)];
291 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
292 FFB_CULL_TRI(continue;);
294 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
295 (FFB_VERTEX_COLOR_COST
* 3) + 9));
296 FFB_SET_PRIM_COLOR(v2
);
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
);
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
);
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
);
314 fmesa
->ffbScreen
->rp_active
= 1;
317 static void TAG(ffb_vb_tri_strip
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
323 #ifdef FFB_RENDER_TRACE
324 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
325 __FUNCTION__
, start
, count
, flags
);
327 ffbRenderPrimitive(ctx
, GL_TRIANGLE_STRIP
);
330 goto 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)];
339 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
340 FFB_CULL_TRI(continue;);
342 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
343 (FFB_VERTEX_COLOR_COST
* 3) + 9));
344 FFB_SET_PRIM_COLOR(v2
);
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
);
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
);
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
);
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)];
371 (void) v0
; (void) v1
;
373 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
374 FFB_CULL_TRI(i
++; parity
^=1; goto something_clipped
;);
376 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
377 (FFB_VERTEX_COLOR_COST
* 1) + 3));
378 FFB_SET_PRIM_COLOR(v2
);
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
);
386 fmesa
->ffbScreen
->rp_active
= 1;
389 static void TAG(ffb_vb_tri_fan
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
394 #ifdef FFB_RENDER_TRACE
395 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
396 __FUNCTION__
, start
, count
, flags
);
398 ffbRenderPrimitive(ctx
, GL_TRIANGLE_FAN
);
401 goto 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)];
410 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
411 FFB_CULL_TRI(continue;);
413 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
414 (FFB_VERTEX_COLOR_COST
* 3) + 9));
415 FFB_SET_PRIM_COLOR(v2
);
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
);
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
);
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
);
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)];
441 (void) v0
; (void) v1
;
443 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
444 FFB_CULL_TRI(i
++; goto something_clipped
;);
446 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
447 (FFB_VERTEX_COLOR_COST
* 1) + 3));
448 FFB_SET_PRIM_COLOR(v2
);
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
);
456 fmesa
->ffbScreen
->rp_active
= 1;
459 static void TAG(ffb_vb_poly
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
464 #ifdef FFB_RENDER_TRACE
465 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
466 __FUNCTION__
, start
, count
, flags
);
468 ffbRenderPrimitive(ctx
, GL_POLYGON
);
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
)];
477 FFB_COMPUTE_AREA_TRI(v0
, v1
, v2
);
478 FFB_CULL_TRI(continue;);
480 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
481 (FFB_VERTEX_COLOR_COST
* 3) + 9));
482 FFB_SET_PRIM_COLOR(v2
);
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
);
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
);
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
);
500 fmesa
->ffbScreen
->rp_active
= 1;
503 static void TAG(ffb_vb_quads
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
508 #ifdef FFB_RENDER_TRACE
509 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
510 __FUNCTION__
, start
, count
, flags
);
512 ffbRenderPrimitive(ctx
, GL_QUADS
);
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)];
521 FFB_COMPUTE_AREA_QUAD(v0
, v1
, v2
, v3
);
522 FFB_CULL_QUAD(continue;);
524 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
525 (FFB_VERTEX_COLOR_COST
* 4) + 12));
526 FFB_SET_PRIM_COLOR(v3
);
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
);
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
);
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
);
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
);
549 fmesa
->ffbScreen
->rp_active
= 1;
552 static void TAG(ffb_vb_quad_strip
)(GLcontext
*ctx
, GLuint start
, GLuint count
, GLuint flags
)
557 #ifdef FFB_RENDER_TRACE
558 fprintf(stderr
, "%s: start(%d) count(%d) flags(%x)\n",
559 __FUNCTION__
, start
, count
, flags
);
561 ffbRenderPrimitive(ctx
, GL_QUAD_STRIP
);
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)];
571 FFB_COMPUTE_AREA_QUAD(v0
, v1
, v2
, v3
);
572 FFB_CULL_QUAD(continue;);
574 FFBFifo(fmesa
, (FFB_PRIM_COLOR_COST
+
575 (FFB_VERTEX_COLOR_COST
* 4) + 12));
576 FFB_SET_PRIM_COLOR(v3
);
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
);
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
);
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
);
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
);
603 fmesa
->ffbScreen
->rp_active
= 1;
606 static void (*TAG(render_tab
)[GL_POLYGON
+ 2])(GLcontext
*, GLuint
, GLuint
, GLuint
) =
608 #if !(IND & (FFB_TRI_CULL_BIT))
611 TAG(ffb_vb_line_loop
),
612 TAG(ffb_vb_line_strip
),
619 TAG(ffb_vb_triangles
),
620 TAG(ffb_vb_tri_strip
),
623 TAG(ffb_vb_quad_strip
),
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
642 #undef FFB_AREA_DECLARE
643 #undef FFB_COMPUTE_AREA_TRI
644 #undef FFB_COMPUTE_AREA_QUAD