#include "colormac.h"
#include "image.h"
#include "macros.h"
-#include "mfeatures.h"
#include "mipmap.h"
#include "texcompress.h"
#include "texcompress_rgtc.h"
#include "texstore.h"
-#include "swrast/s_context.h"
#define RGTC_DEBUG 0
return GL_TRUE;
}
-void
-_mesa_fetch_texel_red_rgtc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+
+#define TAG(x) unsigned_##x
+
+#define TYPE GLubyte
+#define T_MIN 0
+#define T_MAX 0xff
+
+#include "texcompress_rgtc_tmp.h"
+
+#undef TAG
+#undef TYPE
+#undef T_MIN
+#undef T_MAX
+
+#define TAG(x) signed_##x
+#define TYPE GLbyte
+#define T_MIN (GLbyte)-128
+#define T_MAX (GLbyte)127
+
+#include "texcompress_rgtc_tmp.h"
+
+#undef TAG
+#undef TYPE
+#undef T_MIN
+#undef T_MAX
+
+
+
+static void
+fetch_red_rgtc1(const GLubyte *map,
+ GLint rowStride, GLint i, GLint j, GLfloat *texel)
{
GLubyte red;
- GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
- unsigned_fetch_texel_rgtc(texImage->RowStride,
- texImage->Map + sliceOffset,
- i, j, &red, 1);
+ unsigned_fetch_texel_rgtc(rowStride, map, i, j, &red, 1);
texel[RCOMP] = UBYTE_TO_FLOAT(red);
texel[GCOMP] = 0.0;
texel[BCOMP] = 0.0;
texel[ACOMP] = 1.0;
}
-void
-_mesa_fetch_texel_signed_red_rgtc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
-{
- GLbyte red;
- GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
- signed_fetch_texel_rgtc(texImage->RowStride,
- (GLbyte *)(texImage->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;
-}
-
-void
-_mesa_fetch_texel_rg_rgtc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_l_latc1(const GLubyte *map,
+ GLint rowStride, GLint i, GLint j, GLfloat *texel)
{
- GLubyte red, green;
- GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
- unsigned_fetch_texel_rgtc(texImage->RowStride,
- texImage->Map + sliceOffset,
- i, j, &red, 2);
- unsigned_fetch_texel_rgtc(texImage->RowStride,
- texImage->Map + sliceOffset + 8,
- i, j, &green, 2);
- texel[RCOMP] = UBYTE_TO_FLOAT(red);
- texel[GCOMP] = UBYTE_TO_FLOAT(green);
- texel[BCOMP] = 0.0;
+ GLubyte red;
+ unsigned_fetch_texel_rgtc(rowStride, map, i, j, &red, 1);
+ texel[RCOMP] =
+ texel[GCOMP] =
+ texel[BCOMP] = UBYTE_TO_FLOAT(red);
texel[ACOMP] = 1.0;
}
-void
-_mesa_fetch_texel_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_signed_red_rgtc1(const GLubyte *map,
+ GLint rowStride, GLint i, GLint j, GLfloat *texel)
{
- GLbyte red, green;
- GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
- signed_fetch_texel_rgtc(texImage->RowStride,
- (GLbyte *)(texImage->Map) + sliceOffset,
- i, j, &red, 2);
- signed_fetch_texel_rgtc(texImage->RowStride,
- (GLbyte *)(texImage->Map) + sliceOffset + 8,
- i, j, &green, 2);
+ GLbyte red;
+ signed_fetch_texel_rgtc(rowStride, (const GLbyte *) map,
+ i, j, &red, 1);
texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
- texel[GCOMP] = BYTE_TO_FLOAT_TEX(green);
+ texel[GCOMP] = 0.0;
texel[BCOMP] = 0.0;
texel[ACOMP] = 1.0;
}
-void
-_mesa_fetch_texel_l_latc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_signed_l_latc1(const GLubyte *map,
+ GLint rowStride, GLint i, GLint j, GLfloat *texel)
{
- GLubyte red;
- GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
- unsigned_fetch_texel_rgtc(texImage->RowStride,
- texImage->Map + sliceOffset,
- i, j, &red, 1);
+ GLbyte red;
+ signed_fetch_texel_rgtc(rowStride, (GLbyte *) map,
+ i, j, &red, 1);
texel[RCOMP] =
texel[GCOMP] =
- texel[BCOMP] = UBYTE_TO_FLOAT(red);
+ texel[BCOMP] = BYTE_TO_FLOAT(red);
texel[ACOMP] = 1.0;
}
-void
-_mesa_fetch_texel_signed_l_latc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_rg_rgtc2(const GLubyte *map,
+ GLint rowStride, GLint i, GLint j, GLfloat *texel)
{
- GLbyte red;
- GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
- signed_fetch_texel_rgtc(texImage->RowStride,
- (GLbyte *)(texImage->Map) + sliceOffset,
- i, j, &red, 1);
- texel[RCOMP] =
- texel[GCOMP] =
- texel[BCOMP] = BYTE_TO_FLOAT_TEX(red);
+ GLubyte red, green;
+ unsigned_fetch_texel_rgtc(rowStride,
+ map,
+ i, j, &red, 2);
+ unsigned_fetch_texel_rgtc(rowStride,
+ map + 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;
}
-void
-_mesa_fetch_texel_la_latc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_la_latc2(const GLubyte *map,
+ GLint rowStride, GLint i, GLint j, GLfloat *texel)
{
GLubyte red, green;
- GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
- unsigned_fetch_texel_rgtc(texImage->RowStride,
- texImage->Map + sliceOffset,
+ unsigned_fetch_texel_rgtc(rowStride,
+ map,
i, j, &red, 2);
- unsigned_fetch_texel_rgtc(texImage->RowStride,
- texImage->Map + sliceOffset + 8,
+ unsigned_fetch_texel_rgtc(rowStride,
+ map + 8,
i, j, &green, 2);
texel[RCOMP] =
texel[GCOMP] =
texel[ACOMP] = UBYTE_TO_FLOAT(green);
}
-void
-_mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+
+static void
+fetch_signed_rg_rgtc2(const GLubyte *map,
+ GLint rowStride, GLint i, GLint j, GLfloat *texel)
+{
+ GLbyte red, green;
+ signed_fetch_texel_rgtc(rowStride,
+ (GLbyte *) map,
+ i, j, &red, 2);
+ signed_fetch_texel_rgtc(rowStride,
+ (GLbyte *) map + 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,
+ GLint rowStride, GLint i, GLint j, GLfloat *texel)
{
GLbyte red, green;
- GLint sliceOffset = k ? texImage->ImageOffsets[k] : 0;
- signed_fetch_texel_rgtc(texImage->RowStride,
- (GLbyte *)(texImage->Map) + sliceOffset,
+ signed_fetch_texel_rgtc(rowStride,
+ (GLbyte *) map,
i, j, &red, 2);
- signed_fetch_texel_rgtc(texImage->RowStride,
- (GLbyte *)(texImage->Map) + sliceOffset + 8,
+ signed_fetch_texel_rgtc(rowStride,
+ (GLbyte *) map + 8,
i, j, &green, 2);
texel[RCOMP] =
texel[GCOMP] =
texel[ACOMP] = BYTE_TO_FLOAT_TEX(green);
}
-#define TAG(x) unsigned_##x
-
-#define TYPE GLubyte
-#define T_MIN 0
-#define T_MAX 0xff
-
-#include "texcompress_rgtc_tmp.h"
-
-#undef TAG
-#undef TYPE
-#undef T_MIN
-#undef T_MAX
-
-#define TAG(x) signed_##x
-#define TYPE GLbyte
-#define T_MIN (GLbyte)-128
-#define T_MAX (GLbyte)127
-#include "texcompress_rgtc_tmp.h"
-
-#undef TAG
-#undef TYPE
-#undef T_MIN
-#undef T_MAX
+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;
+ }
+}