From: Marek Olšák Date: Wed, 22 Dec 2010 18:29:56 +0000 (+0100) Subject: mesa: preserve 10 bits of precision in the texstore general path for ARGB2101010 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=50630f9016bdf0ea33ae1007c5a523cdcde3e3c9;p=mesa.git mesa: preserve 10 bits of precision in the texstore general path for ARGB2101010 Use make_temp_float_image instead of _make_temp_chan_image. The latter converts the texture to 8 bits/component, losing 2 bits. --- diff --git a/src/mesa/main/colormac.h b/src/mesa/main/colormac.h index 065f9f937a2..a328dcd32af 100644 --- a/src/mesa/main/colormac.h +++ b/src/mesa/main/colormac.h @@ -198,10 +198,14 @@ do { \ ((((B) & 0xf8) >> 1) | (((G) & 0xc0) >> 6) | (((G) & 0x38) << 10) | (((R) & 0xf8) << 5) | \ ((A) ? 0x80 : 0)) -#define PACK_COLOR_2101010( A, B, G, R ) \ +#define PACK_COLOR_2101010_UB( A, B, G, R ) \ (((B) << 22) | ((G) << 12) | ((R) << 2) | \ (((A) & 0xc0) << 24)) +#define PACK_COLOR_2101010_US( A, B, G, R ) \ + ((((B) >> 6) << 20) | (((G) >> 6) << 10) | ((R) >> 6) | \ + (((A) >> 14) << 30)) + #define PACK_COLOR_4444( R, G, B, A ) \ ((((R) & 0xf0) << 8) | (((G) & 0xf0) << 4) | ((B) & 0xf0) | ((A) >> 4)) diff --git a/src/mesa/main/texfetch_tmp.h b/src/mesa/main/texfetch_tmp.h index 9d57ad7679b..36dede57f00 100644 --- a/src/mesa/main/texfetch_tmp.h +++ b/src/mesa/main/texfetch_tmp.h @@ -837,7 +837,7 @@ static void store_texel_argb2101010(struct gl_texture_image *texImage, { const GLubyte *rgba = (const GLubyte *) texel; GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1); - *dst = PACK_COLOR_2101010(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]); + *dst = PACK_COLOR_2101010_UB(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]); } #endif diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index acb390b7810..de99e6c1862 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -2063,13 +2063,14 @@ _mesa_texstore_argb2101010(TEXSTORE_PARAMS) } else { /* general path */ - const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, + const GLfloat *tempImage = make_temp_float_image(ctx, dims, baseInternalFormat, baseFormat, srcWidth, srcHeight, srcDepth, srcFormat, srcType, srcAddr, - srcPacking); - const GLchan *src = tempImage; + srcPacking, + ctx->_ImageTransferState); + const GLfloat *src = tempImage; GLint img, row, col; if (!tempImage) return GL_FALSE; @@ -2080,24 +2081,29 @@ _mesa_texstore_argb2101010(TEXSTORE_PARAMS) + dstXoffset * texelBytes; if (baseInternalFormat == GL_RGBA) { for (row = 0; row < srcHeight; row++) { - GLuint *dstUS = (GLuint *) dstRow; + GLuint *dstUI = (GLuint *) dstRow; for (col = 0; col < srcWidth; col++) { - dstUS[col] = PACK_COLOR_2101010( CHAN_TO_UBYTE(src[ACOMP]), - CHAN_TO_UBYTE(src[RCOMP]), - CHAN_TO_UBYTE(src[GCOMP]), - CHAN_TO_UBYTE(src[BCOMP]) ); + GLushort a,r,g,b; + + UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]); + UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); + UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); + UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); + dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b); src += 4; } dstRow += dstRowStride; } } else if (baseInternalFormat == GL_RGB) { for (row = 0; row < srcHeight; row++) { - GLuint *dstUS = (GLuint *) dstRow; + GLuint *dstUI = (GLuint *) dstRow; for (col = 0; col < srcWidth; col++) { - dstUS[col] = PACK_COLOR_2101010( 0xff, - CHAN_TO_UBYTE(src[RCOMP]), - CHAN_TO_UBYTE(src[GCOMP]), - CHAN_TO_UBYTE(src[BCOMP]) ); + GLushort r,g,b; + + UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); + UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); + UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); + dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b); src += 4; } dstRow += dstRowStride;