Home | History | Annotate | Download | only in x11
      1 /*
      2  * Mesa 3-D graphics library
      3  * Version:  6.5
      4  *
      5  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 
     26 /*
     27  * This file contains "accelerated" triangle functions.  It should be
     28  * fairly easy to write new special-purpose triangle functions and hook
     29  * them into this module.
     30  */
     31 
     32 
     33 #include "main/imports.h"
     34 #include "main/mtypes.h"
     35 #include "glxheader.h"
     36 #include "xmesaP.h"
     37 
     38 /* Internal swrast includes:
     39  */
     40 #include "swrast/s_context.h"
     41 #include "swrast/s_depth.h"
     42 #include "swrast/s_triangle.h"
     43 
     44 
     45 #define GET_XRB(XRB)  struct xmesa_renderbuffer *XRB = \
     46    xmesa_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0])
     47 
     48 
     49 /**********************************************************************/
     50 /***                   Triangle rendering                           ***/
     51 /**********************************************************************/
     52 
     53 
     54 #if CHAN_BITS == 8
     55 
     56 /*
     57  * XImage, smooth, depth-buffered, PF_TRUECOLOR triangle.
     58  */
     59 #define NAME smooth_TRUECOLOR_z_triangle
     60 #define INTERP_Z 1
     61 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
     62 #define INTERP_RGB 1
     63 #define SETUP_CODE						\
     64    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
     65    GET_XRB(xrb);
     66 
     67 #define RENDER_SPAN( span ) {					\
     68    GLint x = span.x, y = YFLIP(xrb, span.y);			\
     69    GLuint i;							\
     70    for (i = 0; i < span.end; i++, x++) {			\
     71       const DEPTH_TYPE z = FixedToDepth(span.z);		\
     72       if (z < zRow[i]) {					\
     73          unsigned long p;					\
     74          PACK_TRUECOLOR(p, FixedToInt(span.red),		\
     75             FixedToInt(span.green), FixedToInt(span.blue));	\
     76          XMesaPutPixel(xrb->ximage, x, y, p);			\
     77          zRow[i] = z;						\
     78       }								\
     79       span.red += span.redStep;					\
     80       span.green += span.greenStep;				\
     81       span.blue += span.blueStep;				\
     82       span.z += span.zStep;					\
     83    } }
     84 
     85 #include "swrast/s_tritemp.h"
     86 
     87 
     88 
     89 
     90 /*
     91  * XImage, smooth, depth-buffered, PF_8A8B8G8R triangle.
     92  */
     93 #define NAME smooth_8A8B8G8R_z_triangle
     94 #define INTERP_Z 1
     95 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
     96 #define INTERP_RGB 1
     97 #define INTERP_ALPHA 1
     98 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
     99 #define PIXEL_TYPE GLuint
    100 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    101 #define SETUP_CODE						\
    102    GET_XRB(xrb);
    103 #define RENDER_SPAN( span ) {					\
    104    GLuint i;							\
    105    for (i = 0; i < span.end; i++) {				\
    106       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    107       if (z < zRow[i]) {					\
    108          pRow[i] = PACK_8A8B8G8R(FixedToInt(span.red),		\
    109             FixedToInt(span.green), FixedToInt(span.blue),	\
    110             FixedToInt(span.alpha));				\
    111          zRow[i] = z;						\
    112       }								\
    113       span.red += span.redStep;					\
    114       span.green += span.greenStep;				\
    115       span.blue += span.blueStep;				\
    116       span.alpha += span.alphaStep;				\
    117       span.z += span.zStep;					\
    118    } }
    119 
    120 #include "swrast/s_tritemp.h"
    121 
    122 
    123 
    124 /*
    125  * XImage, smooth, depth-buffered, PF_8A8R8G8B triangle.
    126  */
    127 #define NAME smooth_8A8R8G8B_z_triangle
    128 #define INTERP_Z 1
    129 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    130 #define INTERP_RGB 1
    131 #define INTERP_ALPHA 1
    132 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    133 #define PIXEL_TYPE GLuint
    134 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    135 #define SETUP_CODE						\
    136    GET_XRB(xrb);
    137 
    138 #define RENDER_SPAN( span ) {					\
    139    GLuint i;							\
    140    for (i = 0; i < span.end; i++) {				\
    141       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    142       if (z < zRow[i]) {					\
    143          pRow[i] = PACK_8A8R8G8B(FixedToInt(span.red),		\
    144             FixedToInt(span.green), FixedToInt(span.blue),	\
    145             FixedToInt(span.alpha));				\
    146          zRow[i] = z;						\
    147       }								\
    148       span.red += span.redStep;					\
    149       span.green += span.greenStep;				\
    150       span.blue += span.blueStep;				\
    151       span.alpha += span.alphaStep;				\
    152       span.z += span.zStep;					\
    153    } }
    154 
    155 #include "swrast/s_tritemp.h"
    156 
    157 
    158 
    159 /*
    160  * XImage, smooth, depth-buffered, PF_8R8G8B triangle.
    161  */
    162 #define NAME smooth_8R8G8B_z_triangle
    163 #define INTERP_Z 1
    164 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    165 #define INTERP_RGB 1
    166 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    167 #define PIXEL_TYPE GLuint
    168 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    169 #define SETUP_CODE						\
    170    GET_XRB(xrb);
    171 
    172 #define RENDER_SPAN( span ) {					\
    173    GLuint i;							\
    174    for (i = 0; i < span.end; i++) {				\
    175       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    176       if (z < zRow[i]) {					\
    177          pRow[i] = PACK_8R8G8B(FixedToInt(span.red),		\
    178             FixedToInt(span.green), FixedToInt(span.blue));	\
    179          zRow[i] = z;						\
    180       }								\
    181       span.red += span.redStep;					\
    182       span.green += span.greenStep;				\
    183       span.blue += span.blueStep;				\
    184       span.z += span.zStep;					\
    185    } }
    186 
    187 #include "swrast/s_tritemp.h"
    188 
    189 
    190 
    191 /*
    192  * XImage, smooth, depth-buffered, PF_8R8G8B24 triangle.
    193  */
    194 #define NAME smooth_8R8G8B24_z_triangle
    195 #define INTERP_Z 1
    196 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    197 #define INTERP_RGB 1
    198 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
    199 #define PIXEL_TYPE bgr_t
    200 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    201 #define SETUP_CODE						\
    202    GET_XRB(xrb);
    203 #define RENDER_SPAN( span ) {					\
    204    GLuint i;							\
    205    for (i = 0; i < span.end; i++) {				\
    206       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    207       if (z < zRow[i]) {					\
    208 	 PIXEL_TYPE *ptr = pRow + i;				\
    209          ptr->r = FixedToInt(span.red);				\
    210          ptr->g = FixedToInt(span.green);			\
    211          ptr->b = FixedToInt(span.blue);			\
    212          zRow[i] = z;						\
    213       }								\
    214       span.red += span.redStep;					\
    215       span.green += span.greenStep;				\
    216       span.blue += span.blueStep;				\
    217       span.z += span.zStep;					\
    218    } }
    219 #include "swrast/s_tritemp.h"
    220 
    221 
    222 
    223 /*
    224  * XImage, smooth, depth-buffered, PF_TRUEDITHER triangle.
    225  */
    226 #define NAME smooth_TRUEDITHER_z_triangle
    227 #define INTERP_Z 1
    228 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    229 #define INTERP_RGB 1
    230 #define SETUP_CODE						\
    231    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    232    GET_XRB(xrb);
    233 #define RENDER_SPAN( span ) {					\
    234    GLuint i;							\
    235    GLint x = span.x, y = YFLIP(xrb, span.y);			\
    236    for (i = 0; i < span.end; i++, x++) {			\
    237       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    238       if (z < zRow[i]) {					\
    239          unsigned long p;					\
    240          PACK_TRUEDITHER(p, x, y, FixedToInt(span.red),		\
    241             FixedToInt(span.green), FixedToInt(span.blue));	\
    242          XMesaPutPixel(xrb->ximage, x, y, p);			\
    243          zRow[i] = z;						\
    244       }								\
    245       span.red += span.redStep;					\
    246       span.green += span.greenStep;				\
    247       span.blue += span.blueStep;				\
    248       span.z += span.zStep;					\
    249    } }
    250 #include "swrast/s_tritemp.h"
    251 
    252 
    253 
    254 /*
    255  * XImage, smooth, depth-buffered, PF_5R6G5B triangle.
    256  */
    257 #define NAME smooth_5R6G5B_z_triangle
    258 #define INTERP_Z 1
    259 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    260 #define INTERP_RGB 1
    261 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
    262 #define PIXEL_TYPE GLushort
    263 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    264 #define SETUP_CODE						\
    265    GET_XRB(xrb);
    266 #define RENDER_SPAN( span ) {					\
    267    GLuint i;							\
    268    for (i = 0; i < span.end; i++) {				\
    269       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    270       if (z < zRow[i]) {					\
    271          pRow[i] = PACK_5R6G5B(FixedToInt(span.red),		\
    272             FixedToInt(span.green), FixedToInt(span.blue));	\
    273          zRow[i] = z;						\
    274       }								\
    275       span.red += span.redStep;					\
    276       span.green += span.greenStep;				\
    277       span.blue += span.blueStep;				\
    278       span.z += span.zStep;					\
    279    } }
    280 #include "swrast/s_tritemp.h"
    281 
    282 
    283 
    284 /*
    285  * XImage, smooth, depth-buffered, PF_DITHER_5R6G5B triangle.
    286  */
    287 #define NAME smooth_DITHER_5R6G5B_z_triangle
    288 #define INTERP_Z 1
    289 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    290 #define INTERP_RGB 1
    291 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
    292 #define PIXEL_TYPE GLushort
    293 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    294 #define SETUP_CODE						\
    295    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    296    GET_XRB(xrb);
    297 #define RENDER_SPAN( span ) {					\
    298    GLuint i;							\
    299    GLint x = span.x, y = YFLIP(xrb, span.y);			\
    300    for (i = 0; i < span.end; i++, x++) {			\
    301       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    302       if (z < zRow[i]) {					\
    303          PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span.red),	\
    304             FixedToInt(span.green), FixedToInt(span.blue));	\
    305          zRow[i] = z;						\
    306       }								\
    307       span.red += span.redStep;					\
    308       span.green += span.greenStep;				\
    309       span.blue += span.blueStep;				\
    310       span.z += span.zStep;					\
    311    } }
    312 #include "swrast/s_tritemp.h"
    313 
    314 
    315 
    316 /*
    317  * XImage, flat, depth-buffered, PF_TRUECOLOR triangle.
    318  */
    319 #define NAME flat_TRUECOLOR_z_triangle
    320 #define INTERP_Z 1
    321 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    322 #define SETUP_CODE						\
    323    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    324    GET_XRB(xrb);						\
    325    XMesaImage *img = xrb->ximage;				\
    326    unsigned long pixel;						\
    327    PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]);
    328 #define RENDER_SPAN( span ) {					\
    329    GLuint i;							\
    330    GLint x = span.x, y = YFLIP(xrb, span.y);			\
    331    for (i = 0; i < span.end; i++, x++) {			\
    332       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    333       if (z < zRow[i]) {					\
    334          XMesaPutPixel(img, x, y, pixel);			\
    335          zRow[i] = z;						\
    336       }								\
    337       span.z += span.zStep;					\
    338    } }
    339 #include "swrast/s_tritemp.h"
    340 
    341 
    342 
    343 /*
    344  * XImage, flat, depth-buffered, PF_8A8B8G8R triangle.
    345  */
    346 #define NAME flat_8A8B8G8R_z_triangle
    347 #define INTERP_Z 1
    348 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    349 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    350 #define PIXEL_TYPE GLuint
    351 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    352 #define SETUP_CODE					\
    353    GET_XRB(xrb);					\
    354    GLuint p = PACK_8A8B8G8R( v2->color[0], v2->color[1],\
    355                              v2->color[2], v2->color[3]);
    356 #define RENDER_SPAN( span ) {				\
    357    GLuint i;						\
    358    for (i = 0; i < span.end; i++) {			\
    359       const DEPTH_TYPE z = FixedToDepth(span.z);	\
    360       if (z < zRow[i]) {				\
    361 	 pRow[i] = (PIXEL_TYPE) p;			\
    362          zRow[i] = z;					\
    363       }							\
    364       span.z += span.zStep;				\
    365    } }
    366 #include "swrast/s_tritemp.h"
    367 
    368 
    369 
    370 /*
    371  * XImage, flat, depth-buffered, PF_8A8R8G8B triangle.
    372  */
    373 #define NAME flat_8A8R8G8B_z_triangle
    374 #define INTERP_Z 1
    375 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    376 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    377 #define PIXEL_TYPE GLuint
    378 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    379 #define SETUP_CODE					\
    380    GET_XRB(xrb);					\
    381    GLuint p = PACK_8A8R8G8B(v2->color[0], v2->color[1],	\
    382                             v2->color[2], v2->color[3]);
    383 #define RENDER_SPAN( span ) {				\
    384    GLuint i;						\
    385    for (i = 0; i < span.end; i++) {			\
    386       const DEPTH_TYPE z = FixedToDepth(span.z);	\
    387       if (z < zRow[i]) {				\
    388 	 pRow[i] = (PIXEL_TYPE) p;			\
    389          zRow[i] = z;					\
    390       }							\
    391       span.z += span.zStep;				\
    392    } }
    393 #include "swrast/s_tritemp.h"
    394 
    395 
    396 
    397 /*
    398  * XImage, flat, depth-buffered, PF_8R8G8B triangle.
    399  */
    400 #define NAME flat_8R8G8B_z_triangle
    401 #define INTERP_Z 1
    402 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    403 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    404 #define PIXEL_TYPE GLuint
    405 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    406 #define SETUP_CODE					\
    407    GET_XRB(xrb);					\
    408    GLuint p = PACK_8R8G8B( v2->color[0], v2->color[1], v2->color[2] );
    409 #define RENDER_SPAN( span ) {			\
    410    GLuint i;					\
    411    for (i = 0; i < span.end; i++) {		\
    412       DEPTH_TYPE z = FixedToDepth(span.z);	\
    413       if (z < zRow[i]) {			\
    414 	 pRow[i] = (PIXEL_TYPE) p;		\
    415          zRow[i] = z;				\
    416       }						\
    417       span.z += span.zStep;			\
    418    } }
    419 
    420 #include "swrast/s_tritemp.h"
    421 
    422 
    423 
    424 /*
    425  * XImage, flat, depth-buffered, PF_8R8G8B24 triangle.
    426  */
    427 #define NAME flat_8R8G8B24_z_triangle
    428 #define INTERP_Z 1
    429 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    430 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
    431 #define PIXEL_TYPE bgr_t
    432 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    433 #define SETUP_CODE					\
    434    GET_XRB(xrb);					\
    435    const GLubyte *color = v2->color;
    436 #define RENDER_SPAN( span ) {				\
    437    GLuint i;						\
    438    for (i = 0; i < span.end; i++) {			\
    439       const DEPTH_TYPE z = FixedToDepth(span.z);	\
    440       if (z < zRow[i]) {				\
    441 	 PIXEL_TYPE *ptr = pRow + i;			\
    442          ptr->r = color[RCOMP];				\
    443          ptr->g = color[GCOMP];				\
    444          ptr->b = color[BCOMP];				\
    445          zRow[i] = z;					\
    446       }							\
    447       span.z += span.zStep;				\
    448    } }
    449 #include "swrast/s_tritemp.h"
    450 
    451 
    452 
    453 /*
    454  * XImage, flat, depth-buffered, PF_TRUEDITHER triangle.
    455  */
    456 #define NAME flat_TRUEDITHER_z_triangle
    457 #define INTERP_Z 1
    458 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    459 #define SETUP_CODE						\
    460    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    461    GET_XRB(xrb);						\
    462    XMesaImage *img = xrb->ximage;
    463 #define RENDER_SPAN( span ) {					\
    464    GLuint i;							\
    465    GLint x = span.x, y = YFLIP(xrb, span.y);			\
    466    for (i = 0; i < span.end; i++, x++) {			\
    467       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    468       if (z < zRow[i]) {					\
    469          unsigned long p;					\
    470          PACK_TRUEDITHER(p, x, y, v2->color[0],			\
    471             v2->color[1], v2->color[2]);			\
    472          XMesaPutPixel(img, x, y, p);				\
    473          zRow[i] = z;						\
    474       }								\
    475       span.z += span.zStep;					\
    476    } }
    477 #include "swrast/s_tritemp.h"
    478 
    479 
    480 
    481 /*
    482  * XImage, flat, depth-buffered, PF_5R6G5B triangle.
    483  */
    484 #define NAME flat_5R6G5B_z_triangle
    485 #define INTERP_Z 1
    486 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    487 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
    488 #define PIXEL_TYPE GLushort
    489 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    490 #define SETUP_CODE					\
    491    GET_XRB(xrb);					\
    492    GLushort p = PACK_5R6G5B( v2->color[0], v2->color[1], v2->color[2] );
    493 #define RENDER_SPAN( span ) {				\
    494    GLuint i;						\
    495    for (i = 0; i < span.end; i++) {			\
    496       const DEPTH_TYPE z = FixedToDepth(span.z);	\
    497       if (z < zRow[i]) {				\
    498 	 pRow[i] = (PIXEL_TYPE) p;			\
    499          zRow[i] = z;					\
    500       }							\
    501       span.z += span.zStep;				\
    502    } }
    503 #include "swrast/s_tritemp.h"
    504 
    505 
    506 
    507 /*
    508  * XImage, flat, depth-buffered, PF_DITHER_5R6G5B triangle.
    509  */
    510 #define NAME flat_DITHER_5R6G5B_z_triangle
    511 #define INTERP_Z 1
    512 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
    513 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
    514 #define PIXEL_TYPE GLushort
    515 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    516 #define SETUP_CODE						\
    517    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    518    GET_XRB(xrb);						\
    519    const GLubyte *color = v2->color;
    520 #define RENDER_SPAN( span ) {					\
    521    GLuint i;							\
    522    GLint x = span.x, y = YFLIP(xrb, span.y);			\
    523    for (i = 0; i < span.end; i++, x++) {			\
    524       const DEPTH_TYPE z = FixedToDepth(span.z);		\
    525       if (z < zRow[i]) {					\
    526 	 PACK_TRUEDITHER(pRow[i], x, y, color[RCOMP],		\
    527 			 color[GCOMP], color[BCOMP]);		\
    528          zRow[i] = z;						\
    529       }								\
    530       span.z += span.zStep;					\
    531    } }
    532 #include "swrast/s_tritemp.h"
    533 
    534 
    535 /*
    536  * XImage, smooth, NON-depth-buffered, PF_TRUECOLOR triangle.
    537  */
    538 #define NAME smooth_TRUECOLOR_triangle
    539 #define INTERP_RGB 1
    540 #define SETUP_CODE						\
    541    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    542    GET_XRB(xrb);						\
    543    XMesaImage *img = xrb->ximage;
    544 #define RENDER_SPAN( span ) {					\
    545    GLuint i;							\
    546    GLint x = span.x, y = YFLIP(xrb, span.y);	\
    547    for (i = 0; i < span.end; i++, x++) {			\
    548       unsigned long p;						\
    549       PACK_TRUECOLOR(p, FixedToInt(span.red),			\
    550          FixedToInt(span.green), FixedToInt(span.blue));	\
    551       XMesaPutPixel(img, x, y, p);				\
    552       span.red += span.redStep;					\
    553       span.green += span.greenStep;				\
    554       span.blue += span.blueStep;				\
    555    } }
    556 #include "swrast/s_tritemp.h"
    557 
    558 
    559 
    560 /*
    561  * XImage, smooth, NON-depth-buffered, PF_8A8B8G8R triangle.
    562  */
    563 #define NAME smooth_8A8B8G8R_triangle
    564 #define INTERP_RGB 1
    565 #define INTERP_ALPHA 1
    566 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    567 #define PIXEL_TYPE GLuint
    568 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    569 #define SETUP_CODE						\
    570    GET_XRB(xrb);
    571 #define RENDER_SPAN( span ) {					\
    572    GLuint i;							\
    573    for (i = 0; i < span.end; i++) {				\
    574       pRow[i] = PACK_8A8B8G8R(FixedToInt(span.red),		\
    575          FixedToInt(span.green), FixedToInt(span.blue),		\
    576          FixedToInt(span.alpha));				\
    577       span.red += span.redStep;					\
    578       span.green += span.greenStep;				\
    579       span.blue += span.blueStep;				\
    580       span.alpha += span.alphaStep;				\
    581    } }
    582 #include "swrast/s_tritemp.h"
    583 
    584 
    585 
    586 /*
    587  * XImage, smooth, NON-depth-buffered, PF_8A8R8G8B triangle.
    588  */
    589 #define NAME smooth_8A8R8G8B_triangle
    590 #define INTERP_RGB 1
    591 #define INTERP_ALPHA 1
    592 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    593 #define PIXEL_TYPE GLuint
    594 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    595 #define SETUP_CODE						\
    596    GET_XRB(xrb);
    597 #define RENDER_SPAN( span ) {					\
    598    GLuint i;							\
    599    for (i = 0; i < span.end; i++) {				\
    600       pRow[i] = PACK_8A8R8G8B(FixedToInt(span.red),		\
    601          FixedToInt(span.green), FixedToInt(span.blue),		\
    602          FixedToInt(span.alpha));				\
    603       span.red += span.redStep;					\
    604       span.green += span.greenStep;				\
    605       span.blue += span.blueStep;				\
    606       span.alpha += span.alphaStep;				\
    607    } }
    608 #include "swrast/s_tritemp.h"
    609 
    610 
    611 
    612 /*
    613  * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
    614  */
    615 #define NAME smooth_8R8G8B_triangle
    616 #define INTERP_RGB 1
    617 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    618 #define PIXEL_TYPE GLuint
    619 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    620 #define SETUP_CODE						\
    621    GET_XRB(xrb);
    622 #define RENDER_SPAN( span ) {					\
    623    GLuint i;							\
    624    for (i = 0; i < span.end; i++) {				\
    625       pRow[i] = PACK_8R8G8B(FixedToInt(span.red),		\
    626          FixedToInt(span.green), FixedToInt(span.blue) );	\
    627       span.red += span.redStep;					\
    628       span.green += span.greenStep;				\
    629       span.blue += span.blueStep;				\
    630    } }
    631 #include "swrast/s_tritemp.h"
    632 
    633 
    634 
    635 /*
    636  * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
    637  */
    638 #define NAME smooth_8R8G8B24_triangle
    639 #define INTERP_RGB 1
    640 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
    641 #define PIXEL_TYPE bgr_t
    642 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    643 #define SETUP_CODE					\
    644    GET_XRB(xrb);
    645 #define RENDER_SPAN( span ) {				\
    646    GLuint i;						\
    647    PIXEL_TYPE *pixel = pRow;				\
    648    for (i = 0; i < span.end; i++, pixel++) {		\
    649       pixel->r = FixedToInt(span.red);			\
    650       pixel->g = FixedToInt(span.green);		\
    651       pixel->b = FixedToInt(span.blue);			\
    652       span.red += span.redStep;				\
    653       span.green += span.greenStep;			\
    654       span.blue += span.blueStep;			\
    655    } }
    656 #include "swrast/s_tritemp.h"
    657 
    658 
    659 
    660 /*
    661  * XImage, smooth, NON-depth-buffered, PF_TRUEDITHER triangle.
    662  */
    663 #define NAME smooth_TRUEDITHER_triangle
    664 #define INTERP_RGB 1
    665 #define SETUP_CODE						\
    666    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    667    GET_XRB(xrb);						\
    668    XMesaImage *img = xrb->ximage;
    669 #define RENDER_SPAN( span ) {					\
    670    GLuint i;							\
    671    GLint x = span.x, y = YFLIP(xrb, span.y);	\
    672    for (i = 0; i < span.end; i++, x++) {			\
    673       unsigned long p;						\
    674       PACK_TRUEDITHER(p, x, y, FixedToInt(span.red),		\
    675          FixedToInt(span.green), FixedToInt(span.blue));	\
    676       XMesaPutPixel(img, x, y, p );				\
    677       span.red += span.redStep;					\
    678       span.green += span.greenStep;				\
    679       span.blue += span.blueStep;				\
    680    } }
    681 #include "swrast/s_tritemp.h"
    682 
    683 
    684 
    685 /*
    686  * XImage, smooth, NON-depth-buffered, PF_5R6G5B triangle.
    687  */
    688 #define NAME smooth_5R6G5B_triangle
    689 #define INTERP_RGB 1
    690 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
    691 #define PIXEL_TYPE GLushort
    692 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    693 #define SETUP_CODE						\
    694    GET_XRB(xrb);
    695 #define RENDER_SPAN( span ) {					\
    696    GLuint i;							\
    697    for (i = 0; i < span.end; i++) {				\
    698       pRow[i] = (PIXEL_TYPE) PACK_5R6G5B(FixedToInt(span.red),	\
    699          FixedToInt(span.green), FixedToInt(span.blue));	\
    700       span.red += span.redStep;					\
    701       span.green += span.greenStep;				\
    702       span.blue += span.blueStep;				\
    703    } }
    704 #include "swrast/s_tritemp.h"
    705 
    706 
    707 
    708 /*
    709  * XImage, smooth, NON-depth-buffered, PF_DITHER_5R6G5B triangle.
    710  */
    711 #define NAME smooth_DITHER_5R6G5B_triangle
    712 #define INTERP_RGB 1
    713 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
    714 #define PIXEL_TYPE GLushort
    715 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    716 #define SETUP_CODE						\
    717    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    718    GET_XRB(xrb);
    719 #define RENDER_SPAN( span ) {					\
    720    GLuint i;							\
    721    GLint x = span.x, y = YFLIP(xrb, span.y);	\
    722    for (i = 0; i < span.end; i++, x++) {			\
    723       PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span.red),	\
    724          FixedToInt(span.green), FixedToInt(span.blue));	\
    725       span.red += span.redStep;					\
    726       span.green += span.greenStep;				\
    727       span.blue += span.blueStep;				\
    728    } }
    729 #include "swrast/s_tritemp.h"
    730 
    731 
    732 
    733 /*
    734  * XImage, flat, NON-depth-buffered, PF_TRUECOLOR triangle.
    735  */
    736 #define NAME flat_TRUECOLOR_triangle
    737 #define SETUP_CODE						\
    738    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    739    GET_XRB(xrb);						\
    740    XMesaImage *img = xrb->ximage;				\
    741    unsigned long pixel;						\
    742    PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]);
    743 #define RENDER_SPAN( span ) {					\
    744    GLuint i;							\
    745    GLint x = span.x, y = YFLIP(xrb, span.y);	\
    746    for (i = 0; i < span.end; i++, x++) {			\
    747       XMesaPutPixel(img, x, y, pixel);				\
    748    } }
    749 #include "swrast/s_tritemp.h"
    750 
    751 
    752 
    753 /*
    754  * XImage, flat, NON-depth-buffered, PF_8A8B8G8R triangle.
    755  */
    756 #define NAME flat_8A8B8G8R_triangle
    757 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    758 #define PIXEL_TYPE GLuint
    759 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    760 #define SETUP_CODE					\
    761    GET_XRB(xrb);					\
    762    unsigned long p = PACK_8B8G8R( v2->color[0],		\
    763 		 v2->color[1], v2->color[2] );
    764 #define RENDER_SPAN( span ) {				\
    765    GLuint i;						\
    766    for (i = 0; i < span.end; i++) {			\
    767       pRow[i] = (PIXEL_TYPE) p;				\
    768    } }
    769 #include "swrast/s_tritemp.h"
    770 
    771 
    772 
    773 /*
    774  * XImage, flat, NON-depth-buffered, PF_8A8R8G8B triangle.
    775  */
    776 #define NAME flat_8A8R8G8B_triangle
    777 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    778 #define PIXEL_TYPE GLuint
    779 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    780 #define SETUP_CODE					\
    781    GET_XRB(xrb);					\
    782    unsigned long p = PACK_8R8G8B( v2->color[0],		\
    783 		 v2->color[1], v2->color[2] );
    784 #define RENDER_SPAN( span ) {				\
    785    GLuint i;						\
    786    for (i = 0; i < span.end; i++) {			\
    787       pRow[i] = (PIXEL_TYPE) p;				\
    788    } }
    789 #include "swrast/s_tritemp.h"
    790 
    791 
    792 
    793 /*
    794  * XImage, flat, NON-depth-buffered, PF_8R8G8B triangle.
    795  */
    796 #define NAME flat_8R8G8B_triangle
    797 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
    798 #define PIXEL_TYPE GLuint
    799 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    800 #define SETUP_CODE					\
    801    GET_XRB(xrb);					\
    802    unsigned long p = PACK_8R8G8B( v2->color[0],		\
    803 		 v2->color[1], v2->color[2] );
    804 #define RENDER_SPAN( span ) {				\
    805    GLuint i;						\
    806    for (i = 0; i < span.end; i++) {			\
    807       pRow[i] = (PIXEL_TYPE) p;				\
    808    } }
    809 #include "swrast/s_tritemp.h"
    810 
    811 
    812 
    813 /*
    814  * XImage, flat, NON-depth-buffered, PF_8R8G8B24 triangle.
    815  */
    816 #define NAME flat_8R8G8B24_triangle
    817 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
    818 #define PIXEL_TYPE bgr_t
    819 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    820 #define SETUP_CODE					\
    821    GET_XRB(xrb);					\
    822    const GLubyte *color = v2->color;
    823 #define RENDER_SPAN( span ) {				\
    824    GLuint i;						\
    825    PIXEL_TYPE *pixel = pRow;				\
    826    for (i = 0; i < span.end; i++, pixel++) {		\
    827       pixel->r = color[RCOMP];				\
    828       pixel->g = color[GCOMP];				\
    829       pixel->b = color[BCOMP];				\
    830    } }
    831 #include "swrast/s_tritemp.h"
    832 
    833 
    834 
    835 /*
    836  * XImage, flat, NON-depth-buffered, PF_TRUEDITHER triangle.
    837  */
    838 #define NAME flat_TRUEDITHER_triangle
    839 #define SETUP_CODE						\
    840    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    841    GET_XRB(xrb);						\
    842    XMesaImage *img = xrb->ximage;
    843 #define RENDER_SPAN( span ) {					\
    844    GLuint i;							\
    845    GLint x = span.x, y = YFLIP(xrb, span.y);	\
    846    for (i = 0; i < span.end; i++, x++) {			\
    847       unsigned long p;						\
    848       PACK_TRUEDITHER(p, x, y, v2->color[0],			\
    849                v2->color[1], v2->color[2] );			\
    850       XMesaPutPixel(img, x, y, p);				\
    851    } }
    852 #include "swrast/s_tritemp.h"
    853 
    854 
    855 
    856 /*
    857  * XImage, flat, NON-depth-buffered, PF_5R6G5B triangle.
    858  */
    859 #define NAME flat_5R6G5B_triangle
    860 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
    861 #define PIXEL_TYPE GLushort
    862 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    863 #define SETUP_CODE					\
    864    GET_XRB(xrb);					\
    865    unsigned long p = PACK_5R6G5B( v2->color[0],		\
    866 		 v2->color[1], v2->color[2] );
    867 #define RENDER_SPAN( span ) {				\
    868    GLuint i;						\
    869    for (i = 0; i < span.end; i++) {			\
    870       pRow[i] = (PIXEL_TYPE) p;				\
    871    } }
    872 #include "swrast/s_tritemp.h"
    873 
    874 
    875 
    876 /*
    877  * XImage, flat, NON-depth-buffered, PF_DITHER_5R6G5B triangle.
    878  */
    879 #define NAME flat_DITHER_5R6G5B_triangle
    880 #define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
    881 #define PIXEL_TYPE GLushort
    882 #define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
    883 #define SETUP_CODE						\
    884    XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
    885    GET_XRB(xrb);						\
    886    const GLubyte *color = v2->color;
    887 #define RENDER_SPAN( span ) {					\
    888    GLuint i;							\
    889    GLint x = span.x, y = YFLIP(xrb, span.y);	\
    890    for (i = 0; i < span.end; i++, x++) {			\
    891       PACK_TRUEDITHER(pRow[i], x, y, color[RCOMP],		\
    892          color[GCOMP], color[BCOMP]);				\
    893    } }
    894 #include "swrast/s_tritemp.h"
    895 
    896 
    897 
    898 #endif /* CHAN_BITS == 8 */
    899 
    900 
    901 #if defined(DEBUG) && CHAN_BITS == 8
    902 extern void _xmesa_print_triangle_func( swrast_tri_func triFunc );
    903 void _xmesa_print_triangle_func( swrast_tri_func triFunc )
    904 {
    905    printf("XMesa tri func = ");
    906    if (triFunc ==smooth_TRUECOLOR_z_triangle)
    907       printf("smooth_TRUECOLOR_z_triangle\n");
    908    else if (triFunc ==smooth_8A8B8G8R_z_triangle)
    909       printf("smooth_8A8B8G8R_z_triangle\n");
    910    else if (triFunc ==smooth_8A8R8G8B_z_triangle)
    911       printf("smooth_8A8R8G8B_z_triangle\n");
    912    else if (triFunc ==smooth_8R8G8B_z_triangle)
    913       printf("smooth_8R8G8B_z_triangle\n");
    914    else if (triFunc ==smooth_8R8G8B24_z_triangle)
    915       printf("smooth_8R8G8B24_z_triangle\n");
    916    else if (triFunc ==smooth_TRUEDITHER_z_triangle)
    917       printf("smooth_TRUEDITHER_z_triangle\n");
    918    else if (triFunc ==smooth_5R6G5B_z_triangle)
    919       printf("smooth_5R6G5B_z_triangle\n");
    920    else if (triFunc ==smooth_DITHER_5R6G5B_z_triangle)
    921       printf("smooth_DITHER_5R6G5B_z_triangle\n");
    922    else if (triFunc ==flat_TRUECOLOR_z_triangle)
    923       printf("flat_TRUECOLOR_z_triangle\n");
    924    else if (triFunc ==flat_8A8B8G8R_z_triangle)
    925       printf("flat_8A8B8G8R_z_triangle\n");
    926    else if (triFunc ==flat_8A8R8G8B_z_triangle)
    927       printf("flat_8A8R8G8B_z_triangle\n");
    928    else if (triFunc ==flat_8R8G8B_z_triangle)
    929       printf("flat_8R8G8B_z_triangle\n");
    930    else if (triFunc ==flat_8R8G8B24_z_triangle)
    931       printf("flat_8R8G8B24_z_triangle\n");
    932    else if (triFunc ==flat_TRUEDITHER_z_triangle)
    933       printf("flat_TRUEDITHER_z_triangle\n");
    934    else if (triFunc ==flat_5R6G5B_z_triangle)
    935       printf("flat_5R6G5B_z_triangle\n");
    936    else if (triFunc ==flat_DITHER_5R6G5B_z_triangle)
    937       printf("flat_DITHER_5R6G5B_z_triangle\n");
    938    else if (triFunc ==smooth_TRUECOLOR_triangle)
    939       printf("smooth_TRUECOLOR_triangle\n");
    940    else if (triFunc ==smooth_8A8B8G8R_triangle)
    941       printf("smooth_8A8B8G8R_triangle\n");
    942    else if (triFunc ==smooth_8A8R8G8B_triangle)
    943       printf("smooth_8A8R8G8B_triangle\n");
    944    else if (triFunc ==smooth_8R8G8B_triangle)
    945       printf("smooth_8R8G8B_triangle\n");
    946    else if (triFunc ==smooth_8R8G8B24_triangle)
    947       printf("smooth_8R8G8B24_triangle\n");
    948    else if (triFunc ==smooth_TRUEDITHER_triangle)
    949       printf("smooth_TRUEDITHER_triangle\n");
    950    else if (triFunc ==smooth_5R6G5B_triangle)
    951       printf("smooth_5R6G5B_triangle\n");
    952    else if (triFunc ==smooth_DITHER_5R6G5B_triangle)
    953       printf("smooth_DITHER_5R6G5B_triangle\n");
    954    else if (triFunc ==flat_TRUECOLOR_triangle)
    955       printf("flat_TRUECOLOR_triangle\n");
    956    else if (triFunc ==flat_TRUEDITHER_triangle)
    957       printf("flat_TRUEDITHER_triangle\n");
    958    else if (triFunc ==flat_8A8B8G8R_triangle)
    959       printf("flat_8A8B8G8R_triangle\n");
    960    else if (triFunc ==flat_8A8R8G8B_triangle)
    961       printf("flat_8A8R8G8B_triangle\n");
    962    else if (triFunc ==flat_8R8G8B_triangle)
    963       printf("flat_8R8G8B_triangle\n");
    964    else if (triFunc ==flat_8R8G8B24_triangle)
    965       printf("flat_8R8G8B24_triangle\n");
    966    else if (triFunc ==flat_5R6G5B_triangle)
    967       printf("flat_5R6G5B_triangle\n");
    968    else if (triFunc ==flat_DITHER_5R6G5B_triangle)
    969       printf("flat_DITHER_5R6G5B_triangle\n");
    970    else
    971       printf("???\n");
    972 }
    973 #endif
    974 
    975 
    976 #ifdef DEBUG
    977 
    978 /* record the current triangle function name */
    979 static const char *triFuncName = NULL;
    980 
    981 #define USE(triFunc)                   \
    982 do {                                   \
    983     triFuncName = #triFunc;            \
    984     return triFunc;                    \
    985 } while (0)
    986 
    987 #else
    988 
    989 #define USE(triFunc)  return triFunc
    990 
    991 #endif
    992 
    993 
    994 /**
    995  * Return pointer to line drawing function, or NULL if we should use a
    996  * swrast fallback.
    997  */
    998 static swrast_tri_func
    999 get_triangle_func(struct gl_context *ctx)
   1000 {
   1001 #if CHAN_BITS == 8
   1002    SWcontext *swrast = SWRAST_CONTEXT(ctx);
   1003    XMesaContext xmesa = XMESA_CONTEXT(ctx);
   1004    const struct xmesa_renderbuffer *xrb;
   1005 
   1006 #ifdef DEBUG
   1007    triFuncName = NULL;
   1008 #endif
   1009 
   1010    /* trivial fallback tests */
   1011    if ((ctx->DrawBuffer->_ColorDrawBufferIndexes[0] != BUFFER_BIT_FRONT_LEFT) &&
   1012        (ctx->DrawBuffer->_ColorDrawBufferIndexes[0] != BUFFER_BIT_BACK_LEFT))
   1013       return (swrast_tri_func) NULL;
   1014    if (ctx->RenderMode != GL_RENDER)
   1015       return (swrast_tri_func) NULL;
   1016    if (ctx->Polygon.SmoothFlag)
   1017       return (swrast_tri_func) NULL;
   1018    if (ctx->Texture._EnabledUnits)
   1019       return (swrast_tri_func) NULL;
   1020    if (swrast->_RasterMask & MULTI_DRAW_BIT)
   1021       return (swrast_tri_func) NULL;
   1022    if (ctx->Polygon.CullFlag &&
   1023        ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
   1024       return (swrast_tri_func) NULL;
   1025 
   1026    xrb = xmesa_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0]);
   1027 
   1028    if (xrb->ximage) {
   1029       if (   ctx->Light.ShadeModel==GL_SMOOTH
   1030           && swrast->_RasterMask==DEPTH_BIT
   1031           && ctx->Depth.Func==GL_LESS
   1032           && ctx->Depth.Mask==GL_TRUE
   1033           && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
   1034           && ctx->Polygon.StippleFlag==GL_FALSE) {
   1035          switch (xmesa->pixelformat) {
   1036             case PF_Truecolor:
   1037 	       USE(smooth_TRUECOLOR_z_triangle);
   1038             case PF_8A8B8G8R:
   1039                USE(smooth_8A8B8G8R_z_triangle);
   1040             case PF_8A8R8G8B:
   1041                USE(smooth_8A8R8G8B_z_triangle);
   1042             case PF_8R8G8B:
   1043                USE(smooth_8R8G8B_z_triangle);
   1044             case PF_8R8G8B24:
   1045                USE(smooth_8R8G8B24_z_triangle);
   1046             case PF_Dither_True:
   1047                USE(smooth_TRUEDITHER_z_triangle);
   1048             case PF_5R6G5B:
   1049                USE(smooth_5R6G5B_z_triangle);
   1050             case PF_Dither_5R6G5B:
   1051                USE(smooth_DITHER_5R6G5B_z_triangle);
   1052             default:
   1053                return (swrast_tri_func) NULL;
   1054          }
   1055       }
   1056       if (   ctx->Light.ShadeModel==GL_FLAT
   1057           && swrast->_RasterMask==DEPTH_BIT
   1058           && ctx->Depth.Func==GL_LESS
   1059           && ctx->Depth.Mask==GL_TRUE
   1060           && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
   1061           && ctx->Polygon.StippleFlag==GL_FALSE) {
   1062          switch (xmesa->pixelformat) {
   1063             case PF_Truecolor:
   1064 	       USE(flat_TRUECOLOR_z_triangle);
   1065             case PF_8A8B8G8R:
   1066                USE(flat_8A8B8G8R_z_triangle);
   1067             case PF_8A8R8G8B:
   1068                USE(flat_8A8R8G8B_z_triangle);
   1069             case PF_8R8G8B:
   1070                USE(flat_8R8G8B_z_triangle);
   1071             case PF_8R8G8B24:
   1072                USE(flat_8R8G8B24_z_triangle);
   1073             case PF_Dither_True:
   1074                USE(flat_TRUEDITHER_z_triangle);
   1075             case PF_5R6G5B:
   1076                USE(flat_5R6G5B_z_triangle);
   1077             case PF_Dither_5R6G5B:
   1078                USE(flat_DITHER_5R6G5B_z_triangle);
   1079             default:
   1080                return (swrast_tri_func) NULL;
   1081          }
   1082       }
   1083       if (   swrast->_RasterMask==0   /* no depth test */
   1084           && ctx->Light.ShadeModel==GL_SMOOTH
   1085           && ctx->Polygon.StippleFlag==GL_FALSE) {
   1086          switch (xmesa->pixelformat) {
   1087             case PF_Truecolor:
   1088 	       USE(smooth_TRUECOLOR_triangle);
   1089             case PF_8A8B8G8R:
   1090                USE(smooth_8A8B8G8R_triangle);
   1091             case PF_8A8R8G8B:
   1092                USE(smooth_8A8R8G8B_triangle);
   1093             case PF_8R8G8B:
   1094                USE(smooth_8R8G8B_triangle);
   1095             case PF_8R8G8B24:
   1096                USE(smooth_8R8G8B24_triangle);
   1097             case PF_Dither_True:
   1098                USE(smooth_TRUEDITHER_triangle);
   1099             case PF_5R6G5B:
   1100                USE(smooth_5R6G5B_triangle);
   1101             case PF_Dither_5R6G5B:
   1102                USE(smooth_DITHER_5R6G5B_triangle);
   1103             default:
   1104                return (swrast_tri_func) NULL;
   1105          }
   1106       }
   1107 
   1108       if (   swrast->_RasterMask==0   /* no depth test */
   1109           && ctx->Light.ShadeModel==GL_FLAT
   1110           && ctx->Polygon.StippleFlag==GL_FALSE) {
   1111          switch (xmesa->pixelformat) {
   1112             case PF_Truecolor:
   1113 	       USE(flat_TRUECOLOR_triangle);
   1114             case PF_Dither_True:
   1115 	       USE(flat_TRUEDITHER_triangle);
   1116             case PF_8A8B8G8R:
   1117                USE(flat_8A8B8G8R_triangle);
   1118             case PF_8A8R8G8B:
   1119                USE(flat_8A8R8G8B_triangle);
   1120             case PF_8R8G8B:
   1121                USE(flat_8R8G8B_triangle);
   1122             case PF_8R8G8B24:
   1123                USE(flat_8R8G8B24_triangle);
   1124             case PF_5R6G5B:
   1125                USE(flat_5R6G5B_triangle);
   1126             case PF_Dither_5R6G5B:
   1127                USE(flat_DITHER_5R6G5B_triangle);
   1128             default:
   1129                return (swrast_tri_func) NULL;
   1130          }
   1131       }
   1132    }
   1133 #endif /* CHAN_BITS == 8 */
   1134 
   1135    return (swrast_tri_func) NULL;
   1136 }
   1137 
   1138 
   1139 /* Override for the swrast tri-selection function.  Try to use one
   1140  * of our internal tri functions, otherwise fall back to the
   1141  * standard swrast functions.
   1142  */
   1143 void xmesa_choose_triangle( struct gl_context *ctx )
   1144 {
   1145    SWcontext *swrast = SWRAST_CONTEXT(ctx);
   1146 
   1147    if (!(swrast->Triangle = get_triangle_func( ctx )))
   1148       _swrast_choose_triangle( ctx );
   1149 }
   1150 
   1151