diff options
| author | Michel Dänzer <daenzer@vmware.com> | 2009-11-23 19:33:59 +0100 | 
|---|---|---|
| committer | Michel Dänzer <michel@daenzer.net> | 2009-11-23 19:56:37 +0100 | 
| commit | 601edbef172f3106b9e4c0b96b24d8b5eea8d2a5 (patch) | |
| tree | 22a1e533a8b979ecb33c24c9ac42514560901861 | |
| parent | 3128d65fd7da9dc9b7a6823fae9d9b2ca33afca6 (diff) | |
Fix the DRI swrast driver for big endian platforms.
Too bad I didn't realize earlier how easy this could be...
Fixes http://bugs.freedesktop.org/show_bug.cgi?id=22767 .
| -rw-r--r-- | docs/relnotes-7.6.1.html | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/swrast/swrast_span.c | 72 | 
2 files changed, 30 insertions, 43 deletions
diff --git a/docs/relnotes-7.6.1.html b/docs/relnotes-7.6.1.html index 3d19c6cb70..d155cf5a67 100644 --- a/docs/relnotes-7.6.1.html +++ b/docs/relnotes-7.6.1.html @@ -55,6 +55,7 @@ tbd  <li>Fixed a number of Microsoft Visual Studio compilation problems.  <li>Fixed clipping / provoking vertex bugs in i965 driver.  <li>Assorted build fixes for AIX. +<li>Endianness fixes for the DRI swrast driver (bug 22767).</li>  </ul>  <h2>Changes</h2> diff --git a/src/mesa/drivers/dri/swrast/swrast_span.c b/src/mesa/drivers/dri/swrast/swrast_span.c index 2d3c25dcbe..f8e503463f 100644 --- a/src/mesa/drivers/dri/swrast/swrast_span.c +++ b/src/mesa/drivers/dri/swrast/swrast_span.c @@ -63,56 +63,42 @@ static const GLubyte kernel[16] = {  /* 32-bit BGRA */  #define STORE_PIXEL_A8R8G8B8(DST, X, Y, VALUE) \ -   DST[3] = VALUE[ACOMP]; \ -   DST[2] = VALUE[RCOMP]; \ -   DST[1] = VALUE[GCOMP]; \ -   DST[0] = VALUE[BCOMP] +   *DST = VALUE[ACOMP] << 24 | VALUE[RCOMP] << 16 | VALUE[GCOMP] << 8 | VALUE[BCOMP]  #define STORE_PIXEL_RGB_A8R8G8B8(DST, X, Y, VALUE) \ -   DST[3] = 0xff; \ -   DST[2] = VALUE[RCOMP]; \ -   DST[1] = VALUE[GCOMP]; \ -   DST[0] = VALUE[BCOMP] +   *DST = 0xff << 24 | VALUE[RCOMP] << 16 | VALUE[GCOMP] << 8 | VALUE[BCOMP]  #define FETCH_PIXEL_A8R8G8B8(DST, SRC) \ -   DST[ACOMP] = SRC[3]; \ -   DST[RCOMP] = SRC[2]; \ -   DST[GCOMP] = SRC[1]; \ -   DST[BCOMP] = SRC[0] +   DST[ACOMP] = *SRC >> 24;            \ +   DST[RCOMP] = (*SRC >> 16) & 0xff;   \ +   DST[GCOMP] = (*SRC >> 8) & 0xff;    \ +   DST[BCOMP] = *SRC & 0xff  /* 32-bit BGRX */  #define STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE) \ -   DST[3] = 0xff; \ -   DST[2] = VALUE[RCOMP]; \ -   DST[1] = VALUE[GCOMP]; \ -   DST[0] = VALUE[BCOMP] +   *DST = 0xff << 24 | VALUE[RCOMP] << 16 | VALUE[GCOMP] << 8 | VALUE[BCOMP]  #define STORE_PIXEL_RGB_X8R8G8B8(DST, X, Y, VALUE) \ -   DST[3] = 0xff; \ -   DST[2] = VALUE[RCOMP]; \ -   DST[1] = VALUE[GCOMP]; \ -   DST[0] = VALUE[BCOMP] +   *DST = 0xff << 24 | VALUE[RCOMP] << 16 | VALUE[GCOMP] << 8 | VALUE[BCOMP]  #define FETCH_PIXEL_X8R8G8B8(DST, SRC) \ -   DST[ACOMP] = 0xff; \ -   DST[RCOMP] = SRC[2]; \ -   DST[GCOMP] = SRC[1]; \ -   DST[BCOMP] = SRC[0] +   DST[ACOMP] = 0xff;                  \ +   DST[RCOMP] = (*SRC >> 16) & 0xff;   \ +   DST[GCOMP] = (*SRC >> 8) & 0xff;    \ +   DST[BCOMP] = *SRC & 0xff  /* 16-bit BGR */  #define STORE_PIXEL_R5G6B5(DST, X, Y, VALUE) \     do { \     int d = DITHER_COMP(X, Y) >> 6; \ -   GLushort *p = (GLushort *)DST; \ -   *p = ( ((DITHER_CLAMP((VALUE[RCOMP]) + d) & 0xf8) << 8) | \ -	  ((DITHER_CLAMP((VALUE[GCOMP]) + d) & 0xfc) << 3) | \ -	  ((DITHER_CLAMP((VALUE[BCOMP]) + d) & 0xf8) >> 3) ); \ +   *DST = ( ((DITHER_CLAMP((VALUE[RCOMP]) + d) & 0xf8) << 8) | \ +            ((DITHER_CLAMP((VALUE[GCOMP]) + d) & 0xfc) << 3) | \ +            ((DITHER_CLAMP((VALUE[BCOMP]) + d) & 0xf8) >> 3) ); \     } while(0)  #define FETCH_PIXEL_R5G6B5(DST, SRC) \     do { \ -   GLushort p = *(GLushort *)SRC; \     DST[ACOMP] = 0xff; \ -   DST[RCOMP] = ((p >> 8) & 0xf8) * 255 / 0xf8; \ -   DST[GCOMP] = ((p >> 3) & 0xfc) * 255 / 0xfc; \ -   DST[BCOMP] = ((p << 3) & 0xf8) * 255 / 0xf8; \ +   DST[RCOMP] = ((*SRC >> 8) & 0xf8) * 255 / 0xf8; \ +   DST[GCOMP] = ((*SRC >> 3) & 0xfc) * 255 / 0xfc; \ +   DST[BCOMP] = ((*SRC << 3) & 0xf8) * 255 / 0xf8; \     } while(0) @@ -145,8 +131,8 @@ static const GLubyte kernel[16] = {  #define SPAN_VARS \     struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);  #define INIT_PIXEL_PTR(P, X, Y) \ -   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X) * 4; -#define INC_PIXEL_PTR(P) P += 4 +   GLuint *P = (GLuint *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch / 4 + (X) +#define INC_PIXEL_PTR(P) P++  #define STORE_PIXEL(DST, X, Y, VALUE) \     STORE_PIXEL_A8R8G8B8(DST, X, Y, VALUE)  #define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ @@ -163,8 +149,8 @@ static const GLubyte kernel[16] = {  #define SPAN_VARS \     struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);  #define INIT_PIXEL_PTR(P, X, Y) \ -   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X) * 4; -#define INC_PIXEL_PTR(P) P += 4 +   GLuint *P = (GLuint *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch / 4 + (X); +#define INC_PIXEL_PTR(P) P++  #define STORE_PIXEL(DST, X, Y, VALUE) \     STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE)  #define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ @@ -181,8 +167,8 @@ static const GLubyte kernel[16] = {  #define SPAN_VARS \     struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);  #define INIT_PIXEL_PTR(P, X, Y) \ -   GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X) * 2; -#define INC_PIXEL_PTR(P) P += 2 +   GLushort *P = (GLushort *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch / 2 + (X); +#define INC_PIXEL_PTR(P) P++  #define STORE_PIXEL(DST, X, Y, VALUE) \     STORE_PIXEL_R5G6B5(DST, X, Y, VALUE)  #define FETCH_PIXEL(DST, SRC) \ @@ -234,8 +220,8 @@ static const GLubyte kernel[16] = {  #define SPAN_VARS \     struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);  #define INIT_PIXEL_PTR(P, X, Y) \ -   GLubyte *P = (GLubyte *)row; -#define INC_PIXEL_PTR(P) P += 4 +   GLuint *P = (GLuint *)row; +#define INC_PIXEL_PTR(P) P++  #define STORE_PIXEL(DST, X, Y, VALUE) \     STORE_PIXEL_A8R8G8B8(DST, X, Y, VALUE)  #define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ @@ -252,8 +238,8 @@ static const GLubyte kernel[16] = {  #define SPAN_VARS \     struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);  #define INIT_PIXEL_PTR(P, X, Y) \ -   GLubyte *P = (GLubyte *)row; -#define INC_PIXEL_PTR(P) P += 4 +   GLuint *P = (GLuint *)row; +#define INC_PIXEL_PTR(P) P++  #define STORE_PIXEL(DST, X, Y, VALUE) \     STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE)  #define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ @@ -270,7 +256,7 @@ static const GLubyte kernel[16] = {  #define SPAN_VARS \     struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);  #define INIT_PIXEL_PTR(P, X, Y) \ -   GLubyte *P = (GLubyte *)row; +   GLushort *P = (GLushort *)row;  #define INC_PIXEL_PTR(P) P += 2  #define STORE_PIXEL(DST, X, Y, VALUE) \     STORE_PIXEL_R5G6B5(DST, X, Y, VALUE)  | 
