mesa: preserve 10 bits of precision in the texstore general path for ARGB2101010
authorMarek Olšák <maraeo@gmail.com>
Wed, 22 Dec 2010 18:29:56 +0000 (19:29 +0100)
committerMarek Olšák <maraeo@gmail.com>
Tue, 4 Jan 2011 20:59:56 +0000 (21:59 +0100)
Use make_temp_float_image instead of _make_temp_chan_image.
The latter converts the texture to 8 bits/component, losing 2 bits.

src/mesa/main/colormac.h
src/mesa/main/texfetch_tmp.h
src/mesa/main/texstore.c

index 065f9f937a21a31521826baa6f7e9cad2285aa02..a328dcd32af9468b2bb7dae7fa33d1835106067b 100644 (file)
@@ -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))
 
index 9d57ad7679bd2a59b8d5acca0746ba7f1412d7e0..36dede57f002eb8a005f4a78258791583a83c915 100644 (file)
@@ -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
 
index acb390b781058a9e3d9f4ab041107e9da33420bf..de99e6c18626f8cbd0d9728de0af0cfb6e5d7b59 100644 (file)
@@ -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;