mesa: add new texel fetch code for rgtc formats
authorBrian Paul <brianp@vmware.com>
Sat, 8 Dec 2012 22:19:44 +0000 (15:19 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 14 Dec 2012 13:33:07 +0000 (06:33 -0700)
src/mesa/main/texcompress_rgtc.c
src/mesa/main/texcompress_rgtc.h

index 5773459d79fe7886d182f6f134bac6fac8bf364a..de71f5da04bc13be024460d96550c4612ce954b4 100644 (file)
@@ -447,3 +447,164 @@ _mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage,
 #undef TYPE
 #undef T_MIN
 #undef T_MAX
+
+
+
+static void
+fetch_red_rgtc1(const GLubyte *map, const GLuint imageOffsets[],
+                GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   GLubyte red;
+   GLuint sliceOffset = k ? imageOffsets[k] / 2 : 0;
+   unsigned_fetch_texel_rgtc(rowStride, map + sliceOffset, i, j, &red, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT(red);
+   texel[GCOMP] = 0.0;
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+static void
+fetch_l_latc1(const GLubyte *map, const GLuint imageOffsets[],
+              GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   GLubyte red;
+   GLuint sliceOffset = k ? imageOffsets[k] / 2 : 0;
+   unsigned_fetch_texel_rgtc(rowStride, map + sliceOffset, i, j, &red, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = UBYTE_TO_FLOAT(red);
+   texel[ACOMP] = 1.0;
+}
+
+static void
+fetch_signed_red_rgtc1(const GLubyte *map, const GLuint imageOffsets[],
+                       GLint rowStride, GLint i, GLint j, GLint k,
+                       GLfloat *texel)
+{
+   GLbyte red;
+   GLuint sliceOffset = k ? imageOffsets[k] / 2 : 0;
+   signed_fetch_texel_rgtc(rowStride, (const GLbyte *) map + sliceOffset,
+                           i, j, &red, 1);
+   texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
+   texel[GCOMP] = 0.0;
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+static void
+fetch_signed_l_latc1(const GLubyte *map, const GLuint imageOffsets[],
+                     GLint rowStride, GLint i, GLint j, GLint k,
+                     GLfloat *texel)
+{
+   GLubyte red;
+   GLuint sliceOffset = k ? imageOffsets[k] / 2 : 0;
+   unsigned_fetch_texel_rgtc(rowStride,  map + sliceOffset, i, j, &red, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = BYTE_TO_FLOAT(red);
+   texel[ACOMP] = 1.0;
+}
+
+static void
+fetch_rg_rgtc2(const GLubyte *map, const GLuint imageOffsets[],
+               GLint rowStride, GLint i, GLint j, GLint k,
+               GLfloat *texel)
+{
+   GLubyte red, green;
+   GLuint sliceOffset = k ? imageOffsets[k] : 0;
+   unsigned_fetch_texel_rgtc(rowStride,
+                             map + sliceOffset,
+                             i, j, &red, 2);
+   unsigned_fetch_texel_rgtc(rowStride,
+                             map + sliceOffset + 8,
+                             i, j, &green, 2);
+   texel[RCOMP] = UBYTE_TO_FLOAT(red);
+   texel[GCOMP] = UBYTE_TO_FLOAT(green);
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+static void
+fetch_la_latc2(const GLubyte *map, const GLuint imageOffsets[],
+               GLint rowStride, GLint i, GLint j, GLint k,
+               GLfloat *texel)
+{
+   GLubyte red, green;
+   GLuint sliceOffset = k ? imageOffsets[k] : 0;
+   unsigned_fetch_texel_rgtc(rowStride,
+                             map + sliceOffset,
+                             i, j, &red, 2);
+   unsigned_fetch_texel_rgtc(rowStride,
+                             map + sliceOffset + 8,
+                             i, j, &green, 2);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = UBYTE_TO_FLOAT(red);
+   texel[ACOMP] = UBYTE_TO_FLOAT(green);
+}
+
+
+static void
+fetch_signed_rg_rgtc2(const GLubyte *map, const GLuint imageOffsets[],
+                      GLint rowStride, GLint i, GLint j, GLint k,
+                      GLfloat *texel)
+{
+   GLbyte red, green;
+   GLuint sliceOffset = k ? imageOffsets[k] : 0;
+   signed_fetch_texel_rgtc(rowStride,
+                           (GLbyte *) map + sliceOffset,
+                           i, j, &red, 2);
+   signed_fetch_texel_rgtc(rowStride,
+                           (GLbyte *) map + sliceOffset + 8,
+                           i, j, &green, 2);
+   texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
+   texel[GCOMP] = BYTE_TO_FLOAT_TEX(green);
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+
+static void
+fetch_signed_la_latc2(const GLubyte *map, const GLuint imageOffsets[],
+                      GLint rowStride, GLint i, GLint j, GLint k,
+                      GLfloat *texel)
+{
+   GLbyte red, green;
+   GLuint sliceOffset = k ? imageOffsets[k] : 0;
+   signed_fetch_texel_rgtc(rowStride,
+                           (GLbyte *) map + sliceOffset,
+                           i, j, &red, 2);
+   signed_fetch_texel_rgtc(rowStride,
+                           (GLbyte *) map + sliceOffset + 8,
+                           i, j, &green, 2);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = BYTE_TO_FLOAT_TEX(red);
+   texel[ACOMP] = BYTE_TO_FLOAT_TEX(green);
+}
+
+
+compressed_fetch_func
+_mesa_get_compressed_rgtc_func(gl_format format)
+{
+   switch (format) {
+   case MESA_FORMAT_RED_RGTC1:
+      return fetch_red_rgtc1;
+   case MESA_FORMAT_L_LATC1:
+      return fetch_l_latc1;
+   case MESA_FORMAT_SIGNED_RED_RGTC1:
+      return fetch_signed_red_rgtc1;
+   case MESA_FORMAT_SIGNED_L_LATC1:
+      return fetch_signed_l_latc1;
+   case MESA_FORMAT_RG_RGTC2:
+      return fetch_rg_rgtc2;
+   case MESA_FORMAT_LA_LATC2:
+      return fetch_la_latc2;
+   case MESA_FORMAT_SIGNED_RG_RGTC2:
+      return fetch_signed_rg_rgtc2;
+   case MESA_FORMAT_SIGNED_LA_LATC2:
+      return fetch_signed_la_latc2;
+   default:
+      return NULL;
+   }
+}
index 91fda882d4bc06f96e4619911b23e4ee8dd79dea..daa92d8839ffdb0b15f32f4d232f818c2d6217be 100644 (file)
@@ -74,4 +74,9 @@ extern void
 _mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage,
                                   GLint i, GLint j, GLint k, GLfloat *texel);
 
+
+extern compressed_fetch_func
+_mesa_get_compressed_rgtc_func(gl_format format);
+
+
 #endif