mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
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.
This commit is contained in:
parent
fe2cc65fbb
commit
d78b44c265
4 changed files with 109 additions and 89 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
_mesa_fetch_texel_l_latc1(const struct swrast_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel);
|
||||
|
||||
extern void
|
||||
_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_signed_l_latc1(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_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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue