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