Remove CVS keywords.
[mesa.git] / src / mesa / drivers / dri / ffb / ffb_rendertmp.h
1
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
8
9 #if (IND & FFB_FLAT_BIT)
10 #define FFB_DECLARE_CACHED_COLOR(NAME) \
11 unsigned int 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) \
15 ((NAME1) == (NAME2))
16 #define FFB_CACHED_COLOR_SET(NAME) \
17 ffb->fg = (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
25 #else
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
40 #else
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
46 #endif
47 #endif
48
49 #define RESET_STIPPLE ffb->lpat = fmesa->lpat;
50
51 #if !(IND & (FFB_TRI_CULL_BIT))
52 static void TAG(ffb_vb_points)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
53 {
54 GLint i;
55 IMPL_LOCAL_VARS;
56
57 #ifdef FFB_RENDER_TRACE
58 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
59 __FUNCTION__, start, count, flags);
60 #endif
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)];
65
66 FFBFifo(fmesa, 4);
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 */;
71 }
72 } else {
73 for (i = start; i < count; i++) {
74 ffb_vertex *v0 = &fmesa->verts[ELT(i)];
75 FFBFifo(fmesa, 4);
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;
80 }
81 }
82
83 fmesa->ffbScreen->rp_active = 1;
84 }
85
86 static void TAG(ffb_vb_lines)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
87 {
88 GLint i;
89 IMPL_LOCAL_VARS;
90
91 #ifdef FFB_RENDER_TRACE
92 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
93 __FUNCTION__, start, count, flags);
94 #endif
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];
99
100 FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST +
101 (FFB_VERTEX_COLOR_COST * 2) + 6));
102
103 RESET_STIPPLE;
104
105 FFB_SET_PRIM_COLOR(v1);
106
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);
111
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);
116 }
117 }
118
119 static void TAG(ffb_vb_line_loop)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
120 {
121 GLint i;
122 IMPL_LOCAL_VARS;
123
124 #ifdef FFB_RENDER_TRACE
125 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
126 __FUNCTION__, start, count, flags);
127 #endif
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)];
132
133 FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST +
134 ((FFB_VERTEX_COLOR_COST * 2) + (3 * 2))));
135
136 RESET_STIPPLE;
137
138 FFB_SET_PRIM_COLOR(v1);
139
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);
144
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);
149 }
150 for (i = start + 2; i < count; i++) {
151 ffb_vertex *v0 = &fmesa->verts[ELT(i)];
152
153 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
154 (FFB_VERTEX_COLOR_COST + 3)));
155
156 FFB_SET_PRIM_COLOR(v0);
157
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);
162 }
163 if ((flags & PRIM_END) != 0) {
164 ffb_vertex *v0 = &fmesa->verts[ELT(start)];
165
166 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
167 (FFB_VERTEX_COLOR_COST + 3)));
168
169 FFB_SET_PRIM_COLOR(v0);
170
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);
175 }
176
177 fmesa->ffbScreen->rp_active = 1;
178 }
179
180 static void TAG(ffb_vb_line_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
181 {
182 GLint i;
183 FFB_DECLARE_CACHED_COLOR(cached_fg)
184 IMPL_LOCAL_VARS;
185
186 #ifdef FFB_RENDER_TRACE
187 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
188 __FUNCTION__, start, count, flags);
189 #endif
190 ffbRenderPrimitive(ctx, GL_LINE_STRIP);
191 FFBFifo(fmesa, (1 + FFB_PRIM_COLOR_COST +
192 ((FFB_VERTEX_COLOR_COST * 2) + (3 * 2))));
193
194 RESET_STIPPLE;
195
196 {
197 ffb_vertex *v0 = &fmesa->verts[ELT(start + 0)];
198 ffb_vertex *v1 = &fmesa->verts[ELT(start + 1)];
199
200 FFB_COMPUTE_CACHED_COLOR(cached_fg, v0);
201 FFB_CACHED_COLOR_SET(cached_fg);
202
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);
207
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);
212 }
213
214 for (i = start + 2; i < count; i++) {
215 ffb_vertex *v1 = &fmesa->verts[ELT(i - 0)];
216 FFB_DECLARE_CACHED_COLOR(new_fg)
217
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)));
221 } else {
222 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
223 (FFB_VERTEX_COLOR_COST * 1) + (3 * 1)));
224 FFB_CACHED_COLOR_UPDATE(cached_fg, new_fg);
225 }
226
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);
231 }
232
233 fmesa->ffbScreen->rp_active = 1;
234 }
235 #endif /* !(IND & (FFB_TRI_CULL_BIT)) */
236
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; \
245 cc = ex*fy-ey*fx; \
246 }
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; \
252 cc = ex*fy-ey*fx; \
253 }
254 #else
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)
258 #endif
259
260 #if (IND & FFB_TRI_CULL_BIT)
261 #define FFB_CULL_TRI(CULL_ACTION) \
262 if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \
263 CULL_ACTION \
264 }
265 #define FFB_CULL_QUAD(CULL_ACTION) \
266 if (cc * fmesa->backface_sign > fmesa->ffb_zero) { \
267 CULL_ACTION \
268 }
269 #else
270 #define FFB_CULL_TRI(CULL_ACTION) do { } while (0)
271 #define FFB_CULL_QUAD(CULL_ACTION) do { } while (0)
272 #endif
273
274 static void TAG(ffb_vb_triangles)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
275 {
276 GLint i;
277 IMPL_LOCAL_VARS;
278
279 #ifdef FFB_RENDER_TRACE
280 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
281 __FUNCTION__, start, count, flags);
282 #endif
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)];
288 FFB_AREA_DECLARE
289
290 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
291 FFB_CULL_TRI(continue;);
292
293 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
294 (FFB_VERTEX_COLOR_COST * 3) + 9));
295 FFB_SET_PRIM_COLOR(v2);
296
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);
301
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);
306
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);
311 }
312
313 fmesa->ffbScreen->rp_active = 1;
314 }
315
316 static void TAG(ffb_vb_tri_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
317 {
318 GLint i;
319 GLint parity = 0;
320 IMPL_LOCAL_VARS;
321
322 #ifdef FFB_RENDER_TRACE
323 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
324 __FUNCTION__, start, count, flags);
325 #endif
326 ffbRenderPrimitive(ctx, GL_TRIANGLE_STRIP);
327
328 i = start + 2;
329 goto something_clipped;
330
331 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)];
336 FFB_AREA_DECLARE
337
338 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
339 FFB_CULL_TRI(continue;);
340
341 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
342 (FFB_VERTEX_COLOR_COST * 3) + 9));
343 FFB_SET_PRIM_COLOR(v2);
344
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);
349
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);
354
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);
359
360 i++;
361 parity ^= 1;
362 break;
363 }
364
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)];
369 FFB_AREA_DECLARE
370 (void) v0; (void) v1;
371
372 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
373 FFB_CULL_TRI(i++; parity^=1; goto something_clipped;);
374
375 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
376 (FFB_VERTEX_COLOR_COST * 1) + 3));
377 FFB_SET_PRIM_COLOR(v2);
378
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);
383 }
384
385 fmesa->ffbScreen->rp_active = 1;
386 }
387
388 static void TAG(ffb_vb_tri_fan)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
389 {
390 GLint i;
391 IMPL_LOCAL_VARS;
392
393 #ifdef FFB_RENDER_TRACE
394 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
395 __FUNCTION__, start, count, flags);
396 #endif
397 ffbRenderPrimitive(ctx, GL_TRIANGLE_FAN);
398
399 i = start + 2;
400 goto something_clipped;
401
402 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)];
407 FFB_AREA_DECLARE
408
409 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
410 FFB_CULL_TRI(continue;);
411
412 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
413 (FFB_VERTEX_COLOR_COST * 3) + 9));
414 FFB_SET_PRIM_COLOR(v2);
415
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);
420
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);
425
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);
430
431 i++;
432 break;
433 }
434
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)];
439 FFB_AREA_DECLARE
440 (void) v0; (void) v1;
441
442 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
443 FFB_CULL_TRI(i++; goto something_clipped;);
444
445 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
446 (FFB_VERTEX_COLOR_COST * 1) + 3));
447 FFB_SET_PRIM_COLOR(v2);
448
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);
453 }
454
455 fmesa->ffbScreen->rp_active = 1;
456 }
457
458 static void TAG(ffb_vb_poly)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
459 {
460 GLint i;
461 IMPL_LOCAL_VARS;
462
463 #ifdef FFB_RENDER_TRACE
464 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
465 __FUNCTION__, start, count, flags);
466 #endif
467 ffbRenderPrimitive(ctx, GL_POLYGON);
468
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)];
474 FFB_AREA_DECLARE
475
476 FFB_COMPUTE_AREA_TRI(v0, v1, v2);
477 FFB_CULL_TRI(continue;);
478
479 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
480 (FFB_VERTEX_COLOR_COST * 3) + 9));
481 FFB_SET_PRIM_COLOR(v2);
482
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);
487
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);
492
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);
497 }
498
499 fmesa->ffbScreen->rp_active = 1;
500 }
501
502 static void TAG(ffb_vb_quads)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
503 {
504 GLint i;
505 IMPL_LOCAL_VARS;
506
507 #ifdef FFB_RENDER_TRACE
508 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
509 __FUNCTION__, start, count, flags);
510 #endif
511 ffbRenderPrimitive(ctx, GL_QUADS);
512
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)];
518 FFB_AREA_DECLARE
519
520 FFB_COMPUTE_AREA_QUAD(v0, v1, v2, v3);
521 FFB_CULL_QUAD(continue;);
522
523 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
524 (FFB_VERTEX_COLOR_COST * 4) + 12));
525 FFB_SET_PRIM_COLOR(v3);
526
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);
531
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);
536
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);
541
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);
546 }
547
548 fmesa->ffbScreen->rp_active = 1;
549 }
550
551 static void TAG(ffb_vb_quad_strip)(GLcontext *ctx, GLuint start, GLuint count, GLuint flags)
552 {
553 GLint i;
554 IMPL_LOCAL_VARS;
555
556 #ifdef FFB_RENDER_TRACE
557 fprintf(stderr, "%s: start(%d) count(%d) flags(%x)\n",
558 __FUNCTION__, start, count, flags);
559 #endif
560 ffbRenderPrimitive(ctx, GL_QUAD_STRIP);
561
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)];
568 FFB_AREA_DECLARE
569
570 FFB_COMPUTE_AREA_QUAD(v0, v1, v2, v3);
571 FFB_CULL_QUAD(continue;);
572
573 FFBFifo(fmesa, (FFB_PRIM_COLOR_COST +
574 (FFB_VERTEX_COLOR_COST * 4) + 12));
575 FFB_SET_PRIM_COLOR(v3);
576
577 FFB_DUMP_VERTEX(v0);
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);
582
583 FFB_DUMP_VERTEX(v1);
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);
588
589 FFB_DUMP_VERTEX(v2);
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);
594
595 FFB_DUMP_VERTEX(v3);
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);
600 }
601
602 fmesa->ffbScreen->rp_active = 1;
603 }
604
605 static void (*TAG(render_tab)[GL_POLYGON + 2])(GLcontext *, GLuint, GLuint, GLuint) =
606 {
607 #if !(IND & (FFB_TRI_CULL_BIT))
608 TAG(ffb_vb_points),
609 TAG(ffb_vb_lines),
610 TAG(ffb_vb_line_loop),
611 TAG(ffb_vb_line_strip),
612 #else
613 NULL,
614 NULL,
615 NULL,
616 NULL,
617 #endif
618 TAG(ffb_vb_triangles),
619 TAG(ffb_vb_tri_strip),
620 TAG(ffb_vb_tri_fan),
621 TAG(ffb_vb_quads),
622 TAG(ffb_vb_quad_strip),
623 TAG(ffb_vb_poly),
624 ffb_vb_noop,
625 };
626
627 #undef IND
628 #undef TAG
629
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
640 #undef RESET_STIPPLE
641 #undef FFB_AREA_DECLARE
642 #undef FFB_COMPUTE_AREA_TRI
643 #undef FFB_COMPUTE_AREA_QUAD
644 #undef FFB_CULL_TRI
645 #undef FFB_CULL_QUAD