Mesa (master): rgtc: move the texel fetch into common unsigned/signed code.

Dave Airlie airlied at kemper.freedesktop.org
Tue Mar 1 20:11:58 PST 2011


Module: Mesa
Branch: master
Commit: 531c336fa39d8e823d05728cb7ddb3cc8a44d199
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=531c336fa39d8e823d05728cb7ddb3cc8a44d199

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Mar  2 14:16:39 2011 +1000

rgtc: move the texel fetch into common unsigned/signed code.

This function can be done in the include file also.

Signed-off-by: Dave Airlie <airlied at redhat.com>

---

 src/mesa/main/texcompress_rgtc.c     |   77 +++++----------------------------
 src/mesa/main/texcompress_rgtc_tmp.h |   29 +++++++++++++
 2 files changed, 41 insertions(+), 65 deletions(-)

diff --git a/src/mesa/main/texcompress_rgtc.c b/src/mesa/main/texcompress_rgtc.c
index 1b87303..26dca2d 100644
--- a/src/mesa/main/texcompress_rgtc.c
+++ b/src/mesa/main/texcompress_rgtc.c
@@ -51,6 +51,12 @@ static void unsigned_encode_rgtc_chan(GLubyte *blkaddr, GLubyte srccolors[4][4],
 static void signed_encode_rgtc_chan(GLbyte *blkaddr, GLbyte srccolors[4][4],
 			     GLint numxpixels, GLint numypixels);
 
+static void unsigned_fetch_texel_rgtc(unsigned srcRowStride, const GLubyte *pixdata,
+				      unsigned i, unsigned j, GLubyte *value, unsigned comps);
+
+static void signed_fetch_texel_rgtc(unsigned srcRowStride, const GLbyte *pixdata,
+				      unsigned i, unsigned j, GLbyte *value, unsigned comps);
+
 static void extractsrc_u( GLubyte srcpixels[4][4], const GLchan *srcaddr,
 			  GLint srcRowStride, GLint numxpixels, GLint numypixels, GLint comps)
 {
@@ -312,71 +318,12 @@ _mesa_texstore_signed_rg_rgtc2(TEXSTORE_PARAMS)
    return GL_TRUE;
 }
 
-static void _fetch_texel_rgtc_u(GLint srcRowStride, const GLubyte *pixdata,
-				GLint i, GLint j, GLubyte *value, int comps)
-{
-   GLubyte decode;
-   const GLubyte *blksrc = (pixdata + ((srcRowStride + 3) / 4 * (j / 4) + (i / 4)) * 8 * comps);
-   const GLubyte alpha0 = blksrc[0];
-   const GLubyte alpha1 = blksrc[1];
-   const GLubyte bit_pos = ((j&3) * 4 + (i&3)) * 3;
-   const GLubyte acodelow = blksrc[2 + bit_pos / 8];
-   const uint8_t acodehigh = (3 + bit_pos / 8) < 8 ? blksrc[3 + bit_pos / 8] : 0;
-   const GLubyte code = (acodelow >> (bit_pos & 0x7) |
-      (acodehigh  << (8 - (bit_pos & 0x7)))) & 0x7;
-
-   if (code == 0)
-      decode =  alpha0;
-   else if (code == 1)
-      decode =  alpha1;
-   else if (alpha0 > alpha1)
-      decode =  ((alpha0 * (8 - code) + (alpha1 * (code - 1))) / 7);
-   else if (code < 6)
-      decode =  ((alpha0 * (6 - code) + (alpha1 * (code - 1))) / 5);
-   else if (code == 6)
-      decode = 0;
-   else
-      decode = 255;
-
-   *value = decode;
-}
-
-
-static void _fetch_texel_rgtc_s(GLint srcRowStride, const GLbyte *pixdata,
-				GLint i, GLint j, GLbyte *value, int comps)
-{
-   GLbyte decode;
-   const GLbyte *blksrc = (pixdata + ((srcRowStride + 3) / 4 * (j / 4) + (i / 4)) * 8 * comps);
-   const GLbyte alpha0 = blksrc[0];
-   const GLbyte alpha1 = blksrc[1];
-   const GLbyte bit_pos = ((j&3) * 4 + (i&3)) * 3;
-   const GLbyte acodelow = blksrc[2 + bit_pos / 8];
-   const uint8_t acodehigh = (3 + bit_pos / 8) < 8 ? blksrc[3 + bit_pos / 8] : 0;
-   const GLbyte code = (acodelow >> (bit_pos & 0x7) |
-      (acodehigh  << (8 - (bit_pos & 0x7)))) & 0x7;
-
-   if (code == 0)
-      decode = alpha0;
-   else if (code == 1)
-      decode = alpha1;
-   else if (alpha0 > alpha1)
-      decode = ((alpha0 * (8 - code) + (alpha1 * (code - 1))) / 7);
-   else if (code < 6)
-      decode = ((alpha0 * (6 - code) + (alpha1 * (code - 1))) / 5);
-   else if (code == 6)
-      decode = -128;
-   else
-      decode = 127;
-
-   *value = decode;
-}
-
 void
 _mesa_fetch_texel_2d_f_red_rgtc1(const struct gl_texture_image *texImage,
 				 GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLubyte red;
-   _fetch_texel_rgtc_u(texImage->RowStride, (GLubyte *)(texImage->Data),
+   unsigned_fetch_texel_rgtc(texImage->RowStride, (GLubyte *)(texImage->Data),
 		       i, j, &red, 1);
    texel[RCOMP] = UBYTE_TO_FLOAT(red);
    texel[GCOMP] = 0.0;
@@ -389,7 +336,7 @@ _mesa_fetch_texel_2d_f_signed_red_rgtc1(const struct gl_texture_image *texImage,
 					GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLbyte red;
-   _fetch_texel_rgtc_s(texImage->RowStride, (GLbyte *)(texImage->Data),
+   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Data),
 		       i, j, &red, 1);
    texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
    texel[GCOMP] = 0.0;
@@ -402,9 +349,9 @@ _mesa_fetch_texel_2d_f_rg_rgtc2(const struct gl_texture_image *texImage,
 				 GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLubyte red, green;
-   _fetch_texel_rgtc_u(texImage->RowStride, (GLubyte *)(texImage->Data),
+   unsigned_fetch_texel_rgtc(texImage->RowStride, (GLubyte *)(texImage->Data),
 		     i, j, &red, 2);
-   _fetch_texel_rgtc_u(texImage->RowStride, (GLubyte *)(texImage->Data) + 8,
+   unsigned_fetch_texel_rgtc(texImage->RowStride, (GLubyte *)(texImage->Data) + 8,
 		     i, j, &green, 2);
    texel[RCOMP] = UBYTE_TO_FLOAT(red);
    texel[GCOMP] = UBYTE_TO_FLOAT(green);
@@ -417,9 +364,9 @@ _mesa_fetch_texel_2d_f_signed_rg_rgtc2(const struct gl_texture_image *texImage,
 				       GLint i, GLint j, GLint k, GLfloat *texel)
 {
    GLbyte red, green;
-   _fetch_texel_rgtc_s(texImage->RowStride, (GLbyte *)(texImage->Data),
+   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Data),
 		     i, j, &red, 2);
-   _fetch_texel_rgtc_s(texImage->RowStride, (GLbyte *)(texImage->Data) + 8,
+   signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Data) + 8,
 		     i, j, &green, 2);
    texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
    texel[GCOMP] = BYTE_TO_FLOAT_TEX(green);
diff --git a/src/mesa/main/texcompress_rgtc_tmp.h b/src/mesa/main/texcompress_rgtc_tmp.h
index 9377a6b..404f7fe 100644
--- a/src/mesa/main/texcompress_rgtc_tmp.h
+++ b/src/mesa/main/texcompress_rgtc_tmp.h
@@ -29,6 +29,35 @@
 
 /* included by texcompress_rgtc to define byte/ubyte compressors */
 
+static void TAG(fetch_texel_rgtc)(unsigned srcRowStride, const TYPE *pixdata,
+				  unsigned i, unsigned j, TYPE *value, unsigned comps)
+{
+   TYPE decode;
+   const TYPE *blksrc = (pixdata + ((srcRowStride + 3) / 4 * (j / 4) + (i / 4)) * 8 * comps);
+   const TYPE alpha0 = blksrc[0];
+   const TYPE alpha1 = blksrc[1];
+   const char bit_pos = ((j&3) * 4 + (i&3)) * 3;
+   const TYPE acodelow = blksrc[2 + bit_pos / 8];
+   const TYPE acodehigh = (3 + bit_pos / 8) < 8 ? blksrc[3 + bit_pos / 8] : 0;
+   const TYPE code = (acodelow >> (bit_pos & 0x7) |
+      (acodehigh  << (8 - (bit_pos & 0x7)))) & 0x7;
+
+   if (code == 0)
+      decode = alpha0;
+   else if (code == 1)
+      decode = alpha1;
+   else if (alpha0 > alpha1)
+      decode = ((alpha0 * (8 - code) + (alpha1 * (code - 1))) / 7);
+   else if (code < 6)
+      decode = ((alpha0 * (6 - code) + (alpha1 * (code - 1))) / 5);
+   else if (code == 6)
+      decode = T_MIN;
+   else
+      decode = T_MAX;
+
+   *value = decode;
+}
+
 static void TAG(write_rgtc_encoded_channel)(TYPE *blkaddr,
 					    TYPE alphabase1,
 					    TYPE alphabase2,



More information about the mesa-commit mailing list