summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2012-08-22 21:22:00 -0600
committerBrian Paul <brianp@vmware.com>2012-08-24 06:18:41 -0600
commitd78b44c2651b45c337dda71b17351beb41eb9c14 (patch)
tree646da5be94f7026494ec1c589acfe178cefaa1cd
parentfe2cc65fbb37bca40ff215a3709dacbcd317350c (diff)
mesa/swrast: fix GL_TEXTURE_2D_ARRAY texture fetches for latc/rgtc formats
Fix-up the texel fetch functions so that they handle 3D coords (as used for array textures) and remove the "f_2d" part from their names. Helps fix swrast crashes in piglit's copyteximage test. More to come.
-rw-r--r--src/mesa/main/texcompress.c16
-rw-r--r--src/mesa/main/texcompress_rgtc.c100
-rw-r--r--src/mesa/main/texcompress_rgtc.h32
-rw-r--r--src/mesa/swrast/s_texfetch.c48
4 files changed, 108 insertions, 88 deletions
diff --git a/src/mesa/main/texcompress.c b/src/mesa/main/texcompress.c
index 48c472eda63..5e669375963 100644
--- a/src/mesa/main/texcompress.c
+++ b/src/mesa/main/texcompress.c
@@ -516,30 +516,30 @@ _mesa_decompress_image(gl_format format, GLuint width, GLuint height,
/* Red/RG formats */
case MESA_FORMAT_RED_RGTC1:
- fetch = _mesa_fetch_texel_2d_f_red_rgtc1;
+ fetch = _mesa_fetch_texel_red_rgtc1;
break;
case MESA_FORMAT_SIGNED_RED_RGTC1:
- fetch = _mesa_fetch_texel_2d_f_signed_red_rgtc1;
+ fetch = _mesa_fetch_texel_signed_red_rgtc1;
break;
case MESA_FORMAT_RG_RGTC2:
- fetch = _mesa_fetch_texel_2d_f_rg_rgtc2;
+ fetch = _mesa_fetch_texel_rg_rgtc2;
break;
case MESA_FORMAT_SIGNED_RG_RGTC2:
- fetch = _mesa_fetch_texel_2d_f_signed_rg_rgtc2;
+ fetch = _mesa_fetch_texel_signed_rg_rgtc2;
break;
/* L/LA formats */
case MESA_FORMAT_L_LATC1:
- fetch = _mesa_fetch_texel_2d_f_l_latc1;
+ fetch = _mesa_fetch_texel_l_latc1;
break;
case MESA_FORMAT_SIGNED_L_LATC1:
- fetch = _mesa_fetch_texel_2d_f_signed_l_latc1;
+ fetch = _mesa_fetch_texel_signed_l_latc1;
break;
case MESA_FORMAT_LA_LATC2:
- fetch = _mesa_fetch_texel_2d_f_la_latc2;
+ fetch = _mesa_fetch_texel_la_latc2;
break;
case MESA_FORMAT_SIGNED_LA_LATC2:
- fetch = _mesa_fetch_texel_2d_f_signed_la_latc2;
+ fetch = _mesa_fetch_texel_signed_la_latc2;
break;
/* ETC1 formats */
diff --git a/src/mesa/main/texcompress_rgtc.c b/src/mesa/main/texcompress_rgtc.c
index f707a0994e9..84d8fc7fc19 100644
--- a/src/mesa/main/texcompress_rgtc.c
+++ b/src/mesa/main/texcompress_rgtc.c
@@ -292,12 +292,14 @@ _mesa_texstore_signed_rg_rgtc2(TEXSTORE_PARAMS)
}
void
-_mesa_fetch_texel_2d_f_red_rgtc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_red_rgtc1(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel)
{
GLubyte red;
- unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map,
- i, j, &red, 1);
+ GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
+ unsigned_fetch_texel_rgtc(texImage->RowStride,
+ texImage->Map + sliceOffset,
+ i, j, &red, 1);
texel[RCOMP] = UBYTE_TO_FLOAT(red);
texel[GCOMP] = 0.0;
texel[BCOMP] = 0.0;
@@ -305,12 +307,14 @@ _mesa_fetch_texel_2d_f_red_rgtc1(const struct swrast_texture_image *texImage,
}
void
-_mesa_fetch_texel_2d_f_signed_red_rgtc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_signed_red_rgtc1(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel)
{
GLbyte red;
- signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map),
- i, j, &red, 1);
+ 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;
@@ -318,14 +322,17 @@ _mesa_fetch_texel_2d_f_signed_red_rgtc1(const struct swrast_texture_image *texIm
}
void
-_mesa_fetch_texel_2d_f_rg_rgtc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_rg_rgtc2(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel)
{
GLubyte red, green;
- unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map,
- i, j, &red, 2);
- unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map + 8,
- i, j, &green, 2);
+ 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;
@@ -333,14 +340,17 @@ _mesa_fetch_texel_2d_f_rg_rgtc2(const struct swrast_texture_image *texImage,
}
void
-_mesa_fetch_texel_2d_f_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel)
{
GLbyte red, green;
- signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map),
- i, j, &red, 2);
- signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map) + 8,
- i, j, &green, 2);
+ 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);
texel[RCOMP] = BYTE_TO_FLOAT_TEX(red);
texel[GCOMP] = BYTE_TO_FLOAT_TEX(green);
texel[BCOMP] = 0.0;
@@ -348,12 +358,14 @@ _mesa_fetch_texel_2d_f_signed_rg_rgtc2(const struct swrast_texture_image *texIma
}
void
-_mesa_fetch_texel_2d_f_l_latc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_l_latc1(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel)
{
GLubyte red;
- unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map,
- i, j, &red, 1);
+ GLint sliceOffset = k ? texImage->ImageOffsets[k] / 2 : 0;
+ unsigned_fetch_texel_rgtc(texImage->RowStride,
+ texImage->Map + sliceOffset,
+ i, j, &red, 1);
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = UBYTE_TO_FLOAT(red);
@@ -361,12 +373,14 @@ _mesa_fetch_texel_2d_f_l_latc1(const struct swrast_texture_image *texImage,
}
void
-_mesa_fetch_texel_2d_f_signed_l_latc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_signed_l_latc1(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel)
{
GLbyte red;
- signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map),
- i, j, &red, 1);
+ 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);
@@ -374,14 +388,17 @@ _mesa_fetch_texel_2d_f_signed_l_latc1(const struct swrast_texture_image *texImag
}
void
-_mesa_fetch_texel_2d_f_la_latc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_la_latc2(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel)
{
GLubyte red, green;
- unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map,
- i, j, &red, 2);
- unsigned_fetch_texel_rgtc(texImage->RowStride, texImage->Map + 8,
- i, j, &green, 2);
+ 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] =
texel[GCOMP] =
texel[BCOMP] = UBYTE_TO_FLOAT(red);
@@ -389,14 +406,17 @@ _mesa_fetch_texel_2d_f_la_latc2(const struct swrast_texture_image *texImage,
}
void
-_mesa_fetch_texel_2d_f_signed_la_latc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel)
{
GLbyte red, green;
- signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map),
- i, j, &red, 2);
- signed_fetch_texel_rgtc(texImage->RowStride, (GLbyte *)(texImage->Map) + 8,
- i, j, &green, 2);
+ 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);
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = BYTE_TO_FLOAT_TEX(red);
diff --git a/src/mesa/main/texcompress_rgtc.h b/src/mesa/main/texcompress_rgtc.h
index 6be6ad9be41..91fda882d4b 100644
--- a/src/mesa/main/texcompress_rgtc.h
+++ b/src/mesa/main/texcompress_rgtc.h
@@ -43,35 +43,35 @@ extern GLboolean
_mesa_texstore_signed_rg_rgtc2(TEXSTORE_PARAMS);
extern void
-_mesa_fetch_texel_2d_f_red_rgtc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_red_rgtc1(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel);
extern void
-_mesa_fetch_texel_2d_f_signed_red_rgtc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_signed_red_rgtc1(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel);
extern void
-_mesa_fetch_texel_2d_f_rg_rgtc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_rg_rgtc2(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel);
extern void
-_mesa_fetch_texel_2d_f_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_signed_rg_rgtc2(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel);
extern void
-_mesa_fetch_texel_2d_f_l_latc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_l_latc1(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel);
extern void
-_mesa_fetch_texel_2d_f_signed_l_latc1(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_signed_l_latc1(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel);
extern void
-_mesa_fetch_texel_2d_f_la_latc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_la_latc2(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel);
extern void
-_mesa_fetch_texel_2d_f_signed_la_latc2(const struct swrast_texture_image *texImage,
- GLint i, GLint j, GLint k, GLfloat *texel);
+_mesa_fetch_texel_signed_la_latc2(const struct swrast_texture_image *texImage,
+ GLint i, GLint j, GLint k, GLfloat *texel);
#endif
diff --git a/src/mesa/swrast/s_texfetch.c b/src/mesa/swrast/s_texfetch.c
index db7c887b673..cd3a2b151f3 100644
--- a/src/mesa/swrast/s_texfetch.c
+++ b/src/mesa/swrast/s_texfetch.c
@@ -976,51 +976,51 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
},
{
MESA_FORMAT_RED_RGTC1,
- NULL,
- _mesa_fetch_texel_2d_f_red_rgtc1,
- NULL
+ _mesa_fetch_texel_red_rgtc1,
+ _mesa_fetch_texel_red_rgtc1,
+ _mesa_fetch_texel_red_rgtc1
},
{
MESA_FORMAT_SIGNED_RED_RGTC1,
- NULL,
- _mesa_fetch_texel_2d_f_signed_red_rgtc1,
- NULL
+ _mesa_fetch_texel_signed_red_rgtc1,
+ _mesa_fetch_texel_signed_red_rgtc1,
+ _mesa_fetch_texel_signed_red_rgtc1
},
{
MESA_FORMAT_RG_RGTC2,
- NULL,
- _mesa_fetch_texel_2d_f_rg_rgtc2,
- NULL
+ _mesa_fetch_texel_rg_rgtc2,
+ _mesa_fetch_texel_rg_rgtc2,
+ _mesa_fetch_texel_rg_rgtc2
},
{
MESA_FORMAT_SIGNED_RG_RGTC2,
- NULL,
- _mesa_fetch_texel_2d_f_signed_rg_rgtc2,
- NULL
+ _mesa_fetch_texel_signed_rg_rgtc2,
+ _mesa_fetch_texel_signed_rg_rgtc2,
+ _mesa_fetch_texel_signed_rg_rgtc2
},
{
MESA_FORMAT_L_LATC1,
- NULL,
- _mesa_fetch_texel_2d_f_l_latc1,
- NULL
+ _mesa_fetch_texel_l_latc1,
+ _mesa_fetch_texel_l_latc1,
+ _mesa_fetch_texel_l_latc1
},
{
MESA_FORMAT_SIGNED_L_LATC1,
- NULL,
- _mesa_fetch_texel_2d_f_signed_l_latc1,
- NULL
+ _mesa_fetch_texel_signed_l_latc1,
+ _mesa_fetch_texel_signed_l_latc1,
+ _mesa_fetch_texel_signed_l_latc1
},
{
MESA_FORMAT_LA_LATC2,
- NULL,
- _mesa_fetch_texel_2d_f_la_latc2,
- NULL
+ _mesa_fetch_texel_la_latc2,
+ _mesa_fetch_texel_la_latc2,
+ _mesa_fetch_texel_la_latc2
},
{
MESA_FORMAT_SIGNED_LA_LATC2,
- NULL,
- _mesa_fetch_texel_2d_f_signed_la_latc2,
- NULL
+ _mesa_fetch_texel_signed_la_latc2,
+ _mesa_fetch_texel_signed_la_latc2,
+ _mesa_fetch_texel_signed_la_latc2
},
{
MESA_FORMAT_ETC1_RGB8,