1 /* $Id: xm_tri.c,v 1.5 2000/10/30 13:32:03 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"
45 /**********************************************************************/
46 /*** Triangle rendering ***/
47 /**********************************************************************/
52 * Render a triangle into a pixmap, any pixel format, flat shaded and
55 static void flat_pixmap_triangle( GLcontext
*ctx
,
56 GLuint v0
, GLuint v1
, GLuint v2
, GLuint pv
)
58 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
59 struct vertex_buffer
*VB
= ctx
->VB
;
63 if (0 /*VB->MonoColor*/) {
64 gc
= xmesa
->xm_buffer
->gc1
; /* use current color */
68 if (xmesa
->xm_visual
->gl_visual
->RGBAflag
) {
69 pixel
= xmesa_color_to_pixel( xmesa
,
70 VB
->ColorPtr
->data
[pv
][0], VB
->ColorPtr
->data
[pv
][1],
71 VB
->ColorPtr
->data
[pv
][2], VB
->ColorPtr
->data
[pv
][3],
75 pixel
= VB
->IndexPtr
->data
[pv
];
77 gc
= xmesa
->xm_buffer
->gc2
;
78 XMesaSetForeground( xmesa
->display
, gc
, pixel
);
80 p
[0].x
= (GLint
) (VB
->Win
.data
[v0
][0] + 0.5f
);
81 p
[0].y
= FLIP( xmesa
->xm_buffer
, (GLint
) (VB
->Win
.data
[v0
][1] - 0.5f
) );
82 p
[1].x
= (GLint
) (VB
->Win
.data
[v1
][0] + 0.5f
);
83 p
[1].y
= FLIP( xmesa
->xm_buffer
, (GLint
) (VB
->Win
.data
[v1
][1] - 0.5f
) );
84 p
[2].x
= (GLint
) (VB
->Win
.data
[v2
][0] + 0.5f
);
85 p
[2].y
= FLIP( xmesa
->xm_buffer
, (GLint
) (VB
->Win
.data
[v2
][1] - 0.5f
) );
86 XMesaFillPolygon( xmesa
->display
, xmesa
->xm_buffer
->buffer
, gc
,
87 p
, 3, Convex
, CoordModeOrigin
);
93 * XImage, smooth, depth-buffered, PF_TRUECOLOR triangle.
95 static void smooth_TRUECOLOR_z_triangle( GLcontext
*ctx
,
96 GLuint v0
, GLuint v1
, GLuint v2
,
99 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
100 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
103 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
105 #define INNER_LOOP( LEFT, RIGHT, Y ) \
107 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer, Y); \
108 GLint len = RIGHT-LEFT; \
110 for (i=0;i<len;i++,xx++) { \
111 GLdepth z = FixedToDepth(ffz); \
114 PACK_TRUECOLOR(p, FixedToInt(ffr), FixedToInt(ffg), FixedToInt(ffb));\
115 XMesaPutPixel( img, xx, yy, p ); \
118 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
128 * XImage, smooth, depth-buffered, PF_8A8B8G8R triangle.
130 static void smooth_8A8B8G8R_z_triangle( GLcontext
*ctx
,
131 GLuint v0
, GLuint v1
, GLuint v2
,
134 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
137 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
139 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
140 #define PIXEL_TYPE GLuint
141 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
142 #define INNER_LOOP( LEFT, RIGHT, Y ) \
144 GLint i, len = RIGHT-LEFT; \
146 for (i=0;i<len;i++) { \
147 GLdepth z = FixedToDepth(ffz); \
149 pRow[i] = PACK_8B8G8R( FixedToInt(ffr), FixedToInt(ffg), \
153 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
162 * XImage, smooth, depth-buffered, PF_8R8G8B triangle.
164 static void smooth_8R8G8B_z_triangle( GLcontext
*ctx
,
165 GLuint v0
, GLuint v1
, GLuint v2
,
168 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
171 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
173 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
174 #define PIXEL_TYPE GLuint
175 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
176 #define INNER_LOOP( LEFT, RIGHT, Y ) \
178 GLint i, len = RIGHT-LEFT; \
180 for (i=0;i<len;i++) { \
181 GLdepth z = FixedToDepth(ffz); \
183 pRow[i] = PACK_8R8G8B( FixedToInt(ffr), FixedToInt(ffg), \
187 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
196 * XImage, smooth, depth-buffered, PF_8R8G8B24 triangle.
198 static void smooth_8R8G8B24_z_triangle( GLcontext
*ctx
,
199 GLuint v0
, GLuint v1
, GLuint v2
,
202 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
205 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
207 #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
208 #define PIXEL_TYPE bgr_t
209 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
210 #define INNER_LOOP( LEFT, RIGHT, Y ) \
212 GLint i, len = RIGHT-LEFT; \
214 for (i=0;i<len;i++) { \
215 GLdepth z = FixedToDepth(ffz); \
217 PIXEL_TYPE *ptr = pRow + i; \
218 ptr->r = FixedToInt(ffr); \
219 ptr->g = FixedToInt(ffg); \
220 ptr->b = FixedToInt(ffb); \
223 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
232 * XImage, smooth, depth-buffered, PF_TRUEDITHER triangle.
234 static void smooth_TRUEDITHER_z_triangle( GLcontext
*ctx
,
235 GLuint v0
, GLuint v1
, GLuint v2
,
238 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
239 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
242 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
244 #define INNER_LOOP( LEFT, RIGHT, Y ) \
246 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
248 for (i=0;i<len;i++,xx++) { \
249 GLdepth z = FixedToDepth(ffz); \
252 PACK_TRUEDITHER( p, xx, yy, FixedToInt(ffr), \
253 FixedToInt(ffg), FixedToInt(ffb) ); \
254 XMesaPutPixel( img, xx, yy, p ); \
257 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
266 * XImage, smooth, depth-buffered, PF_5R6G5B triangle.
268 static void smooth_5R6G5B_z_triangle( GLcontext
*ctx
,
269 GLuint v0
, GLuint v1
, GLuint v2
,
272 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
275 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
277 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
278 #define PIXEL_TYPE GLushort
279 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
280 #define INNER_LOOP( LEFT, RIGHT, Y ) \
282 GLint i, len = RIGHT-LEFT; \
284 for (i=0;i<len;i++) { \
285 DEPTH_TYPE z = FixedToDepth(ffz); \
287 pRow[i] = PACK_5R6G5B( FixedToInt(ffr), FixedToInt(ffg), \
291 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
300 * XImage, smooth, depth-buffered, PF_DITHER_5R6G5B triangle.
302 static void smooth_DITHER_5R6G5B_z_triangle( GLcontext
*ctx
,
303 GLuint v0
, GLuint v1
, GLuint v2
,
306 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
309 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
311 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
312 #define PIXEL_TYPE GLushort
313 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
314 #define INNER_LOOP( LEFT, RIGHT, Y ) \
316 GLint i, len = RIGHT-LEFT; \
318 for (i=0;i<len;i++) { \
319 GLdepth z = FixedToDepth(ffz); \
321 PACK_TRUEDITHER(pRow[i], LEFT+i, Y, FixedToInt(ffr), \
322 FixedToInt(ffg), FixedToInt(ffb) ); \
325 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
334 * XImage, smooth, depth-buffered, 8-bit, PF_DITHER8 triangle.
336 static void smooth_DITHER8_z_triangle( GLcontext
*ctx
,
337 GLuint v0
, GLuint v1
, GLuint v2
,
340 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
343 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
345 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
346 #define PIXEL_TYPE GLubyte
347 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
348 #define INNER_LOOP( LEFT, RIGHT, Y ) \
350 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
353 for (i=0;i<len;i++,xx++) { \
354 GLdepth z = FixedToDepth(ffz); \
356 pRow[i] = (PIXEL_TYPE) XDITHER( xx, FixedToInt(ffr), \
357 FixedToInt(ffg), FixedToInt(ffb) ); \
360 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
369 * XImage, smooth, depth-buffered, PF_DITHER triangle.
371 static void smooth_DITHER_z_triangle( GLcontext
*ctx
,
372 GLuint v0
, GLuint v1
, GLuint v2
,
375 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
376 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
379 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
381 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
382 #define PIXEL_TYPE GLubyte
383 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
384 #define INNER_LOOP( LEFT, RIGHT, Y ) \
386 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
389 for (i=0;i<len;i++,xx++) { \
390 GLdepth z = FixedToDepth(ffz); \
392 unsigned long p = XDITHER( xx, FixedToInt(ffr), \
393 FixedToInt(ffg), FixedToInt(ffb) ); \
394 XMesaPutPixel( img, xx, yy, p ); \
397 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
406 * XImage, smooth, depth-buffered, 8-bit PF_LOOKUP triangle.
408 static void smooth_LOOKUP8_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
409 GLuint v2
, GLuint pv
)
411 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
414 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
416 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
417 #define PIXEL_TYPE GLubyte
418 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
419 #define INNER_LOOP( LEFT, RIGHT, Y ) \
421 GLint i, len = RIGHT-LEFT; \
424 for (i=0;i<len;i++) { \
425 GLdepth z = FixedToDepth(ffz); \
427 pRow[i] = LOOKUP( FixedToInt(ffr), FixedToInt(ffg), \
431 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
441 * XImage, smooth, depth-buffered, 8-bit PF_HPCR triangle.
443 static void smooth_HPCR_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
444 GLuint v2
, GLuint pv
)
446 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
449 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
451 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
452 #define PIXEL_TYPE GLubyte
453 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
454 #define INNER_LOOP( LEFT, RIGHT, Y ) \
456 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
458 for (i=0;i<len;i++,xx++) { \
459 GLdepth z = FixedToDepth(ffz); \
461 pRow[i] = DITHER_HPCR( xx, yy, FixedToInt(ffr), \
462 FixedToInt(ffg), FixedToInt(ffb) ); \
465 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
474 * XImage, flat, depth-buffered, PF_TRUECOLOR triangle.
476 static void flat_TRUECOLOR_z_triangle( GLcontext
*ctx
,
477 GLuint v0
, GLuint v1
, GLuint v2
,
480 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
481 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
483 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
485 unsigned long pixel; \
486 PACK_TRUECOLOR(pixel, VB->ColorPtr->data[pv][0], VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2]);
488 #define INNER_LOOP( LEFT, RIGHT, Y ) \
490 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
492 for (i=0;i<len;i++,xx++) { \
493 GLdepth z = FixedToDepth(ffz); \
495 XMesaPutPixel( img, xx, yy, pixel ); \
506 * XImage, flat, depth-buffered, PF_8A8B8G8R triangle.
508 static void flat_8A8B8G8R_z_triangle( GLcontext
*ctx
, GLuint v0
,
509 GLuint v1
, GLuint v2
, GLuint pv
)
511 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
513 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
514 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
515 #define PIXEL_TYPE GLuint
516 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
518 unsigned long p = PACK_8B8G8R( VB->ColorPtr->data[pv][0], \
519 VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
520 #define INNER_LOOP( LEFT, RIGHT, Y ) \
522 GLint i, len = RIGHT-LEFT; \
524 for (i=0;i<len;i++) { \
525 GLdepth z = FixedToDepth(ffz); \
527 pRow[i] = (PIXEL_TYPE) p; \
538 * XImage, flat, depth-buffered, PF_8R8G8B triangle.
540 static void flat_8R8G8B_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
541 GLuint v2
, GLuint pv
)
543 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
545 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
546 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
547 #define PIXEL_TYPE GLuint
548 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
550 unsigned long p = PACK_8R8G8B( VB->ColorPtr->data[pv][0], \
551 VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
552 #define INNER_LOOP( LEFT, RIGHT, Y ) \
554 GLint i, len = RIGHT-LEFT; \
556 for (i=0;i<len;i++) { \
557 GLdepth z = FixedToDepth(ffz); \
559 pRow[i] = (PIXEL_TYPE) p; \
570 * XImage, flat, depth-buffered, PF_8R8G8B24 triangle.
572 static void flat_8R8G8B24_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
573 GLuint v2
, GLuint pv
)
575 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
576 const GLubyte
*color
= ctx
->VB
->ColorPtr
->data
[pv
];
578 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
579 #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
580 #define PIXEL_TYPE bgr_t
581 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
582 #define INNER_LOOP( LEFT, RIGHT, Y ) \
584 GLint i, len = RIGHT-LEFT; \
586 for (i=0;i<len;i++) { \
587 GLdepth z = FixedToDepth(ffz); \
589 PIXEL_TYPE *ptr = pRow+i; \
590 ptr->r = color[RCOMP]; \
591 ptr->g = color[GCOMP]; \
592 ptr->b = color[BCOMP]; \
603 * XImage, flat, depth-buffered, PF_TRUEDITHER triangle.
605 static void flat_TRUEDITHER_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
606 GLuint v2
, GLuint pv
)
608 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
609 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
611 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
612 #define INNER_LOOP( LEFT, RIGHT, Y ) \
614 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
616 for (i=0;i<len;i++,xx++) { \
617 GLdepth z = FixedToDepth(ffz); \
620 PACK_TRUEDITHER( p, xx, yy, VB->ColorPtr->data[pv][0], \
621 VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] ); \
622 XMesaPutPixel( img, xx, yy, p ); \
633 * XImage, flat, depth-buffered, PF_5R6G5B triangle.
635 static void flat_5R6G5B_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
636 GLuint v2
, GLuint pv
)
638 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
640 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
641 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
642 #define PIXEL_TYPE GLushort
643 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
645 unsigned long p = PACK_5R6G5B( VB->ColorPtr->data[pv][0], \
646 VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
647 #define INNER_LOOP( LEFT, RIGHT, Y ) \
649 GLint i, len = RIGHT-LEFT; \
651 for (i=0;i<len;i++) { \
652 DEPTH_TYPE z = FixedToDepth(ffz); \
654 pRow[i] = (PIXEL_TYPE) p; \
665 * XImage, flat, depth-buffered, PF_DITHER_5R6G5B triangle.
667 static void flat_DITHER_5R6G5B_z_triangle( GLcontext
*ctx
, GLuint v0
,
668 GLuint v1
, GLuint v2
, GLuint pv
)
670 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
671 const GLubyte
*color
= ctx
->VB
->ColorPtr
->data
[pv
];
673 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
674 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
675 #define PIXEL_TYPE GLushort
676 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
677 #define INNER_LOOP( LEFT, RIGHT, Y ) \
679 GLint i, len = RIGHT-LEFT; \
681 for (i=0;i<len;i++) { \
682 DEPTH_TYPE z = FixedToDepth(ffz); \
684 PACK_TRUEDITHER(pRow[i], LEFT+i, Y, color[RCOMP], \
685 color[GCOMP], color[BCOMP]); \
696 * XImage, flat, depth-buffered, 8-bit PF_DITHER triangle.
698 static void flat_DITHER8_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
699 GLuint v2
, GLuint pv
)
701 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
703 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
704 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
705 #define PIXEL_TYPE GLubyte
706 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
708 FLAT_DITHER_SETUP( VB->ColorPtr->data[pv][0], VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
710 #define INNER_LOOP( LEFT, RIGHT, Y ) \
712 GLint i, xx = LEFT, len = RIGHT-LEFT; \
713 FLAT_DITHER_ROW_SETUP(FLIP(xmesa->xm_buffer, Y)); \
715 for (i=0;i<len;i++,xx++) { \
716 GLdepth z = FixedToDepth(ffz); \
718 pRow[i] = (PIXEL_TYPE) FLAT_DITHER(xx); \
729 * XImage, flat, depth-buffered, PF_DITHER triangle.
731 static void flat_DITHER_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
732 GLuint v2
, GLuint pv
)
734 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
735 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
737 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
739 FLAT_DITHER_SETUP( VB->ColorPtr->data[pv][0], VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
741 #define INNER_LOOP( LEFT, RIGHT, Y ) \
743 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
744 FLAT_DITHER_ROW_SETUP(yy); \
746 for (i=0;i<len;i++,xx++) { \
747 GLdepth z = FixedToDepth(ffz); \
749 unsigned long p = FLAT_DITHER(xx); \
750 XMesaPutPixel( img, xx, yy, p ); \
761 * XImage, flat, depth-buffered, 8-bit PF_HPCR triangle.
763 static void flat_HPCR_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
764 GLuint v2
, GLuint pv
)
766 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
768 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
769 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
770 #define PIXEL_TYPE GLubyte
771 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
773 GLubyte r = VB->ColorPtr->data[pv][0]; \
774 GLubyte g = VB->ColorPtr->data[pv][1]; \
775 GLubyte b = VB->ColorPtr->data[pv][2];
776 #define INNER_LOOP( LEFT, RIGHT, Y ) \
778 GLint i, xx = LEFT, yy = FLIP(xmesa->xm_buffer,Y), len = RIGHT-LEFT; \
780 for (i=0;i<len;i++,xx++) { \
781 GLdepth z = FixedToDepth(ffz); \
783 pRow[i] = (PIXEL_TYPE) DITHER_HPCR( xx, yy, r, g, b ); \
794 * XImage, flat, depth-buffered, 8-bit PF_LOOKUP triangle.
796 static void flat_LOOKUP8_z_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
797 GLuint v2
, GLuint pv
)
799 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
801 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
802 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
803 #define PIXEL_TYPE GLubyte
804 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
807 GLubyte r = VB->ColorPtr->data[pv][0]; \
808 GLubyte g = VB->ColorPtr->data[pv][1]; \
809 GLubyte b = VB->ColorPtr->data[pv][2]; \
810 GLubyte p = LOOKUP(r,g,b);
811 #define INNER_LOOP( LEFT, RIGHT, Y ) \
813 GLint i, len = RIGHT-LEFT; \
815 for (i=0;i<len;i++) { \
816 GLdepth z = FixedToDepth(ffz); \
830 * XImage, smooth, NON-depth-buffered, PF_TRUECOLOR triangle.
832 static void smooth_TRUECOLOR_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
833 GLuint v2
, GLuint pv
)
835 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
836 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
839 #define INNER_LOOP( LEFT, RIGHT, Y ) \
841 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
842 for (xx=LEFT;xx<RIGHT;xx++) { \
844 PACK_TRUECOLOR(p, FixedToInt(ffr), FixedToInt(ffg), FixedToInt(ffb));\
845 XMesaPutPixel( img, xx, yy, p ); \
846 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
854 * XImage, smooth, NON-depth-buffered, PF_8A8B8G8R triangle.
856 static void smooth_8A8B8G8R_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
857 GLuint v2
, GLuint pv
)
859 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
862 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
863 #define PIXEL_TYPE GLuint
864 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
865 #define INNER_LOOP( LEFT, RIGHT, Y ) \
868 PIXEL_TYPE *pixel = pRow; \
869 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
870 *pixel = PACK_8B8G8R( FixedToInt(ffr), FixedToInt(ffg), \
872 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
880 * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
882 static void smooth_8R8G8B_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
883 GLuint v2
, GLuint pv
)
885 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
888 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
889 #define PIXEL_TYPE GLuint
890 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
891 #define INNER_LOOP( LEFT, RIGHT, Y ) \
894 PIXEL_TYPE *pixel = pRow; \
895 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
896 *pixel = PACK_8R8G8B( FixedToInt(ffr), FixedToInt(ffg), \
898 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
906 * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
908 static void smooth_8R8G8B24_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
909 GLuint v2
, GLuint pv
)
911 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
914 #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
915 #define PIXEL_TYPE bgr_t
916 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
917 #define INNER_LOOP( LEFT, RIGHT, Y ) \
920 PIXEL_TYPE *pixel = pRow; \
921 for (xx=LEFT;xx<RIGHT;xx++) { \
922 pixel->r = FixedToInt(ffr); \
923 pixel->g = FixedToInt(ffg); \
924 pixel->b = FixedToInt(ffb); \
925 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
934 * XImage, smooth, NON-depth-buffered, PF_TRUEDITHER triangle.
936 static void smooth_TRUEDITHER_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
937 GLuint v2
, GLuint pv
)
939 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
940 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
943 #define INNER_LOOP( LEFT, RIGHT, Y ) \
945 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
946 for (xx=LEFT;xx<RIGHT;xx++) { \
948 PACK_TRUEDITHER( p, xx, yy, FixedToInt(ffr), FixedToInt(ffg), \
950 XMesaPutPixel( img, xx, yy, p ); \
951 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
959 * XImage, smooth, NON-depth-buffered, PF_5R6G5B triangle.
961 static void smooth_5R6G5B_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
962 GLuint v2
, GLuint pv
)
964 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
967 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
968 #define PIXEL_TYPE GLushort
969 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
970 #define INNER_LOOP( LEFT, RIGHT, Y ) \
973 PIXEL_TYPE *pixel = pRow; \
974 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
975 *pixel = (PIXEL_TYPE) PACK_5R6G5B( FixedToInt(ffr), \
976 FixedToInt(ffg), FixedToInt(ffb) ); \
977 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
985 * XImage, smooth, NON-depth-buffered, PF_DITHER_5R6G5B triangle.
987 static void smooth_DITHER_5R6G5B_triangle( GLcontext
*ctx
, GLuint v0
,
988 GLuint v1
, GLuint v2
, GLuint pv
)
990 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
993 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
994 #define PIXEL_TYPE GLushort
995 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
996 #define INNER_LOOP( LEFT, RIGHT, Y ) \
999 PIXEL_TYPE *pixel = pRow; \
1000 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1001 PACK_TRUEDITHER(*pixel, xx, Y, FixedToInt(ffr), \
1002 FixedToInt(ffg), FixedToInt(ffb) ); \
1003 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1006 #include "tritemp.h"
1011 * XImage, smooth, NON-depth-buffered, 8-bit PF_DITHER triangle.
1013 static void smooth_DITHER8_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1014 GLuint v2
, GLuint pv
)
1016 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1018 #define INTERP_RGB 1
1019 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1020 #define PIXEL_TYPE GLubyte
1021 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1022 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1024 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1025 PIXEL_TYPE *pixel = pRow; \
1026 XDITHER_SETUP(yy); \
1027 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1028 *pixel = (PIXEL_TYPE) XDITHER( xx, FixedToInt(ffr), \
1029 FixedToInt(ffg), FixedToInt(ffb) ); \
1030 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1033 #include "tritemp.h"
1038 * XImage, smooth, NON-depth-buffered, PF_DITHER triangle.
1040 static void smooth_DITHER_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1041 GLuint v2
, GLuint pv
)
1043 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1044 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
1046 #define INTERP_RGB 1
1047 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1049 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1050 XDITHER_SETUP(yy); \
1051 for (xx=LEFT;xx<RIGHT;xx++) { \
1052 unsigned long p = XDITHER( xx, FixedToInt(ffr), \
1053 FixedToInt(ffg), FixedToInt(ffb) ); \
1054 XMesaPutPixel( img, xx, yy, p ); \
1055 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1058 #include "tritemp.h"
1063 * XImage, smooth, NON-depth-buffered, 8-bit PF_LOOKUP triangle.
1065 static void smooth_LOOKUP8_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1066 GLuint v2
, GLuint pv
)
1068 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1070 #define INTERP_RGB 1
1071 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1072 #define PIXEL_TYPE GLubyte
1073 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1074 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1077 PIXEL_TYPE *pixel = pRow; \
1079 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1080 *pixel = LOOKUP( FixedToInt(ffr), FixedToInt(ffg), \
1081 FixedToInt(ffb) ); \
1082 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1085 #include "tritemp.h"
1091 * XImage, smooth, NON-depth-buffered, 8-bit PF_HPCR triangle.
1093 static void smooth_HPCR_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1094 GLuint v2
, GLuint pv
)
1096 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1098 #define INTERP_RGB 1
1099 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1100 #define PIXEL_TYPE GLubyte
1101 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1102 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1104 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1105 PIXEL_TYPE *pixel = pRow; \
1106 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1107 *pixel = DITHER_HPCR( xx, yy, FixedToInt(ffr), \
1108 FixedToInt(ffg), FixedToInt(ffb) ); \
1109 ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; \
1112 #include "tritemp.h"
1117 * XImage, flat, NON-depth-buffered, PF_TRUECOLOR triangle.
1119 static void flat_TRUECOLOR_triangle( GLcontext
*ctx
, GLuint v0
,
1120 GLuint v1
, GLuint v2
, GLuint pv
)
1122 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1123 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
1124 #define SETUP_CODE \
1125 unsigned long pixel; \
1126 PACK_TRUECOLOR(pixel, VB->ColorPtr->data[pv][0], VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2]);
1128 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1130 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1131 for (xx=LEFT;xx<RIGHT;xx++) { \
1132 XMesaPutPixel( img, xx, yy, pixel ); \
1135 #include "tritemp.h"
1140 * XImage, flat, NON-depth-buffered, PF_8A8B8G8R triangle.
1142 static void flat_8A8B8G8R_triangle( GLcontext
*ctx
, GLuint v0
,
1143 GLuint v1
, GLuint v2
, GLuint pv
)
1145 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1146 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
1147 #define PIXEL_TYPE GLuint
1148 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1149 #define SETUP_CODE \
1150 unsigned long p = PACK_8B8G8R( VB->ColorPtr->data[pv][0], \
1151 VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
1152 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1155 PIXEL_TYPE *pixel = pRow; \
1156 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1157 *pixel = (PIXEL_TYPE) p; \
1160 #include "tritemp.h"
1165 * XImage, flat, NON-depth-buffered, PF_8R8G8B triangle.
1167 static void flat_8R8G8B_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1168 GLuint v2
, GLuint pv
)
1170 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1171 #define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y)
1172 #define PIXEL_TYPE GLuint
1173 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1174 #define SETUP_CODE \
1175 unsigned long p = PACK_8R8G8B( VB->ColorPtr->data[pv][0], \
1176 VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
1177 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1180 PIXEL_TYPE *pixel = pRow; \
1181 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1182 *pixel = (PIXEL_TYPE) p; \
1185 #include "tritemp.h"
1190 * XImage, flat, NON-depth-buffered, PF_8R8G8B24 triangle.
1192 static void flat_8R8G8B24_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1193 GLuint v2
, GLuint pv
)
1195 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1196 const GLubyte
*color
= ctx
->VB
->ColorPtr
->data
[pv
];
1197 #define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y)
1198 #define PIXEL_TYPE bgr_t
1199 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1200 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1203 PIXEL_TYPE *pixel = pRow; \
1204 for (xx=LEFT;xx<RIGHT;xx++) { \
1205 pixel->r = color[RCOMP]; \
1206 pixel->g = color[GCOMP]; \
1207 pixel->b = color[BCOMP]; \
1211 #include "tritemp.h"
1215 * XImage, flat, NON-depth-buffered, PF_TRUEDITHER triangle.
1217 static void flat_TRUEDITHER_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1218 GLuint v2
, GLuint pv
)
1220 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1221 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
1222 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1224 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1225 for (xx=LEFT;xx<RIGHT;xx++) { \
1227 PACK_TRUEDITHER( p, xx, yy, VB->ColorPtr->data[pv][0], \
1228 VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] ); \
1229 XMesaPutPixel( img, xx, yy, p ); \
1232 #include "tritemp.h"
1238 * XImage, flat, NON-depth-buffered, PF_5R6G5B triangle.
1240 static void flat_5R6G5B_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1241 GLuint v2
, GLuint pv
)
1243 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1244 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
1245 #define PIXEL_TYPE GLushort
1246 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1247 #define SETUP_CODE \
1248 unsigned long p = PACK_5R6G5B( VB->ColorPtr->data[pv][0], \
1249 VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
1250 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1253 PIXEL_TYPE *pixel = pRow; \
1254 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1255 *pixel = (PIXEL_TYPE) p; \
1258 #include "tritemp.h"
1263 * XImage, flat, NON-depth-buffered, PF_DITHER_5R6G5B triangle.
1265 static void flat_DITHER_5R6G5B_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1266 GLuint v2
, GLuint pv
)
1268 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1269 const GLubyte
*color
= ctx
->VB
->ColorPtr
->data
[pv
];
1270 #define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y)
1271 #define PIXEL_TYPE GLushort
1272 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1273 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1276 PIXEL_TYPE *pixel = pRow; \
1277 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1278 PACK_TRUEDITHER(*pixel, xx, Y, color[RCOMP], \
1279 color[GCOMP], color[BCOMP]); \
1282 #include "tritemp.h"
1287 * XImage, flat, NON-depth-buffered, 8-bit PF_DITHER triangle.
1289 static void flat_DITHER8_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1290 GLuint v2
, GLuint pv
)
1292 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1293 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1294 #define PIXEL_TYPE GLubyte
1295 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1296 #define SETUP_CODE \
1297 FLAT_DITHER_SETUP( VB->ColorPtr->data[pv][0], VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
1299 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1302 PIXEL_TYPE *pixel = pRow; \
1303 FLAT_DITHER_ROW_SETUP(FLIP(xmesa->xm_buffer, Y)); \
1304 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1305 *pixel = (PIXEL_TYPE) FLAT_DITHER(xx); \
1308 #include "tritemp.h"
1313 * XImage, flat, NON-depth-buffered, PF_DITHER triangle.
1315 static void flat_DITHER_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1316 GLuint v2
, GLuint pv
)
1318 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1319 XMesaImage
*img
= xmesa
->xm_buffer
->backimage
;
1320 #define SETUP_CODE \
1321 FLAT_DITHER_SETUP( VB->ColorPtr->data[pv][0], VB->ColorPtr->data[pv][1], VB->ColorPtr->data[pv][2] );
1323 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1325 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1326 FLAT_DITHER_ROW_SETUP(yy); \
1327 for (xx=LEFT;xx<RIGHT;xx++) { \
1328 unsigned long p = FLAT_DITHER(xx); \
1329 XMesaPutPixel( img, xx, yy, p ); \
1332 #include "tritemp.h"
1337 * XImage, flat, NON-depth-buffered, 8-bit PF_HPCR triangle.
1339 static void flat_HPCR_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1340 GLuint v2
, GLuint pv
)
1342 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1343 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1344 #define PIXEL_TYPE GLubyte
1345 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1346 #define SETUP_CODE \
1347 GLubyte r = VB->ColorPtr->data[pv][0]; \
1348 GLubyte g = VB->ColorPtr->data[pv][1]; \
1349 GLubyte b = VB->ColorPtr->data[pv][2];
1350 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1352 GLint xx, yy = FLIP(xmesa->xm_buffer, Y); \
1353 PIXEL_TYPE *pixel = pRow; \
1354 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1355 *pixel = (PIXEL_TYPE) DITHER_HPCR( xx, yy, r, g, b ); \
1358 #include "tritemp.h"
1363 * XImage, flat, NON-depth-buffered, 8-bit PF_LOOKUP triangle.
1365 static void flat_LOOKUP8_triangle( GLcontext
*ctx
, GLuint v0
, GLuint v1
,
1366 GLuint v2
, GLuint pv
)
1368 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1369 #define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y)
1370 #define PIXEL_TYPE GLubyte
1371 #define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line)
1372 #define SETUP_CODE \
1374 GLubyte r = VB->ColorPtr->data[pv][0]; \
1375 GLubyte g = VB->ColorPtr->data[pv][1]; \
1376 GLubyte b = VB->ColorPtr->data[pv][2]; \
1377 GLubyte p = LOOKUP(r,g,b);
1378 #define INNER_LOOP( LEFT, RIGHT, Y ) \
1381 PIXEL_TYPE *pixel = pRow; \
1382 for (xx=LEFT;xx<RIGHT;xx++,pixel++) { \
1386 #include "tritemp.h"
1393 * This function is called if we're about to render triangles into an
1394 * X window/pixmap. It sets the polygon stipple pattern if enabled.
1396 static void setup_x_polygon_options( GLcontext
*ctx
)
1398 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1401 if (ctx
->Polygon
.StippleFlag
) {
1402 if (xmesa
->xm_buffer
->stipple_pixmap
== 0) {
1403 /* Allocate polygon stippling stuff once for this context. */
1404 XMesaBuffer b
= xmesa
->xm_buffer
;
1405 b
->stipple_pixmap
= XMesaCreatePixmap( xmesa
->display
,
1406 b
->buffer
, 32, 32, 1 );
1407 #ifdef XFree86Server
1408 b
->stipple_gc
= CreateScratchGC(xmesa
->display
, 1);
1410 b
->stipple_gc
= XCreateGC(xmesa
->display
, b
->stipple_pixmap
, 0, NULL
);
1412 XMesaSetFunction(xmesa
->display
, b
->stipple_gc
, GXcopy
);
1413 XMesaSetForeground(xmesa
->display
, b
->stipple_gc
, 1);
1414 XMesaSetBackground(xmesa
->display
, b
->stipple_gc
, 0);
1418 * NOTE: We don't handle the following here!
1419 * GL_UNPACK_SWAP_BYTES
1420 * GL_UNPACK_LSB_FIRST
1422 /* Copy Mesa stipple pattern to an XImage then to Pixmap */
1424 XMesaImage
*stipple_ximage
;
1427 int shift
= xmesa
->xm_buffer
->height
% 32;
1428 for (i
=0;i
<32;i
++) {
1429 stipple
[31-i
] = ctx
->PolygonStipple
[(i
+shift
) % 32];
1431 #ifdef XFree86Server
1432 stipple_ximage
= XMesaCreateImage(1, 32, 32, (char *)stipple
);
1434 stipple_ximage
= XCreateImage( xmesa
->display
,
1435 xmesa
->xm_visual
->visinfo
->visual
,
1439 stipple_ximage
->byte_order
= LSBFirst
;
1440 stipple_ximage
->bitmap_bit_order
= LSBFirst
;
1441 stipple_ximage
->bitmap_unit
= 32;
1443 XMesaPutImage( xmesa
->display
,
1444 (XMesaDrawable
)xmesa
->xm_buffer
->stipple_pixmap
,
1445 xmesa
->xm_buffer
->stipple_gc
,
1446 stipple_ximage
, 0, 0, 0, 0, 32, 32 );
1447 stipple_ximage
->data
= NULL
;
1448 XMesaDestroyImage( stipple_ximage
);
1451 XMesaSetStipple( xmesa
->display
, xmesa
->xm_buffer
->gc1
,
1452 xmesa
->xm_buffer
->stipple_pixmap
);
1453 XMesaSetStipple( xmesa
->display
, xmesa
->xm_buffer
->gc2
,
1454 xmesa
->xm_buffer
->stipple_pixmap
);
1455 fill_type
= FillStippled
;
1458 fill_type
= FillSolid
;
1461 XMesaSetFillStyle( xmesa
->display
, xmesa
->xm_buffer
->gc1
, fill_type
);
1462 XMesaSetFillStyle( xmesa
->display
, xmesa
->xm_buffer
->gc2
, fill_type
);
1469 _xmesa_print_triangle_func( triangle_func triFunc
)
1471 printf("XMesa tri func = ");
1472 if (triFunc
==smooth_TRUECOLOR_z_triangle
)
1473 printf("smooth_TRUECOLOR_z_triangle\n");
1474 else if (triFunc
==smooth_8A8B8G8R_z_triangle
)
1475 printf("smooth_8A8B8G8R_z_triangle\n");
1476 else if (triFunc
==smooth_8R8G8B_z_triangle
)
1477 printf("smooth_8R8G8B_z_triangle\n");
1478 else if (triFunc
==smooth_8R8G8B24_z_triangle
)
1479 printf("smooth_8R8G8B24_z_triangle\n");
1480 else if (triFunc
==smooth_TRUEDITHER_z_triangle
)
1481 printf("smooth_TRUEDITHER_z_triangle\n");
1482 else if (triFunc
==smooth_5R6G5B_z_triangle
)
1483 printf("smooth_5R6G5B_z_triangle\n");
1484 else if (triFunc
==smooth_DITHER_5R6G5B_z_triangle
)
1485 printf("smooth_DITHER_5R6G5B_z_triangle\n");
1486 else if (triFunc
==smooth_HPCR_z_triangle
)
1487 printf("smooth_HPCR_z_triangle\n");
1488 else if (triFunc
==smooth_DITHER8_z_triangle
)
1489 printf("smooth_DITHER8_z_triangle\n");
1490 else if (triFunc
==smooth_LOOKUP8_z_triangle
)
1491 printf("smooth_LOOKUP8_z_triangle\n");
1492 else if (triFunc
==flat_TRUECOLOR_z_triangle
)
1493 printf("flat_TRUECOLOR_z_triangle\n");
1494 else if (triFunc
==flat_8A8B8G8R_z_triangle
)
1495 printf("flat_8A8B8G8R_z_triangle\n");
1496 else if (triFunc
==flat_8R8G8B_z_triangle
)
1497 printf("flat_8R8G8B_z_triangle\n");
1498 else if (triFunc
==flat_8R8G8B24_z_triangle
)
1499 printf("flat_8R8G8B24_z_triangle\n");
1500 else if (triFunc
==flat_TRUEDITHER_z_triangle
)
1501 printf("flat_TRUEDITHER_z_triangle\n");
1502 else if (triFunc
==flat_5R6G5B_z_triangle
)
1503 printf("flat_5R6G5B_z_triangle\n");
1504 else if (triFunc
==flat_DITHER_5R6G5B_z_triangle
)
1505 printf("flat_DITHER_5R6G5B_z_triangle\n");
1506 else if (triFunc
==flat_HPCR_z_triangle
)
1507 printf("flat_HPCR_z_triangle\n");
1508 else if (triFunc
==flat_DITHER8_z_triangle
)
1509 printf("flat_DITHER8_z_triangle\n");
1510 else if (triFunc
==flat_LOOKUP8_z_triangle
)
1511 printf("flat_LOOKUP8_z_triangle\n");
1512 else if (triFunc
==smooth_TRUECOLOR_triangle
)
1513 printf("smooth_TRUECOLOR_triangle\n");
1514 else if (triFunc
==smooth_8A8B8G8R_triangle
)
1515 printf("smooth_8A8B8G8R_triangle\n");
1516 else if (triFunc
==smooth_8R8G8B_triangle
)
1517 printf("smooth_8R8G8B_triangle\n");
1518 else if (triFunc
==smooth_8R8G8B24_triangle
)
1519 printf("smooth_8R8G8B24_triangle\n");
1520 else if (triFunc
==smooth_TRUEDITHER_triangle
)
1521 printf("smooth_TRUEDITHER_triangle\n");
1522 else if (triFunc
==smooth_5R6G5B_triangle
)
1523 printf("smooth_5R6G5B_triangle\n");
1524 else if (triFunc
==smooth_DITHER_5R6G5B_triangle
)
1525 printf("smooth_DITHER_5R6G5B_triangle\n");
1526 else if (triFunc
==smooth_HPCR_triangle
)
1527 printf("smooth_HPCR_triangle\n");
1528 else if (triFunc
==smooth_DITHER8_triangle
)
1529 printf("smooth_DITHER8_triangle\n");
1530 else if (triFunc
==smooth_LOOKUP8_triangle
)
1531 printf("smooth_LOOKUP8_triangle\n");
1532 else if (triFunc
==flat_TRUECOLOR_triangle
)
1533 printf("flat_TRUECOLOR_triangle\n");
1534 else if (triFunc
==flat_TRUEDITHER_triangle
)
1535 printf("flat_TRUEDITHER_triangle\n");
1536 else if (triFunc
==flat_8A8B8G8R_triangle
)
1537 printf("flat_8A8B8G8R_triangle\n");
1538 else if (triFunc
==flat_8R8G8B_triangle
)
1539 printf("flat_8R8G8B_triangle\n");
1540 else if (triFunc
==flat_8R8G8B24_triangle
)
1541 printf("flat_8R8G8B24_triangle\n");
1542 else if (triFunc
==flat_5R6G5B_triangle
)
1543 printf("flat_5R6G5B_triangle\n");
1544 else if (triFunc
==flat_DITHER_5R6G5B_triangle
)
1545 printf("flat_DITHER_5R6G5B_triangle\n");
1546 else if (triFunc
==flat_HPCR_triangle
)
1547 printf("flat_HPCR_triangle\n");
1548 else if (triFunc
==flat_DITHER8_triangle
)
1549 printf("flat_DITHER8_triangle\n");
1550 else if (triFunc
==flat_LOOKUP8_triangle
)
1551 printf("flat_LOOKUP8_triangle\n");
1558 triangle_func
xmesa_get_triangle_func( GLcontext
*ctx
)
1560 XMesaContext xmesa
= (XMesaContext
) ctx
->DriverCtx
;
1561 int depth
= GET_VISUAL_DEPTH(xmesa
->xm_visual
);
1565 if (ctx
->Polygon
.SmoothFlag
) return (triangle_func
)NULL
;
1566 if (ctx
->Texture
.ReallyEnabled
) return (triangle_func
)NULL
;
1568 if (xmesa
->xm_buffer
->buffer
==XIMAGE
) {
1569 if ( ctx
->Light
.ShadeModel
==GL_SMOOTH
1570 && ctx
->RasterMask
==DEPTH_BIT
1571 && ctx
->Depth
.Func
==GL_LESS
1572 && ctx
->Depth
.Mask
==GL_TRUE
1573 && ctx
->Visual
.DepthBits
== DEFAULT_SOFTWARE_DEPTH_BITS
1574 && ctx
->Polygon
.StippleFlag
==GL_FALSE
) {
1575 switch (xmesa
->pixelformat
) {
1577 return smooth_TRUECOLOR_z_triangle
;
1579 return smooth_8A8B8G8R_z_triangle
;
1581 return smooth_8R8G8B_z_triangle
;
1583 return smooth_8R8G8B24_z_triangle
;
1585 return smooth_TRUEDITHER_z_triangle
;
1587 return smooth_5R6G5B_z_triangle
;
1588 case PF_DITHER_5R6G5B
:
1589 return smooth_DITHER_5R6G5B_z_triangle
;
1591 return smooth_HPCR_z_triangle
;
1593 return (depth
==8) ? smooth_DITHER8_z_triangle
1594 : smooth_DITHER_z_triangle
;
1596 return (depth
==8) ? smooth_LOOKUP8_z_triangle
: (triangle_func
)NULL
;
1598 return (triangle_func
)NULL
;
1601 if ( ctx
->Light
.ShadeModel
==GL_FLAT
1602 && ctx
->RasterMask
==DEPTH_BIT
1603 && ctx
->Depth
.Func
==GL_LESS
1604 && ctx
->Depth
.Mask
==GL_TRUE
1605 && ctx
->Visual
.DepthBits
== DEFAULT_SOFTWARE_DEPTH_BITS
1606 && ctx
->Polygon
.StippleFlag
==GL_FALSE
) {
1607 switch (xmesa
->pixelformat
) {
1609 return flat_TRUECOLOR_z_triangle
;
1611 return flat_8A8B8G8R_z_triangle
;
1613 return flat_8R8G8B_z_triangle
;
1615 return flat_8R8G8B24_z_triangle
;
1617 return flat_TRUEDITHER_z_triangle
;
1619 return flat_5R6G5B_z_triangle
;
1620 case PF_DITHER_5R6G5B
:
1621 return flat_DITHER_5R6G5B_z_triangle
;
1623 return flat_HPCR_z_triangle
;
1625 return (depth
==8) ? flat_DITHER8_z_triangle
1626 : flat_DITHER_z_triangle
;
1628 return (depth
==8) ? flat_LOOKUP8_z_triangle
: (triangle_func
)NULL
;
1630 return (triangle_func
)NULL
;
1633 if ( ctx
->RasterMask
==0 /* no depth test */
1634 && ctx
->Light
.ShadeModel
==GL_SMOOTH
1635 && ctx
->Polygon
.StippleFlag
==GL_FALSE
) {
1636 switch (xmesa
->pixelformat
) {
1638 return smooth_TRUECOLOR_triangle
;
1640 return smooth_8A8B8G8R_triangle
;
1642 return smooth_8R8G8B_triangle
;
1644 return smooth_8R8G8B24_triangle
;
1646 return smooth_TRUEDITHER_triangle
;
1648 return smooth_5R6G5B_triangle
;
1649 case PF_DITHER_5R6G5B
:
1650 return smooth_DITHER_5R6G5B_triangle
;
1652 return smooth_HPCR_triangle
;
1654 return (depth
==8) ? smooth_DITHER8_triangle
1655 : smooth_DITHER_triangle
;
1657 return (depth
==8) ? smooth_LOOKUP8_triangle
: (triangle_func
)NULL
;
1659 return (triangle_func
)NULL
;
1663 if ( ctx
->RasterMask
==0 /* no depth test */
1664 && ctx
->Light
.ShadeModel
==GL_FLAT
1665 && ctx
->Polygon
.StippleFlag
==GL_FALSE
) {
1666 switch (xmesa
->pixelformat
) {
1668 return flat_TRUECOLOR_triangle
;
1670 return flat_TRUEDITHER_triangle
;
1672 return flat_8A8B8G8R_triangle
;
1674 return flat_8R8G8B_triangle
;
1676 return flat_8R8G8B24_triangle
;
1678 return flat_5R6G5B_triangle
;
1679 case PF_DITHER_5R6G5B
:
1680 return flat_DITHER_5R6G5B_triangle
;
1682 return flat_HPCR_triangle
;
1684 return (depth
==8) ? flat_DITHER8_triangle
1685 : flat_DITHER_triangle
;
1687 return (depth
==8) ? flat_LOOKUP8_triangle
: (triangle_func
)NULL
;
1689 return (triangle_func
)NULL
;
1693 return (triangle_func
)NULL
;
1696 /* draw to pixmap */
1698 /* XXX have to disable this because X's rasterization rules
1699 * don't match software Mesa's. This causes a buffer invariance
1700 * test failure in the conformance tests.
1701 * In the future, we might provide a config option to enable this.
1703 if (ctx
->Light
.ShadeModel
==GL_FLAT
&& ctx
->RasterMask
==0) {
1704 if (ctx
->Color
.DitherFlag
&& depth
< 24)
1705 return (triangle_func
)NULL
;
1706 setup_x_polygon_options( ctx
);
1707 return flat_pixmap_triangle
;
1710 return (triangle_func
)NULL
;