1 /* $Id: xm_tri.c,v 1.18 2001/02/06 04:06:36 keithw Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 * This file contains "accelerated" triangle functions. It should be
30 * fairly easy to write new special-purpose triangle functions and hook
31 * them into this module.
35 #include "glxheader.h"
42 /* Internal swrast includes:
44 #include "swrast/s_context.h"
45 #include "swrast/s_depth.h"
46 #include "swrast/s_triangle.h"
51 /**********************************************************************/
52 /*** Triangle rendering ***/
53 /**********************************************************************/
57 * XImage, smooth, depth-buffered, PF_TRUECOLOR triangle.
59 static void smooth_TRUECOLOR_z_triangle( GLcontext
*ctx
,
64 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
65 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
67 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
69 #define INNER_LOOP( LEFT, RIGHT, Y ) \
71 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer, Y); \
72 GLint len = RIGHT-LEFT; \
74 for (i=0;i<len;i++,xx++) { \
75 GLdepth z = FixedToDepth(ffz); \
78 PACK_TRUECOLOR(p, FixedToInt(ffr), FixedToInt(ffg), FixedToInt(ffb));\
79 XMesaPutPixel( img, xx, yy, p ); \
82 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
86 #include "swrast/s_tritemp.h"
92 * XImage, smooth, depth-buffered, PF_8A8B8G8R triangle.
94 static void smooth_8A8B8G8R_z_triangle( GLcontext
*ctx
,
99 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
101 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
103 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
104 #define PIXEL_TYPE GLuint
105 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
106 #define INNER_LOOP( LEFT, RIGHT, Y ) \
108 GLint i, len = RIGHT-LEFT; \
110 for (i=0;i<len;i++) { \
111 GLdepth z = FixedToDepth(ffz); \
113 pRow[i] = PACK_8B8G8R( FixedToInt(ffr), FixedToInt(ffg), \
117 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
121 #include "swrast/s_tritemp.h"
126 * XImage, smooth, depth-buffered, PF_8R8G8B triangle.
128 static void smooth_8R8G8B_z_triangle( GLcontext
*ctx
,
133 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
135 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
137 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
138 #define PIXEL_TYPE GLuint
139 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
140 #define INNER_LOOP( LEFT, RIGHT, Y ) \
142 GLint i, len = RIGHT-LEFT; \
144 for (i=0;i<len;i++) { \
145 GLdepth z = FixedToDepth(ffz); \
147 pRow[i] = PACK_8R8G8B( FixedToInt(ffr), FixedToInt(ffg), \
151 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
155 #include "swrast/s_tritemp.h"
160 * XImage, smooth, depth-buffered, PF_8R8G8B24 triangle.
162 static void smooth_8R8G8B24_z_triangle( GLcontext
*ctx
,
167 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
169 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
171 #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
172 #define PIXEL_TYPE bgr_t
173 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
174 #define INNER_LOOP( LEFT, RIGHT, Y ) \
176 GLint i, len = RIGHT-LEFT; \
178 for (i=0;i<len;i++) { \
179 GLdepth z = FixedToDepth(ffz); \
181 PIXEL_TYPE *ptr = pRow + i; \
182 ptr->r = FixedToInt(ffr); \
183 ptr->g = FixedToInt(ffg); \
184 ptr->b = FixedToInt(ffb); \
187 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
191 #include "swrast/s_tritemp.h"
196 * XImage, smooth, depth-buffered, PF_TRUEDITHER triangle.
198 static void smooth_TRUEDITHER_z_triangle( GLcontext
*ctx
,
203 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
204 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
206 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
208 #define INNER_LOOP( LEFT, RIGHT, Y ) \
210 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
212 for (i=0;i<len;i++,xx++) { \
213 GLdepth z = FixedToDepth(ffz); \
216 PACK_TRUEDITHER( p, xx, yy, FixedToInt(ffr), \
217 FixedToInt(ffg), FixedToInt(ffb) ); \
218 XMesaPutPixel( img, xx, yy, p ); \
221 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
225 #include "swrast/s_tritemp.h"
230 * XImage, smooth, depth-buffered, PF_5R6G5B triangle.
232 static void smooth_5R6G5B_z_triangle( GLcontext
*ctx
,
237 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
239 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
241 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
242 #define PIXEL_TYPE GLushort
243 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
244 #define INNER_LOOP( LEFT, RIGHT, Y ) \
246 GLint i, len = RIGHT-LEFT; \
248 for (i=0;i<len;i++) { \
249 DEPTH_TYPE z = FixedToDepth(ffz); \
251 pRow[i] = PACK_5R6G5B( FixedToInt(ffr), FixedToInt(ffg), \
255 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
259 #include "swrast/s_tritemp.h"
264 * XImage, smooth, depth-buffered, PF_DITHER_5R6G5B triangle.
266 static void smooth_DITHER_5R6G5B_z_triangle( GLcontext
*ctx
,
271 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
273 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
275 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
276 #define PIXEL_TYPE GLushort
277 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
278 #define INNER_LOOP( LEFT, RIGHT, Y ) \
280 GLint i, len = RIGHT-LEFT; \
281 GLint yy = FLIP(xmesa->xm_buffer, Y); \
283 for (i=0;i<len;i++) { \
284 GLdepth z = FixedToDepth(ffz); \
286 PACK_TRUEDITHER(pRow[i], LEFT+i, yy, FixedToInt(ffr), \
287 FixedToInt(ffg), FixedToInt(ffb) ); \
290 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
294 #include "swrast/s_tritemp.h"
299 * XImage, smooth, depth-buffered, 8-bit, PF_DITHER8 triangle.
301 static void smooth_DITHER8_z_triangle( GLcontext
*ctx
,
306 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
308 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
310 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
311 #define PIXEL_TYPE GLubyte
312 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
313 #define INNER_LOOP( LEFT, RIGHT, Y ) \
315 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
318 for (i=0;i<len;i++,xx++) { \
319 GLdepth z = FixedToDepth(ffz); \
321 pRow[i] = (PIXEL_TYPE) XDITHER( xx, FixedToInt(ffr), \
322 FixedToInt(ffg), FixedToInt(ffb) ); \
325 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
329 #include "swrast/s_tritemp.h"
334 * XImage, smooth, depth-buffered, PF_DITHER triangle.
336 static void smooth_DITHER_z_triangle( GLcontext
*ctx
,
341 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
342 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
344 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
346 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
347 #define PIXEL_TYPE GLubyte
348 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
349 #define INNER_LOOP( LEFT, RIGHT, Y ) \
351 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
354 for (i=0;i<len;i++,xx++) { \
355 GLdepth z = FixedToDepth(ffz); \
357 unsigned long p = XDITHER( xx, FixedToInt(ffr), \
358 FixedToInt(ffg), FixedToInt(ffb) ); \
359 XMesaPutPixel( img, xx, yy, p ); \
362 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
366 #include "swrast/s_tritemp.h"
371 * XImage, smooth, depth-buffered, 8-bit PF_LOOKUP triangle.
373 static void smooth_LOOKUP8_z_triangle( GLcontext
*ctx
,
378 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
380 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
382 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
383 #define PIXEL_TYPE GLubyte
384 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
385 #define INNER_LOOP( LEFT, RIGHT, Y ) \
387 GLint i, len = RIGHT-LEFT; \
390 for (i=0;i<len;i++) { \
391 GLdepth z = FixedToDepth(ffz); \
393 pRow[i] = LOOKUP( FixedToInt(ffr), FixedToInt(ffg), \
397 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
401 #include "swrast/s_tritemp.h"
407 * XImage, smooth, depth-buffered, 8-bit PF_HPCR triangle.
409 static void smooth_HPCR_z_triangle( GLcontext
*ctx
,
414 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
416 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
418 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
419 #define PIXEL_TYPE GLubyte
420 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
421 #define INNER_LOOP( LEFT, RIGHT, Y ) \
423 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
425 for (i=0;i<len;i++,xx++) { \
426 GLdepth z = FixedToDepth(ffz); \
428 pRow[i] = DITHER_HPCR( xx, yy, FixedToInt(ffr), \
429 FixedToInt(ffg), FixedToInt(ffb) ); \
432 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
436 #include "swrast/s_tritemp.h"
441 * XImage, flat, depth-buffered, PF_TRUECOLOR triangle.
443 static void flat_TRUECOLOR_z_triangle( GLcontext
*ctx
,
448 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
449 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
451 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
453 unsigned long pixel; \
454 PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]);
456 #define INNER_LOOP( LEFT, RIGHT, Y ) \
458 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
460 for (i=0;i<len;i++,xx++) { \
461 GLdepth z = FixedToDepth(ffz); \
463 XMesaPutPixel( img, xx, yy, pixel ); \
469 #include "swrast/s_tritemp.h"
474 * XImage, flat, depth-buffered, PF_8A8B8G8R triangle.
476 static void flat_8A8B8G8R_z_triangle( GLcontext
*ctx
,
481 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
483 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
484 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
485 #define PIXEL_TYPE GLuint
486 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
488 unsigned long p = PACK_8B8G8R( v2->color[0], \
489 v2->color[1], v2->color[2] );
490 #define INNER_LOOP( LEFT, RIGHT, Y ) \
492 GLint i, len = RIGHT-LEFT; \
494 for (i=0;i<len;i++) { \
495 GLdepth z = FixedToDepth(ffz); \
497 pRow[i] = (PIXEL_TYPE) p; \
503 #include "swrast/s_tritemp.h"
508 * XImage, flat, depth-buffered, PF_8R8G8B triangle.
510 static void flat_8R8G8B_z_triangle( GLcontext
*ctx
,
515 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
517 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
518 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
519 #define PIXEL_TYPE GLuint
520 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
522 unsigned long p = PACK_8R8G8B( v2->color[0], \
523 v2->color[1], v2->color[2] );
524 #define INNER_LOOP( LEFT, RIGHT, Y ) \
526 GLint i, len = RIGHT-LEFT; \
528 for (i=0;i<len;i++) { \
529 GLdepth z = FixedToDepth(ffz); \
531 pRow[i] = (PIXEL_TYPE) p; \
537 #include "swrast/s_tritemp.h"
542 * XImage, flat, depth-buffered, PF_8R8G8B24 triangle.
544 static void flat_8R8G8B24_z_triangle( GLcontext
*ctx
,
549 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
550 const GLubyte
*color
= v2
->color
;
552 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
553 #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
554 #define PIXEL_TYPE bgr_t
555 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
556 #define INNER_LOOP( LEFT, RIGHT, Y ) \
558 GLint i, len = RIGHT-LEFT; \
560 for (i=0;i<len;i++) { \
561 GLdepth z = FixedToDepth(ffz); \
563 PIXEL_TYPE *ptr = pRow+i; \
564 ptr->r = color[RCOMP]; \
565 ptr->g = color[GCOMP]; \
566 ptr->b = color[BCOMP]; \
572 #include "swrast/s_tritemp.h"
577 * XImage, flat, depth-buffered, PF_TRUEDITHER triangle.
579 static void flat_TRUEDITHER_z_triangle( GLcontext
*ctx
,
584 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
585 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
587 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
588 #define INNER_LOOP( LEFT, RIGHT, Y ) \
590 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
592 for (i=0;i<len;i++,xx++) { \
593 GLdepth z = FixedToDepth(ffz); \
596 PACK_TRUEDITHER( p, xx, yy, v2->color[0], \
597 v2->color[1], v2->color[2] ); \
598 XMesaPutPixel( img, xx, yy, p ); \
604 #include "swrast/s_tritemp.h"
609 * XImage, flat, depth-buffered, PF_5R6G5B triangle.
611 static void flat_5R6G5B_z_triangle( GLcontext
*ctx
,
616 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
618 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
619 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
620 #define PIXEL_TYPE GLushort
621 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
623 unsigned long p = PACK_5R6G5B( v2->color[0], \
624 v2->color[1], v2->color[2] );
625 #define INNER_LOOP( LEFT, RIGHT, Y ) \
627 GLint i, len = RIGHT-LEFT; \
629 for (i=0;i<len;i++) { \
630 DEPTH_TYPE z = FixedToDepth(ffz); \
632 pRow[i] = (PIXEL_TYPE) p; \
638 #include "swrast/s_tritemp.h"
643 * XImage, flat, depth-buffered, PF_DITHER_5R6G5B triangle.
645 static void flat_DITHER_5R6G5B_z_triangle( GLcontext
*ctx
,
650 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
651 const GLubyte
*color
= v2
->color
;
653 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
654 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
655 #define PIXEL_TYPE GLushort
656 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
657 #define INNER_LOOP( LEFT, RIGHT, Y ) \
659 GLint i, len = RIGHT-LEFT; \
660 GLint yy = FLIP(xmesa->xm_buffer, Y); \
662 for (i=0;i<len;i++) { \
663 DEPTH_TYPE z = FixedToDepth(ffz); \
665 PACK_TRUEDITHER(pRow[i], LEFT+i, yy, color[RCOMP], \
666 color[GCOMP], color[BCOMP]); \
672 #include "swrast/s_tritemp.h"
677 * XImage, flat, depth-buffered, 8-bit PF_DITHER triangle.
679 static void flat_DITHER8_z_triangle( GLcontext
*ctx
,
684 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
686 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
687 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
688 #define PIXEL_TYPE GLubyte
689 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
691 FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] );
693 #define INNER_LOOP( LEFT, RIGHT, Y ) \
695 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
696 FLAT_DITHER_ROW_SETUP(FLIP(xmesa->xm_buffer, yy)); \
698 for (i=0;i<len;i++,xx++) { \
699 GLdepth z = FixedToDepth(ffz); \
701 pRow[i] = (PIXEL_TYPE) FLAT_DITHER(xx); \
707 #include "swrast/s_tritemp.h"
712 * XImage, flat, depth-buffered, PF_DITHER triangle.
714 static void flat_DITHER_z_triangle( GLcontext
*ctx
,
719 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
720 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
722 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
724 FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] );
726 #define INNER_LOOP( LEFT, RIGHT, Y ) \
728 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
729 FLAT_DITHER_ROW_SETUP(yy); \
731 for (i=0;i<len;i++,xx++) { \
732 GLdepth z = FixedToDepth(ffz); \
734 unsigned long p = FLAT_DITHER(xx); \
735 XMesaPutPixel( img, xx, yy, p ); \
741 #include "swrast/s_tritemp.h"
746 * XImage, flat, depth-buffered, 8-bit PF_HPCR triangle.
748 static void flat_HPCR_z_triangle( GLcontext
*ctx
,
753 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
755 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
756 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
757 #define PIXEL_TYPE GLubyte
758 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
760 GLubyte r = v2->color[0]; \
761 GLubyte g = v2->color[1]; \
762 GLubyte b = v2->color[2];
763 #define INNER_LOOP( LEFT, RIGHT, Y ) \
765 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
767 for (i=0;i<len;i++,xx++) { \
768 GLdepth z = FixedToDepth(ffz); \
770 pRow[i] = (PIXEL_TYPE) DITHER_HPCR( xx, yy, r, g, b ); \
776 #include "swrast/s_tritemp.h"
781 * XImage, flat, depth-buffered, 8-bit PF_LOOKUP triangle.
783 static void flat_LOOKUP8_z_triangle( GLcontext
*ctx
,
788 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
790 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
791 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
792 #define PIXEL_TYPE GLubyte
793 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
796 GLubyte r = v2->color[0]; \
797 GLubyte g = v2->color[1]; \
798 GLubyte b = v2->color[2]; \
799 GLubyte p = LOOKUP(r,g,b);
800 #define INNER_LOOP( LEFT, RIGHT, Y ) \
802 GLint i, len = RIGHT-LEFT; \
804 for (i=0;i<len;i++) { \
805 GLdepth z = FixedToDepth(ffz); \
813 #include "swrast/s_tritemp.h"
819 * XImage, smooth, NON-depth-buffered, PF_TRUECOLOR triangle.
821 static void smooth_TRUECOLOR_triangle( GLcontext
*ctx
,
826 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
827 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
829 #define INNER_LOOP( LEFT, RIGHT, Y ) \
831 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
832 for (xx=LEFT;xx<RIGHT;xx++) { \
834 PACK_TRUECOLOR(p, FixedToInt(ffr), FixedToInt(ffg), FixedToInt(ffb));\
835 XMesaPutPixel( img, xx, yy, p ); \
836 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
839 #include "swrast/s_tritemp.h"
844 * XImage, smooth, NON-depth-buffered, PF_8A8B8G8R triangle.
846 static void smooth_8A8B8G8R_triangle( GLcontext
*ctx
,
851 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
853 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
854 #define PIXEL_TYPE GLuint
855 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
856 #define INNER_LOOP( LEFT, RIGHT, Y ) \
859 PIXEL_TYPE *pixel = pRow; \
860 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
861 *pixel = PACK_8B8G8R( FixedToInt(ffr), FixedToInt(ffg), \
863 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
866 #include "swrast/s_tritemp.h"
871 * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
873 static void smooth_8R8G8B_triangle( GLcontext
*ctx
,
878 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
880 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
881 #define PIXEL_TYPE GLuint
882 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
883 #define INNER_LOOP( LEFT, RIGHT, Y ) \
886 PIXEL_TYPE *pixel = pRow; \
887 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
888 *pixel = PACK_8R8G8B( FixedToInt(ffr), FixedToInt(ffg), \
890 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
893 #include "swrast/s_tritemp.h"
898 * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
900 static void smooth_8R8G8B24_triangle( GLcontext
*ctx
,
905 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
907 #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
908 #define PIXEL_TYPE bgr_t
909 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
910 #define INNER_LOOP( LEFT, RIGHT, Y ) \
913 PIXEL_TYPE *pixel = pRow; \
914 for (xx=LEFT;xx<RIGHT;xx++) { \
915 pixel->r = FixedToInt(ffr); \
916 pixel->g = FixedToInt(ffg); \
917 pixel->b = FixedToInt(ffb); \
918 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
922 #include "swrast/s_tritemp.h"
927 * XImage, smooth, NON-depth-buffered, PF_TRUEDITHER triangle.
929 static void smooth_TRUEDITHER_triangle( GLcontext
*ctx
,
934 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
935 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
937 #define INNER_LOOP( LEFT, RIGHT, Y ) \
939 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
940 for (xx=LEFT;xx<RIGHT;xx++) { \
942 PACK_TRUEDITHER( p, xx, yy, FixedToInt(ffr), FixedToInt(ffg), \
944 XMesaPutPixel( img, xx, yy, p ); \
945 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
948 #include "swrast/s_tritemp.h"
953 * XImage, smooth, NON-depth-buffered, PF_5R6G5B triangle.
955 static void smooth_5R6G5B_triangle( GLcontext
*ctx
,
960 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
962 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
963 #define PIXEL_TYPE GLushort
964 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
965 #define INNER_LOOP( LEFT, RIGHT, Y ) \
968 PIXEL_TYPE *pixel = pRow; \
969 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
970 *pixel = (PIXEL_TYPE) PACK_5R6G5B( FixedToInt(ffr), \
971 FixedToInt(ffg), FixedToInt(ffb) ); \
972 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
975 #include "swrast/s_tritemp.h"
980 * XImage, smooth, NON-depth-buffered, PF_DITHER_5R6G5B triangle.
982 static void smooth_DITHER_5R6G5B_triangle( GLcontext
*ctx
,
987 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
989 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
990 #define PIXEL_TYPE GLushort
991 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
992 #define INNER_LOOP( LEFT, RIGHT, Y ) \
994 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
995 PIXEL_TYPE *pixel = pRow; \
996 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
997 PACK_TRUEDITHER(*pixel, xx, yy, FixedToInt(ffr), \
998 FixedToInt(ffg), FixedToInt(ffb) ); \
999 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1002 #include "swrast/s_tritemp.h"
1007 * XImage, smooth, NON-depth-buffered, 8-bit PF_DITHER triangle.
1009 static void smooth_DITHER8_triangle( GLcontext
*ctx
,
1012 const SWvertex
*v2
)
1014 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1015 #define INTERP_RGB 1
1016 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1017 #define PIXEL_TYPE GLubyte
1018 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1019 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1021 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1022 PIXEL_TYPE *pixel = pRow; \
1023 XDITHER_SETUP(yy); \
1024 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1025 *pixel = (PIXEL_TYPE) XDITHER( xx, FixedToInt(ffr), \
1026 FixedToInt(ffg), FixedToInt(ffb) ); \
1027 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1030 #include "swrast/s_tritemp.h"
1035 * XImage, smooth, NON-depth-buffered, PF_DITHER triangle.
1037 static void smooth_DITHER_triangle( GLcontext
*ctx
,
1040 const SWvertex
*v2
)
1042 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1043 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
1045 #define INTERP_RGB 1
1046 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1048 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1049 XDITHER_SETUP(yy); \
1050 for (xx=LEFT;xx<RIGHT;xx++) { \
1051 unsigned long p = XDITHER( xx, FixedToInt(ffr), \
1052 FixedToInt(ffg), FixedToInt(ffb) ); \
1053 XMesaPutPixel( img, xx, yy, p ); \
1054 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1057 #include "swrast/s_tritemp.h"
1062 * XImage, smooth, NON-depth-buffered, 8-bit PF_LOOKUP triangle.
1064 static void smooth_LOOKUP8_triangle( GLcontext
*ctx
,
1067 const SWvertex
*v2
)
1069 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1071 #define INTERP_RGB 1
1072 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1073 #define PIXEL_TYPE GLubyte
1074 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1075 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1078 PIXEL_TYPE *pixel = pRow; \
1080 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1081 *pixel = LOOKUP( FixedToInt(ffr), FixedToInt(ffg), \
1082 FixedToInt(ffb) ); \
1083 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1086 #include "swrast/s_tritemp.h"
1092 * XImage, smooth, NON-depth-buffered, 8-bit PF_HPCR triangle.
1094 static void smooth_HPCR_triangle( GLcontext
*ctx
,
1097 const SWvertex
*v2
)
1099 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1101 #define INTERP_RGB 1
1102 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1103 #define PIXEL_TYPE GLubyte
1104 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1105 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1107 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1108 PIXEL_TYPE *pixel = pRow; \
1109 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1110 *pixel = DITHER_HPCR( xx, yy, FixedToInt(ffr), \
1111 FixedToInt(ffg), FixedToInt(ffb) ); \
1112 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1115 #include "swrast/s_tritemp.h"
1120 * XImage, flat, NON-depth-buffered, PF_TRUECOLOR triangle.
1122 static void flat_TRUECOLOR_triangle( GLcontext
*ctx
,
1125 const SWvertex
*v2
)
1127 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1128 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
1129 #define SETUP_CODE \
1130 unsigned long pixel; \
1131 PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]);
1133 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1135 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1136 for (xx=LEFT;xx<RIGHT;xx++) { \
1137 XMesaPutPixel( img, xx, yy, pixel ); \
1140 #include "swrast/s_tritemp.h"
1145 * XImage, flat, NON-depth-buffered, PF_8A8B8G8R triangle.
1147 static void flat_8A8B8G8R_triangle( GLcontext
*ctx
,
1150 const SWvertex
*v2
)
1152 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1153 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
1154 #define PIXEL_TYPE GLuint
1155 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1156 #define SETUP_CODE \
1157 unsigned long p = PACK_8B8G8R( v2->color[0], \
1158 v2->color[1], v2->color[2] );
1159 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1162 PIXEL_TYPE *pixel = pRow; \
1163 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1164 *pixel = (PIXEL_TYPE) p; \
1167 #include "swrast/s_tritemp.h"
1172 * XImage, flat, NON-depth-buffered, PF_8R8G8B triangle.
1174 static void flat_8R8G8B_triangle( GLcontext
*ctx
,
1177 const SWvertex
*v2
)
1179 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1180 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
1181 #define PIXEL_TYPE GLuint
1182 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1183 #define SETUP_CODE \
1184 unsigned long p = PACK_8R8G8B( v2->color[0], \
1185 v2->color[1], v2->color[2] );
1186 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1189 PIXEL_TYPE *pixel = pRow; \
1190 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1191 *pixel = (PIXEL_TYPE) p; \
1194 #include "swrast/s_tritemp.h"
1199 * XImage, flat, NON-depth-buffered, PF_8R8G8B24 triangle.
1201 static void flat_8R8G8B24_triangle( GLcontext
*ctx
,
1204 const SWvertex
*v2
)
1206 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1207 const GLubyte
*color
= v2
->color
;
1208 #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
1209 #define PIXEL_TYPE bgr_t
1210 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1211 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1214 PIXEL_TYPE *pixel = pRow; \
1215 for (xx=LEFT;xx<RIGHT;xx++) { \
1216 pixel->r = color[RCOMP]; \
1217 pixel->g = color[GCOMP]; \
1218 pixel->b = color[BCOMP]; \
1222 #include "swrast/s_tritemp.h"
1226 * XImage, flat, NON-depth-buffered, PF_TRUEDITHER triangle.
1228 static void flat_TRUEDITHER_triangle( GLcontext
*ctx
,
1231 const SWvertex
*v2
)
1233 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1234 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
1235 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1237 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1238 for (xx=LEFT;xx<RIGHT;xx++) { \
1240 PACK_TRUEDITHER( p, xx, yy, v2->color[0], \
1241 v2->color[1], v2->color[2] ); \
1242 XMesaPutPixel( img, xx, yy, p ); \
1245 #include "swrast/s_tritemp.h"
1251 * XImage, flat, NON-depth-buffered, PF_5R6G5B triangle.
1253 static void flat_5R6G5B_triangle( GLcontext
*ctx
,
1256 const SWvertex
*v2
)
1258 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1259 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
1260 #define PIXEL_TYPE GLushort
1261 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1262 #define SETUP_CODE \
1263 unsigned long p = PACK_5R6G5B( v2->color[0], \
1264 v2->color[1], v2->color[2] );
1265 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1268 PIXEL_TYPE *pixel = pRow; \
1269 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1270 *pixel = (PIXEL_TYPE) p; \
1273 #include "swrast/s_tritemp.h"
1278 * XImage, flat, NON-depth-buffered, PF_DITHER_5R6G5B triangle.
1280 static void flat_DITHER_5R6G5B_triangle( GLcontext
*ctx
,
1283 const SWvertex
*v2
)
1285 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1286 const GLubyte
*color
= v2
->color
;
1287 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
1288 #define PIXEL_TYPE GLushort
1289 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1290 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1292 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1293 PIXEL_TYPE *pixel = pRow; \
1294 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1295 PACK_TRUEDITHER(*pixel, xx, yy, color[RCOMP], \
1296 color[GCOMP], color[BCOMP]); \
1299 #include "swrast/s_tritemp.h"
1304 * XImage, flat, NON-depth-buffered, 8-bit PF_DITHER triangle.
1306 static void flat_DITHER8_triangle( GLcontext
*ctx
,
1309 const SWvertex
*v2
)
1311 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1312 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1313 #define PIXEL_TYPE GLubyte
1314 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1315 #define SETUP_CODE \
1316 FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] );
1318 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1321 PIXEL_TYPE *pixel = pRow; \
1322 FLAT_DITHER_ROW_SETUP(FLIP(xmesa->xm_buffer, Y)); \
1323 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1324 *pixel = (PIXEL_TYPE) FLAT_DITHER(xx); \
1327 #include "swrast/s_tritemp.h"
1332 * XImage, flat, NON-depth-buffered, PF_DITHER triangle.
1334 static void flat_DITHER_triangle( GLcontext
*ctx
,
1337 const SWvertex
*v2
)
1339 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1340 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
1341 #define SETUP_CODE \
1342 FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] );
1344 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1346 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1347 FLAT_DITHER_ROW_SETUP(yy); \
1348 for (xx=LEFT;xx<RIGHT;xx++) { \
1349 unsigned long p = FLAT_DITHER(xx); \
1350 XMesaPutPixel( img, xx, yy, p ); \
1353 #include "swrast/s_tritemp.h"
1358 * XImage, flat, NON-depth-buffered, 8-bit PF_HPCR triangle.
1360 static void flat_HPCR_triangle( GLcontext
*ctx
,
1363 const SWvertex
*v2
)
1365 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1366 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1367 #define PIXEL_TYPE GLubyte
1368 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1369 #define SETUP_CODE \
1370 GLubyte r = v2->color[0]; \
1371 GLubyte g = v2->color[1]; \
1372 GLubyte b = v2->color[2];
1373 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1375 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1376 PIXEL_TYPE *pixel = pRow; \
1377 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1378 *pixel = (PIXEL_TYPE) DITHER_HPCR( xx, yy, r, g, b ); \
1381 #include "swrast/s_tritemp.h"
1386 * XImage, flat, NON-depth-buffered, 8-bit PF_LOOKUP triangle.
1388 static void flat_LOOKUP8_triangle( GLcontext
*ctx
,
1391 const SWvertex
*v2
)
1393 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1394 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1395 #define PIXEL_TYPE GLubyte
1396 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1397 #define SETUP_CODE \
1399 GLubyte r = v2->color[0]; \
1400 GLubyte g = v2->color[1]; \
1401 GLubyte b = v2->color[2]; \
1402 GLubyte p = LOOKUP(r,g,b);
1403 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1406 PIXEL_TYPE *pixel = pRow; \
1407 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1411 #include "swrast/s_tritemp.h"
1416 extern void _xmesa_print_triangle_func( swrast_tri_func triFunc
);
1417 void _xmesa_print_triangle_func( swrast_tri_func triFunc
)
1419 printf("XMesa tri func = ");
1420 if (triFunc
==smooth_TRUECOLOR_z_triangle
)
1421 printf("smooth_TRUECOLOR_z_triangle\n");
1422 else if (triFunc
==smooth_8A8B8G8R_z_triangle
)
1423 printf("smooth_8A8B8G8R_z_triangle\n");
1424 else if (triFunc
==smooth_8R8G8B_z_triangle
)
1425 printf("smooth_8R8G8B_z_triangle\n");
1426 else if (triFunc
==smooth_8R8G8B24_z_triangle
)
1427 printf("smooth_8R8G8B24_z_triangle\n");
1428 else if (triFunc
==smooth_TRUEDITHER_z_triangle
)
1429 printf("smooth_TRUEDITHER_z_triangle\n");
1430 else if (triFunc
==smooth_5R6G5B_z_triangle
)
1431 printf("smooth_5R6G5B_z_triangle\n");
1432 else if (triFunc
==smooth_DITHER_5R6G5B_z_triangle
)
1433 printf("smooth_DITHER_5R6G5B_z_triangle\n");
1434 else if (triFunc
==smooth_HPCR_z_triangle
)
1435 printf("smooth_HPCR_z_triangle\n");
1436 else if (triFunc
==smooth_DITHER8_z_triangle
)
1437 printf("smooth_DITHER8_z_triangle\n");
1438 else if (triFunc
==smooth_LOOKUP8_z_triangle
)
1439 printf("smooth_LOOKUP8_z_triangle\n");
1440 else if (triFunc
==flat_TRUECOLOR_z_triangle
)
1441 printf("flat_TRUECOLOR_z_triangle\n");
1442 else if (triFunc
==flat_8A8B8G8R_z_triangle
)
1443 printf("flat_8A8B8G8R_z_triangle\n");
1444 else if (triFunc
==flat_8R8G8B_z_triangle
)
1445 printf("flat_8R8G8B_z_triangle\n");
1446 else if (triFunc
==flat_8R8G8B24_z_triangle
)
1447 printf("flat_8R8G8B24_z_triangle\n");
1448 else if (triFunc
==flat_TRUEDITHER_z_triangle
)
1449 printf("flat_TRUEDITHER_z_triangle\n");
1450 else if (triFunc
==flat_5R6G5B_z_triangle
)
1451 printf("flat_5R6G5B_z_triangle\n");
1452 else if (triFunc
==flat_DITHER_5R6G5B_z_triangle
)
1453 printf("flat_DITHER_5R6G5B_z_triangle\n");
1454 else if (triFunc
==flat_HPCR_z_triangle
)
1455 printf("flat_HPCR_z_triangle\n");
1456 else if (triFunc
==flat_DITHER8_z_triangle
)
1457 printf("flat_DITHER8_z_triangle\n");
1458 else if (triFunc
==flat_LOOKUP8_z_triangle
)
1459 printf("flat_LOOKUP8_z_triangle\n");
1460 else if (triFunc
==smooth_TRUECOLOR_triangle
)
1461 printf("smooth_TRUECOLOR_triangle\n");
1462 else if (triFunc
==smooth_8A8B8G8R_triangle
)
1463 printf("smooth_8A8B8G8R_triangle\n");
1464 else if (triFunc
==smooth_8R8G8B_triangle
)
1465 printf("smooth_8R8G8B_triangle\n");
1466 else if (triFunc
==smooth_8R8G8B24_triangle
)
1467 printf("smooth_8R8G8B24_triangle\n");
1468 else if (triFunc
==smooth_TRUEDITHER_triangle
)
1469 printf("smooth_TRUEDITHER_triangle\n");
1470 else if (triFunc
==smooth_5R6G5B_triangle
)
1471 printf("smooth_5R6G5B_triangle\n");
1472 else if (triFunc
==smooth_DITHER_5R6G5B_triangle
)
1473 printf("smooth_DITHER_5R6G5B_triangle\n");
1474 else if (triFunc
==smooth_HPCR_triangle
)
1475 printf("smooth_HPCR_triangle\n");
1476 else if (triFunc
==smooth_DITHER8_triangle
)
1477 printf("smooth_DITHER8_triangle\n");
1478 else if (triFunc
==smooth_LOOKUP8_triangle
)
1479 printf("smooth_LOOKUP8_triangle\n");
1480 else if (triFunc
==flat_TRUECOLOR_triangle
)
1481 printf("flat_TRUECOLOR_triangle\n");
1482 else if (triFunc
==flat_TRUEDITHER_triangle
)
1483 printf("flat_TRUEDITHER_triangle\n");
1484 else if (triFunc
==flat_8A8B8G8R_triangle
)
1485 printf("flat_8A8B8G8R_triangle\n");
1486 else if (triFunc
==flat_8R8G8B_triangle
)
1487 printf("flat_8R8G8B_triangle\n");
1488 else if (triFunc
==flat_8R8G8B24_triangle
)
1489 printf("flat_8R8G8B24_triangle\n");
1490 else if (triFunc
==flat_5R6G5B_triangle
)
1491 printf("flat_5R6G5B_triangle\n");
1492 else if (triFunc
==flat_DITHER_5R6G5B_triangle
)
1493 printf("flat_DITHER_5R6G5B_triangle\n");
1494 else if (triFunc
==flat_HPCR_triangle
)
1495 printf("flat_HPCR_triangle\n");
1496 else if (triFunc
==flat_DITHER8_triangle
)
1497 printf("flat_DITHER8_triangle\n");
1498 else if (triFunc
==flat_LOOKUP8_triangle
)
1499 printf("flat_LOOKUP8_triangle\n");
1508 /* record the current triangle function name */
1509 static const char *triFuncName
= NULL
;
1511 #define USE(triFunc) \
1513 triFuncName = #triFunc; \
1514 /*printf("%s\n", triFuncName);*/ \
1520 #define USE(triFunc) return triFunc
1525 static swrast_tri_func
get_triangle_func( GLcontext
*ctx
)
1527 SWcontext
*swrast
= SWRAST_CONTEXT(ctx
);
1528 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1529 int depth
= GET_VISUAL_DEPTH(xmesa
->xm_visual
);
1537 if (ctx
->RenderMode
!= GL_RENDER
) return (swrast_tri_func
) NULL
;
1538 if (ctx
->Polygon
.SmoothFlag
) return (swrast_tri_func
) NULL
;
1539 if (ctx
->Texture
._ReallyEnabled
) return (swrast_tri_func
) NULL
;
1541 if (xmesa
->xm_buffer
->buffer
==XIMAGE
) {
1542 if ( ctx
->Light
.ShadeModel
==GL_SMOOTH
1543 && swrast
->_RasterMask
==DEPTH_BIT
1544 && ctx
->Depth
.Func
==GL_LESS
1545 && ctx
->Depth
.Mask
==GL_TRUE
1546 && ctx
->Visual
.depthBits
== DEFAULT_SOFTWARE_DEPTH_BITS
1547 && ctx
->Polygon
.StippleFlag
==GL_FALSE
) {
1548 switch (xmesa
->pixelformat
) {
1550 USE(smooth_TRUECOLOR_z_triangle
);
1552 USE(smooth_8A8B8G8R_z_triangle
);
1554 USE(smooth_8R8G8B_z_triangle
);
1556 USE(smooth_8R8G8B24_z_triangle
);
1558 USE(smooth_TRUEDITHER_z_triangle
);
1560 USE(smooth_5R6G5B_z_triangle
);
1561 case PF_DITHER_5R6G5B
:
1562 USE(smooth_DITHER_5R6G5B_z_triangle
);
1564 USE(smooth_HPCR_z_triangle
);
1567 USE(smooth_DITHER8_z_triangle
);
1569 USE(smooth_DITHER_z_triangle
);
1573 USE(smooth_LOOKUP8_z_triangle
);
1575 return (swrast_tri_func
) NULL
;
1577 return (swrast_tri_func
) NULL
;
1580 if ( ctx
->Light
.ShadeModel
==GL_FLAT
1581 && swrast
->_RasterMask
==DEPTH_BIT
1582 && ctx
->Depth
.Func
==GL_LESS
1583 && ctx
->Depth
.Mask
==GL_TRUE
1584 && ctx
->Visual
.depthBits
== DEFAULT_SOFTWARE_DEPTH_BITS
1585 && ctx
->Polygon
.StippleFlag
==GL_FALSE
) {
1586 switch (xmesa
->pixelformat
) {
1588 USE(flat_TRUECOLOR_z_triangle
);
1590 USE(flat_8A8B8G8R_z_triangle
);
1592 USE(flat_8R8G8B_z_triangle
);
1594 USE(flat_8R8G8B24_z_triangle
);
1596 USE(flat_TRUEDITHER_z_triangle
);
1598 USE(flat_5R6G5B_z_triangle
);
1599 case PF_DITHER_5R6G5B
:
1600 USE(flat_DITHER_5R6G5B_z_triangle
);
1602 USE(flat_HPCR_z_triangle
);
1605 USE(flat_DITHER8_z_triangle
);
1607 USE(flat_DITHER_z_triangle
);
1611 USE(flat_LOOKUP8_z_triangle
);
1613 return (swrast_tri_func
) NULL
;
1615 return (swrast_tri_func
) NULL
;
1618 if ( swrast
->_RasterMask
==0 /* no depth test */
1619 && ctx
->Light
.ShadeModel
==GL_SMOOTH
1620 && ctx
->Polygon
.StippleFlag
==GL_FALSE
) {
1621 switch (xmesa
->pixelformat
) {
1623 USE(smooth_TRUECOLOR_triangle
);
1625 USE(smooth_8A8B8G8R_triangle
);
1627 USE(smooth_8R8G8B_triangle
);
1629 USE(smooth_8R8G8B24_triangle
);
1631 USE(smooth_TRUEDITHER_triangle
);
1633 USE(smooth_5R6G5B_triangle
);
1634 case PF_DITHER_5R6G5B
:
1635 USE(smooth_DITHER_5R6G5B_triangle
);
1637 USE(smooth_HPCR_triangle
);
1640 USE(smooth_DITHER8_triangle
);
1642 USE(smooth_DITHER_triangle
);
1646 USE(smooth_LOOKUP8_triangle
);
1648 return (swrast_tri_func
) NULL
;
1650 return (swrast_tri_func
) NULL
;
1654 if ( swrast
->_RasterMask
==0 /* no depth test */
1655 && ctx
->Light
.ShadeModel
==GL_FLAT
1656 && ctx
->Polygon
.StippleFlag
==GL_FALSE
) {
1657 switch (xmesa
->pixelformat
) {
1659 USE(flat_TRUECOLOR_triangle
);
1661 USE(flat_TRUEDITHER_triangle
);
1663 USE(flat_8A8B8G8R_triangle
);
1665 USE(flat_8R8G8B_triangle
);
1667 USE(flat_8R8G8B24_triangle
);
1669 USE(flat_5R6G5B_triangle
);
1670 case PF_DITHER_5R6G5B
:
1671 USE(flat_DITHER_5R6G5B_triangle
);
1673 USE(flat_HPCR_triangle
);
1676 USE(flat_DITHER8_triangle
);
1678 USE(flat_DITHER_triangle
);
1682 USE(flat_LOOKUP8_triangle
);
1684 return (swrast_tri_func
) NULL
;
1686 return (swrast_tri_func
) NULL
;
1690 return (swrast_tri_func
) NULL
;
1693 /* draw to pixmap */
1694 return (swrast_tri_func
) NULL
;
1699 /* Override for the swrast tri-selection function. Try to use one
1700 * of our internal tri functions, otherwise fall back to the
1701 * standard swrast functions.
1703 void xmesa_choose_triangle( GLcontext
*ctx
)
1705 SWcontext
*swrast
= SWRAST_CONTEXT(ctx
);
1707 if (!(swrast
->Triangle
= get_triangle_func( ctx
)))
1708 _swrast_choose_triangle( ctx
);