X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fx11%2Fxm_tri.c;h=289ce11be62b335a50b2241b56039b3c8843965a;hb=23d31efc167f09d47635352f697ffcb087d3ebbd;hp=01585b05b4d5bb82ee7e4ccf95ed4bb0693fe530;hpb=53f82c5aadbb15585754bfacf3237093eccdb2ce;p=mesa.git diff --git a/src/mesa/drivers/x11/xm_tri.c b/src/mesa/drivers/x11/xm_tri.c index 01585b05b4d..289ce11be62 100644 --- a/src/mesa/drivers/x11/xm_tri.c +++ b/src/mesa/drivers/x11/xm_tri.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.3 + * Version: 6.5 * - * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -44,12 +44,17 @@ #include "swrast/s_triangle.h" +#define GET_XRB(XRB) struct xmesa_renderbuffer *XRB = \ + xmesa_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0][0]->Wrapped) + /**********************************************************************/ /*** Triangle rendering ***/ /**********************************************************************/ +#if CHAN_BITS == 8 + /* * XImage, smooth, depth-buffered, PF_TRUECOLOR triangle. */ @@ -59,10 +64,10 @@ #define INTERP_RGB 1 #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; + GET_XRB(xrb); #define RENDER_SPAN( span ) \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ GLuint i; \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ @@ -70,7 +75,7 @@ unsigned long p; \ PACK_TRUECOLOR(p, FixedToInt(span.red), \ FixedToInt(span.green), FixedToInt(span.blue)); \ - XMesaPutPixel(img, x, y, p); \ + XMesaPutPixel(xrb->ximage, x, y, p); \ zRow[i] = z; \ } \ span.red += span.redStep; \ @@ -91,12 +96,11 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) #define PIXEL_TYPE GLuint -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -116,6 +120,38 @@ +/* + * XImage, smooth, depth-buffered, PF_8A8R8G8B triangle. + */ +#define NAME smooth_8A8R8G8B_z_triangle +#define INTERP_Z 1 +#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE +#define INTERP_RGB 1 +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) +#define PIXEL_TYPE GLuint +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) +#define SETUP_CODE \ + GET_XRB(xrb); + +#define RENDER_SPAN( span ) \ + GLuint i; \ + for (i = 0; i < span.end; i++) { \ + const DEPTH_TYPE z = FixedToDepth(span.z); \ + if (z < zRow[i]) { \ + pRow[i] = PACK_8R8G8B(FixedToInt(span.red), \ + FixedToInt(span.green), FixedToInt(span.blue)); \ + zRow[i] = z; \ + } \ + span.red += span.redStep; \ + span.green += span.greenStep; \ + span.blue += span.blueStep; \ + span.z += span.zStep; \ + } + +#include "swrast/s_tritemp.h" + + + /* * XImage, smooth, depth-buffered, PF_8R8G8B triangle. */ @@ -123,11 +159,11 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) #define PIXEL_TYPE GLuint -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ @@ -155,11 +191,11 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y) #define PIXEL_TYPE bgr_t -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -189,17 +225,17 @@ #define INTERP_RGB 1 #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ unsigned long p; \ PACK_TRUEDITHER(p, x, y, FixedToInt(span.red), \ FixedToInt(span.green), FixedToInt(span.blue)); \ - XMesaPutPixel(img, x, y, p); \ + XMesaPutPixel(xrb->ximage, x, y, p); \ zRow[i] = z; \ } \ span.red += span.redStep; \ @@ -218,11 +254,11 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y) #define PIXEL_TYPE GLushort -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -248,14 +284,15 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y) #define PIXEL_TYPE GLushort -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ @@ -279,14 +316,14 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ XDITHER_SETUP(y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ @@ -312,11 +349,11 @@ #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ XDITHER_SETUP(y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ @@ -342,11 +379,11 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ LOOKUP_SETUP; \ @@ -373,14 +410,15 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ @@ -405,12 +443,13 @@ #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; \ + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; \ unsigned long pixel; \ PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ @@ -429,13 +468,38 @@ #define NAME flat_8A8B8G8R_z_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) #define PIXEL_TYPE GLuint -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - unsigned long p = PACK_8B8G8R( v2->color[0], \ - v2->color[1], v2->color[2] ); + GET_XRB(xrb); \ + GLuint p = PACK_8B8G8R( v2->color[0], v2->color[1], v2->color[2] ); +#define RENDER_SPAN( span ) \ + GLuint i; \ + for (i = 0; i < span.end; i++) { \ + const DEPTH_TYPE z = FixedToDepth(span.z); \ + if (z < zRow[i]) { \ + pRow[i] = (PIXEL_TYPE) p; \ + zRow[i] = z; \ + } \ + span.z += span.zStep; \ + } +#include "swrast/s_tritemp.h" + + + +/* + * XImage, flat, depth-buffered, PF_8A8R8G8B triangle. + */ +#define NAME flat_8A8R8G8B_z_triangle +#define INTERP_Z 1 +#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) +#define PIXEL_TYPE GLuint +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) +#define SETUP_CODE \ + GET_XRB(xrb); \ + GLuint p = PACK_8R8G8B( v2->color[0], v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -456,13 +520,12 @@ #define NAME flat_8R8G8B_z_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) #define PIXEL_TYPE GLuint -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - unsigned long p = PACK_8R8G8B( v2->color[0], \ - v2->color[1], v2->color[2] ); + GET_XRB(xrb); \ + GLuint p = PACK_8R8G8B( v2->color[0], v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -473,6 +536,7 @@ } \ span.z += span.zStep; \ } + #include "swrast/s_tritemp.h" @@ -483,11 +547,11 @@ #define NAME flat_8R8G8B24_z_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y) #define PIXEL_TYPE bgr_t -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ const GLubyte *color = v2->color; #define RENDER_SPAN( span ) \ GLuint i; \ @@ -514,10 +578,11 @@ #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ @@ -539,13 +604,12 @@ #define NAME flat_5R6G5B_z_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y) #define PIXEL_TYPE GLushort -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - unsigned long p = PACK_5R6G5B( v2->color[0], \ - v2->color[1], v2->color[2] ); + GET_XRB(xrb); \ + GLushort p = PACK_5R6G5B( v2->color[0], v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -566,15 +630,16 @@ #define NAME flat_DITHER_5R6G5B_z_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y) #define PIXEL_TYPE GLushort -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ const GLubyte *color = v2->color; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ @@ -594,16 +659,16 @@ #define NAME flat_DITHER8_z_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ - FLAT_DITHER_ROW_SETUP(FLIP(xmesa->xm_buffer, y)); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ + FLAT_DITHER_ROW_SETUP(YFLIP(xrb, y)); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ @@ -623,12 +688,12 @@ #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; \ + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; \ FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ FLAT_DITHER_ROW_SETUP(y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ @@ -649,17 +714,18 @@ #define NAME flat_HPCR_z_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ GLubyte r = v2->color[0]; \ GLubyte g = v2->color[1]; \ GLubyte b = v2->color[2]; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ const DEPTH_TYPE z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ @@ -678,11 +744,11 @@ #define NAME flat_LOOKUP8_z_triangle #define INTERP_Z 1 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ LOOKUP_SETUP; \ GLubyte r = v2->color[0]; \ GLubyte g = v2->color[1]; \ @@ -709,10 +775,11 @@ #define INTERP_RGB 1 #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ unsigned long p; \ PACK_TRUECOLOR(p, FixedToInt(span.red), \ @@ -731,11 +798,11 @@ */ #define NAME smooth_8A8B8G8R_triangle #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) #define PIXEL_TYPE GLuint -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -749,16 +816,39 @@ +/* + * XImage, smooth, NON-depth-buffered, PF_8A8R8G8B triangle. + */ +#define NAME smooth_8A8R8G8B_triangle +#define INTERP_RGB 1 +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) +#define PIXEL_TYPE GLuint +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) +#define SETUP_CODE \ + GET_XRB(xrb); +#define RENDER_SPAN( span ) \ + GLuint i; \ + for (i = 0; i < span.end; i++) { \ + pRow[i] = PACK_8R8G8B(FixedToInt(span.red), \ + FixedToInt(span.green), FixedToInt(span.blue) ); \ + span.red += span.redStep; \ + span.green += span.greenStep; \ + span.blue += span.blueStep; \ + } +#include "swrast/s_tritemp.h" + + + /* * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle. */ #define NAME smooth_8R8G8B_triangle #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) #define PIXEL_TYPE GLuint -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -777,11 +867,11 @@ */ #define NAME smooth_8R8G8B24_triangle #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y) #define PIXEL_TYPE bgr_t -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ PIXEL_TYPE *pixel = pRow; \ @@ -804,10 +894,11 @@ #define INTERP_RGB 1 #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ unsigned long p; \ PACK_TRUEDITHER(p, x, y, FixedToInt(span.red), \ @@ -826,11 +917,11 @@ */ #define NAME smooth_5R6G5B_triangle #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y) #define PIXEL_TYPE GLushort -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ for (i = 0; i < span.end; i++) { \ @@ -849,14 +940,15 @@ */ #define NAME smooth_DITHER_5R6G5B_triangle #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y) #define PIXEL_TYPE GLushort -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span.red), \ FixedToInt(span.green), FixedToInt(span.blue)); \ @@ -873,14 +965,14 @@ */ #define NAME smooth_DITHER8_triangle #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ XDITHER_SETUP(y); \ for (i = 0; i < span.end; i++, x++) { \ pRow[i] = (PIXEL_TYPE) XDITHER(x, FixedToInt(span.red), \ @@ -899,11 +991,11 @@ #define NAME smooth_DITHER_triangle #define INTERP_RGB 1 #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ XDITHER_SETUP(y); \ for (i = 0; i < span.end; i++, x++) { \ unsigned long p = XDITHER(x, FixedToInt(span.red), \ @@ -922,11 +1014,11 @@ */ #define NAME smooth_LOOKUP8_triangle #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ LOOKUP_SETUP; \ @@ -946,14 +1038,15 @@ */ #define NAME smooth_HPCR_triangle #define INTERP_RGB 1 -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); + XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ pRow[i] = DITHER_HPCR(x, y, FixedToInt(span.red), \ FixedToInt(span.green), FixedToInt(span.blue)); \ @@ -971,12 +1064,13 @@ #define NAME flat_TRUECOLOR_triangle #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; \ + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; \ unsigned long pixel; \ PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ XMesaPutPixel(img, x, y, pixel); \ } @@ -988,11 +1082,11 @@ * XImage, flat, NON-depth-buffered, PF_8A8B8G8R triangle. */ #define NAME flat_8A8B8G8R_triangle -#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) #define PIXEL_TYPE GLuint -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ unsigned long p = PACK_8B8G8R( v2->color[0], \ v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ @@ -1004,15 +1098,35 @@ +/* + * XImage, flat, NON-depth-buffered, PF_8A8R8G8B triangle. + */ +#define NAME flat_8A8R8G8B_triangle +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) +#define PIXEL_TYPE GLuint +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) +#define SETUP_CODE \ + GET_XRB(xrb); \ + unsigned long p = PACK_8R8G8B( v2->color[0], \ + v2->color[1], v2->color[2] ); +#define RENDER_SPAN( span ) \ + GLuint i; \ + for (i = 0; i < span.end; i++) { \ + pRow[i] = (PIXEL_TYPE) p; \ + } +#include "swrast/s_tritemp.h" + + + /* * XImage, flat, NON-depth-buffered, PF_8R8G8B triangle. */ #define NAME flat_8R8G8B_triangle -#define PIXEL_ADDRESS(X,Y) PIXELADDR4(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y) #define PIXEL_TYPE GLuint -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ unsigned long p = PACK_8R8G8B( v2->color[0], \ v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ @@ -1028,11 +1142,11 @@ * XImage, flat, NON-depth-buffered, PF_8R8G8B24 triangle. */ #define NAME flat_8R8G8B24_triangle -#define PIXEL_ADDRESS(X,Y) PIXELADDR3(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y) #define PIXEL_TYPE bgr_t -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ const GLubyte *color = v2->color; #define RENDER_SPAN( span ) \ GLuint i; \ @@ -1052,10 +1166,11 @@ #define NAME flat_TRUEDITHER_triangle #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ unsigned long p; \ PACK_TRUEDITHER(p, x, y, v2->color[0], \ @@ -1070,11 +1185,11 @@ * XImage, flat, NON-depth-buffered, PF_5R6G5B triangle. */ #define NAME flat_5R6G5B_triangle -#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y) #define PIXEL_TYPE GLushort -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ unsigned long p = PACK_5R6G5B( v2->color[0], \ v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ @@ -1090,15 +1205,16 @@ * XImage, flat, NON-depth-buffered, PF_DITHER_5R6G5B triangle. */ #define NAME flat_DITHER_5R6G5B_triangle -#define PIXEL_ADDRESS(X,Y) PIXELADDR2(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y) #define PIXEL_TYPE GLushort -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ const GLubyte *color = v2->color; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ PACK_TRUEDITHER(pRow[i], x, y, color[RCOMP], \ color[GCOMP], color[BCOMP]); \ @@ -1111,16 +1227,16 @@ * XImage, flat, NON-depth-buffered, 8-bit PF_DITHER triangle. */ #define NAME flat_DITHER8_triangle -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ - FLAT_DITHER_ROW_SETUP(FLIP(xmesa->xm_buffer, y)); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ + FLAT_DITHER_ROW_SETUP(YFLIP(xrb, y)); \ for (i = 0; i < span.end; i++, x++) { \ pRow[i] = (PIXEL_TYPE) FLAT_DITHER(x); \ } @@ -1133,12 +1249,12 @@ */ #define NAME flat_DITHER_triangle #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ - XMesaImage *img = xmesa->xm_buffer->backimage; \ + GET_XRB(xrb); \ + XMesaImage *img = xrb->ximage; \ FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] ); #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ FLAT_DITHER_ROW_SETUP(y); \ for (i = 0; i < span.end; i++, x++) { \ unsigned long p = FLAT_DITHER(x); \ @@ -1152,17 +1268,18 @@ * XImage, flat, NON-depth-buffered, 8-bit PF_HPCR triangle. */ #define NAME flat_HPCR_triangle -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ GLubyte r = v2->color[0]; \ GLubyte g = v2->color[1]; \ GLubyte b = v2->color[2]; #define RENDER_SPAN( span ) \ GLuint i; \ - GLint x = span.x, y = FLIP(xmesa->xm_buffer, span.y); \ + GLint x = span.x, y = YFLIP(xrb, span.y); \ for (i = 0; i < span.end; i++, x++) { \ pRow[i] = (PIXEL_TYPE) DITHER_HPCR(x, y, r, g, b); \ } @@ -1174,11 +1291,11 @@ * XImage, flat, NON-depth-buffered, 8-bit PF_LOOKUP triangle. */ #define NAME flat_LOOKUP8_triangle -#define PIXEL_ADDRESS(X,Y) PIXELADDR1(xmesa->xm_buffer,X,Y) +#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y) #define PIXEL_TYPE GLubyte -#define BYTES_PER_ROW (xmesa->xm_buffer->backimage->bytes_per_line) +#define BYTES_PER_ROW (xrb->ximage->bytes_per_line) #define SETUP_CODE \ - XMesaContext xmesa = XMESA_CONTEXT(ctx); \ + GET_XRB(xrb); \ LOOKUP_SETUP; \ GLubyte r = v2->color[0]; \ GLubyte g = v2->color[1]; \ @@ -1192,8 +1309,10 @@ #include "swrast/s_tritemp.h" +#endif /* CHAN_BITS == 8 */ -#ifdef DEBUG + +#if defined(DEBUG) && CHAN_BITS == 8 extern void _xmesa_print_triangle_func( swrast_tri_func triFunc ); void _xmesa_print_triangle_func( swrast_tri_func triFunc ) { @@ -1202,6 +1321,8 @@ void _xmesa_print_triangle_func( swrast_tri_func triFunc ) _mesa_printf("smooth_TRUECOLOR_z_triangle\n"); else if (triFunc ==smooth_8A8B8G8R_z_triangle) _mesa_printf("smooth_8A8B8G8R_z_triangle\n"); + else if (triFunc ==smooth_8A8R8G8B_z_triangle) + _mesa_printf("smooth_8A8R8G8B_z_triangle\n"); else if (triFunc ==smooth_8R8G8B_z_triangle) _mesa_printf("smooth_8R8G8B_z_triangle\n"); else if (triFunc ==smooth_8R8G8B24_z_triangle) @@ -1222,6 +1343,8 @@ void _xmesa_print_triangle_func( swrast_tri_func triFunc ) _mesa_printf("flat_TRUECOLOR_z_triangle\n"); else if (triFunc ==flat_8A8B8G8R_z_triangle) _mesa_printf("flat_8A8B8G8R_z_triangle\n"); + else if (triFunc ==flat_8A8R8G8B_z_triangle) + _mesa_printf("flat_8A8R8G8B_z_triangle\n"); else if (triFunc ==flat_8R8G8B_z_triangle) _mesa_printf("flat_8R8G8B_z_triangle\n"); else if (triFunc ==flat_8R8G8B24_z_triangle) @@ -1242,6 +1365,8 @@ void _xmesa_print_triangle_func( swrast_tri_func triFunc ) _mesa_printf("smooth_TRUECOLOR_triangle\n"); else if (triFunc ==smooth_8A8B8G8R_triangle) _mesa_printf("smooth_8A8B8G8R_triangle\n"); + else if (triFunc ==smooth_8A8R8G8B_triangle) + _mesa_printf("smooth_8A8R8G8B_triangle\n"); else if (triFunc ==smooth_8R8G8B_triangle) _mesa_printf("smooth_8R8G8B_triangle\n"); else if (triFunc ==smooth_8R8G8B24_triangle) @@ -1264,6 +1389,8 @@ void _xmesa_print_triangle_func( swrast_tri_func triFunc ) _mesa_printf("flat_TRUEDITHER_triangle\n"); else if (triFunc ==flat_8A8B8G8R_triangle) _mesa_printf("flat_8A8B8G8R_triangle\n"); + else if (triFunc ==flat_8A8R8G8B_triangle) + _mesa_printf("flat_8A8R8G8B_triangle\n"); else if (triFunc ==flat_8R8G8B_triangle) _mesa_printf("flat_8R8G8B_triangle\n"); else if (triFunc ==flat_8R8G8B24_triangle) @@ -1302,27 +1429,42 @@ do { \ #endif -static swrast_tri_func get_triangle_func( GLcontext *ctx ) +/** + * Return pointer to line drawing function, or NULL if we should use a + * swrast fallback. + */ +static swrast_tri_func +get_triangle_func(GLcontext *ctx) { SWcontext *swrast = SWRAST_CONTEXT(ctx); XMesaContext xmesa = XMESA_CONTEXT(ctx); int depth = GET_VISUAL_DEPTH(xmesa->xm_visual); + struct xmesa_renderbuffer *xrb; #ifdef DEBUG triFuncName = NULL; #endif - if ((ctx->Color._DrawDestMask[0] & (DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT)) ==0) +#if CHAN_BITS == 8 + /* trivial fallback tests */ + if ((ctx->DrawBuffer->_ColorDrawBufferMask[0] + & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT)) == 0) + return (swrast_tri_func) NULL; + if (ctx->RenderMode != GL_RENDER) + return (swrast_tri_func) NULL; + if (ctx->Polygon.SmoothFlag) + return (swrast_tri_func) NULL; + if (ctx->Texture._EnabledUnits) + return (swrast_tri_func) NULL; + if (swrast->_RasterMask & MULTI_DRAW_BIT) return (swrast_tri_func) NULL; - if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; - if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; - if (ctx->Texture._EnabledUnits) return (swrast_tri_func) NULL; - if (swrast->_RasterMask & MULTI_DRAW_BIT) return (swrast_tri_func) NULL; if (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) - return (swrast_tri_func) NULL; + return (swrast_tri_func) NULL; - if (xmesa->xm_buffer->buffer==XIMAGE) { + xrb = xmesa_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0][0]->Wrapped); + + if (xrb->ximage) { if ( ctx->Light.ShadeModel==GL_SMOOTH && swrast->_RasterMask==DEPTH_BIT && ctx->Depth.Func==GL_LESS @@ -1334,6 +1476,8 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) USE(smooth_TRUECOLOR_z_triangle); case PF_8A8B8G8R: USE(smooth_8A8B8G8R_z_triangle); + case PF_8A8R8G8B: + USE(smooth_8A8R8G8B_z_triangle); case PF_8R8G8B: USE(smooth_8R8G8B_z_triangle); case PF_8R8G8B24: @@ -1351,7 +1495,6 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) USE(smooth_DITHER8_z_triangle); else USE(smooth_DITHER_z_triangle); - break; case PF_Lookup: if (depth == 8) USE(smooth_LOOKUP8_z_triangle); @@ -1372,6 +1515,8 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) USE(flat_TRUECOLOR_z_triangle); case PF_8A8B8G8R: USE(flat_8A8B8G8R_z_triangle); + case PF_8A8R8G8B: + USE(flat_8A8R8G8B_z_triangle); case PF_8R8G8B: USE(flat_8R8G8B_z_triangle); case PF_8R8G8B24: @@ -1389,7 +1534,6 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) USE(flat_DITHER8_z_triangle); else USE(flat_DITHER_z_triangle); - break; case PF_Lookup: if (depth == 8) USE(flat_LOOKUP8_z_triangle); @@ -1407,6 +1551,8 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) USE(smooth_TRUECOLOR_triangle); case PF_8A8B8G8R: USE(smooth_8A8B8G8R_triangle); + case PF_8A8R8G8B: + USE(smooth_8A8R8G8B_triangle); case PF_8R8G8B: USE(smooth_8R8G8B_triangle); case PF_8R8G8B24: @@ -1424,7 +1570,6 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) USE(smooth_DITHER8_triangle); else USE(smooth_DITHER_triangle); - break; case PF_Lookup: if (depth == 8) USE(smooth_LOOKUP8_triangle); @@ -1445,6 +1590,8 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) USE(flat_TRUEDITHER_triangle); case PF_8A8B8G8R: USE(flat_8A8B8G8R_triangle); + case PF_8A8R8G8B: + USE(flat_8A8R8G8B_triangle); case PF_8R8G8B: USE(flat_8R8G8B_triangle); case PF_8R8G8B24: @@ -1460,7 +1607,6 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) USE(flat_DITHER8_triangle); else USE(flat_DITHER_triangle); - break; case PF_Lookup: if (depth == 8) USE(flat_LOOKUP8_triangle); @@ -1470,13 +1616,10 @@ static swrast_tri_func get_triangle_func( GLcontext *ctx ) return (swrast_tri_func) NULL; } } - - return (swrast_tri_func) NULL; - } - else { - /* draw to pixmap */ - return (swrast_tri_func) NULL; } +#endif /* CHAN_BITS == 8 */ + + return (swrast_tri_func) NULL; }