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