mesa: implement texstore and texfetch hooks for signed normalized formats

The snorm texstore functions were all broken.

swrast support done except for mipmap generation, but I leave it disabled.
This commit is contained in:
Marek Olšák 2011-03-13 14:48:09 +01:00
parent 0be369975f
commit daa5242f9e
3 changed files with 514 additions and 118 deletions

View file

@ -696,11 +696,11 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
store_texel_signed_r8
},
{
MESA_FORMAT_SIGNED_RG88,
fetch_texel_1d_signed_rg88,
fetch_texel_2d_signed_rg88,
fetch_texel_3d_signed_rg88,
store_texel_signed_rg88
MESA_FORMAT_SIGNED_RG88_REV,
fetch_texel_1d_signed_rg88_rev,
fetch_texel_2d_signed_rg88_rev,
fetch_texel_3d_signed_rg88_rev,
store_texel_signed_rg88_rev
},
{
MESA_FORMAT_SIGNED_RGBX8888,
@ -724,18 +724,18 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
store_texel_signed_rgba8888_rev
},
{
MESA_FORMAT_SIGNED_R_16,
fetch_texel_1d_signed_r_16,
fetch_texel_2d_signed_r_16,
fetch_texel_3d_signed_r_16,
store_texel_signed_r_16
MESA_FORMAT_SIGNED_R16,
fetch_texel_1d_signed_r16,
fetch_texel_2d_signed_r16,
fetch_texel_3d_signed_r16,
store_texel_signed_r16
},
{
MESA_FORMAT_SIGNED_RG_16,
fetch_texel_1d_signed_rg_16,
fetch_texel_2d_signed_rg_16,
fetch_texel_3d_signed_rg_16,
store_texel_signed_rg_16
MESA_FORMAT_SIGNED_GR1616,
fetch_texel_1d_signed_rg1616,
fetch_texel_2d_signed_rg1616,
fetch_texel_3d_signed_rg1616,
store_texel_signed_rg1616
},
{
MESA_FORMAT_SIGNED_RGB_16,
@ -814,6 +814,62 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
NULL,
NULL
},
{
MESA_FORMAT_SIGNED_A8,
fetch_texel_1d_signed_a8,
fetch_texel_2d_signed_a8,
fetch_texel_3d_signed_a8,
store_texel_signed_a8
},
{
MESA_FORMAT_SIGNED_L8,
fetch_texel_1d_signed_l8,
fetch_texel_2d_signed_l8,
fetch_texel_3d_signed_l8,
store_texel_signed_l8
},
{
MESA_FORMAT_SIGNED_AL88,
fetch_texel_1d_signed_al88,
fetch_texel_2d_signed_al88,
fetch_texel_3d_signed_al88,
store_texel_signed_al88
},
{
MESA_FORMAT_SIGNED_I8,
fetch_texel_1d_signed_i8,
fetch_texel_2d_signed_i8,
fetch_texel_3d_signed_i8,
store_texel_signed_i8
},
{
MESA_FORMAT_SIGNED_A16,
fetch_texel_1d_signed_a16,
fetch_texel_2d_signed_a16,
fetch_texel_3d_signed_a16,
store_texel_signed_a16
},
{
MESA_FORMAT_SIGNED_L16,
fetch_texel_1d_signed_l16,
fetch_texel_2d_signed_l16,
fetch_texel_3d_signed_l16,
store_texel_signed_l16
},
{
MESA_FORMAT_SIGNED_AL1616,
fetch_texel_1d_signed_al1616,
fetch_texel_2d_signed_al1616,
fetch_texel_3d_signed_al1616,
store_texel_signed_al1616
},
{
MESA_FORMAT_SIGNED_I16,
fetch_texel_1d_signed_i16,
fetch_texel_2d_signed_i16,
fetch_texel_3d_signed_i16,
store_texel_signed_i16
},
};

View file

@ -1673,25 +1673,117 @@ static void store_texel_signed_r8(struct gl_texture_image *texImage,
#endif
/* MESA_FORMAT_SIGNED_RG88 ***********************************************/
/* MESA_FORMAT_SIGNED_A8 ***********************************************/
static void FETCH(signed_rg88)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
static void FETCH(signed_a8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
texel[RCOMP] = 0.0F;
texel[GCOMP] = 0.0F;
texel[BCOMP] = 0.0F;
texel[ACOMP] = BYTE_TO_FLOAT_TEX( s );
}
#if DIM == 3
static void store_texel_signed_a8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLbyte *rgba = (const GLbyte *) texel;
GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
*dst = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_SIGNED_L8 ***********************************************/
static void FETCH(signed_l8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = BYTE_TO_FLOAT_TEX( s );
texel[ACOMP] = 1.0F;
}
#if DIM == 3
static void store_texel_signed_l8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLbyte *rgba = (const GLbyte *) texel;
GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
*dst = rgba[RCOMP];
}
#endif
/* MESA_FORMAT_SIGNED_I8 ***********************************************/
static void FETCH(signed_i8)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] =
texel[ACOMP] = BYTE_TO_FLOAT_TEX( s );
}
#if DIM == 3
static void store_texel_signed_i8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLbyte *rgba = (const GLbyte *) texel;
GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
*dst = rgba[RCOMP];
}
#endif
/* MESA_FORMAT_SIGNED_RG88_REV ***********************************************/
static void FETCH(signed_rg88_rev)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
texel[BCOMP] = 0.0F;
texel[ACOMP] = 1.0F;
}
#if DIM == 3
static void store_texel_signed_rg88(struct gl_texture_image *texImage,
static void store_texel_signed_rg88_rev(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLbyte *rg = (const GLbyte *) texel;
GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
dst[0] = PACK_COLOR_88(rg[GCOMP], rg[RCOMP]);
}
#endif
/* MESA_FORMAT_SIGNED_AL88 ***********************************************/
static void FETCH(signed_al88)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
}
#if DIM == 3
static void store_texel_signed_al88(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLbyte *rg = (const GLbyte *) texel;
GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 2);
*dst = PACK_COLOR_88(rg[RCOMP], rg[GCOMP]);
GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
dst[0] = PACK_COLOR_88(rg[ACOMP], rg[RCOMP]);
}
#endif
@ -1763,11 +1855,11 @@ static void store_texel_signed_rgba8888_rev(struct gl_texture_image *texImage,
/* MESA_FORMAT_SIGNED_R_16 ***********************************************/
/* MESA_FORMAT_SIGNED_R16 ***********************************************/
static void
FETCH(signed_r_16)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel)
FETCH(signed_r16)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel)
{
const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
texel[RCOMP] = SHORT_TO_FLOAT_TEX( s );
@ -1778,8 +1870,8 @@ FETCH(signed_r_16)(const struct gl_texture_image *texImage,
#if DIM == 3
static void
store_texel_signed_r_16(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
store_texel_signed_r16(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLshort *rgba = (const GLshort *) texel;
GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
@ -1788,10 +1880,85 @@ store_texel_signed_r_16(struct gl_texture_image *texImage,
#endif
/* MESA_FORMAT_SIGNED_RG_16 ***********************************************/
/* MESA_FORMAT_SIGNED_A16 ***********************************************/
static void
FETCH(signed_rg_16)(const struct gl_texture_image *texImage,
FETCH(signed_a16)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel)
{
const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
texel[RCOMP] = 0.0F;
texel[GCOMP] = 0.0F;
texel[BCOMP] = 0.0F;
texel[ACOMP] = SHORT_TO_FLOAT_TEX( s );
}
#if DIM == 3
static void
store_texel_signed_a16(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLshort *rgba = (const GLshort *) texel;
GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
*dst = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_SIGNED_L16 ***********************************************/
static void
FETCH(signed_l16)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel)
{
const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = SHORT_TO_FLOAT_TEX( s );
texel[ACOMP] = 1.0F;
}
#if DIM == 3
static void
store_texel_signed_l16(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLshort *rgba = (const GLshort *) texel;
GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
*dst = rgba[RCOMP];
}
#endif
/* MESA_FORMAT_SIGNED_I16 ***********************************************/
static void
FETCH(signed_i16)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel)
{
const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] =
texel[ACOMP] = SHORT_TO_FLOAT_TEX( s );
}
#if DIM == 3
static void
store_texel_signed_i16(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLshort *rgba = (const GLshort *) texel;
GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
*dst = rgba[RCOMP];
}
#endif
/* MESA_FORMAT_SIGNED_RG1616 ***********************************************/
static void
FETCH(signed_rg1616)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel)
{
const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
@ -1803,7 +1970,7 @@ FETCH(signed_rg_16)(const struct gl_texture_image *texImage,
#if DIM == 3
static void
store_texel_signed_rg_16(struct gl_texture_image *texImage,
store_texel_signed_rg1616(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLshort *rgba = (const GLshort *) texel;
@ -1814,7 +1981,33 @@ store_texel_signed_rg_16(struct gl_texture_image *texImage,
#endif
/* MESA_FORMAT_SIGNED_RGBA_16 ***********************************************/
/* MESA_FORMAT_SIGNED_AL1616 ***********************************************/
static void
FETCH(signed_al1616)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel)
{
const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
texel[RCOMP] =
texel[GCOMP] =
texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
texel[ACOMP] = SHORT_TO_FLOAT_TEX( s[1] );
}
#if DIM == 3
static void
store_texel_signed_al1616(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLshort *rgba = (const GLshort *) texel;
GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
dst[0] = rgba[RCOMP];
dst[1] = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_SIGNED_RGB_16 ***********************************************/
static void
FETCH(signed_rgb_16)(const struct gl_texture_image *texImage,

View file

@ -2500,9 +2500,7 @@ _mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
ASSERT(dstFormat == MESA_FORMAT_SIGNED_R_16 ||
dstFormat == MESA_FORMAT_SIGNED_RG_16 ||
dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
if (!ctx->_ImageTransferState &&
@ -2545,16 +2543,29 @@ _mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLshort *dstRowS = (GLshort *) dstRow;
for (col = 0; col < srcWidth; col++) {
GLuint c;
for (c = 0; c < comps; c++) {
GLshort p;
UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
dstRowS[col * comps + c] = p;
if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) {
for (col = 0; col < srcWidth; col++) {
GLuint c;
for (c = 0; c < comps; c++) {
GLshort p;
UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
dstRowS[col * comps + c] = p;
}
}
dstRow += dstRowStride;
src += 4 * srcWidth;
} else {
for (col = 0; col < srcWidth; col++) {
GLuint c;
for (c = 0; c < comps; c++) {
GLshort p;
UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]);
dstRowS[col * comps + c] = p;
}
}
dstRow += dstRowStride;
src += 3 * srcWidth;
}
dstRow += dstRowStride;
src += 4 * srcWidth;
}
}
free((void *) tempImage);
@ -2889,19 +2900,33 @@ _mesa_texstore_dudv8(TEXSTORE_PARAMS)
/**
* Store a texture in MESA_FORMAT_SIGNED_R8 format.
* Store a texture in a signed normalized 8-bit format.
*/
static GLboolean
_mesa_texstore_signed_r8(TEXSTORE_PARAMS)
_mesa_texstore_snorm8(TEXSTORE_PARAMS)
{
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
ASSERT(dstFormat == MESA_FORMAT_SIGNED_R8);
ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 ||
dstFormat == MESA_FORMAT_SIGNED_L8 ||
dstFormat == MESA_FORMAT_SIGNED_I8 ||
dstFormat == MESA_FORMAT_SIGNED_R8);
ASSERT(texelBytes == 1);
/* XXX look at adding optimized paths */
{
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_BYTE) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
baseInternalFormat,
@ -2910,21 +2935,21 @@ _mesa_texstore_signed_r8(TEXSTORE_PARAMS)
srcFormat, srcType, srcAddr,
srcPacking,
ctx->_ImageTransferState);
const GLfloat *srcRow = tempImage;
const GLfloat *src = tempImage;
GLint img, row, col;
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
GLbyte *dstRow = (GLbyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLubyte *dstB = (GLubyte *) dstRow;
for (col = 0; col < srcWidth; col++) {
dstB[col] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]);
}
dstRow += dstRowStride;
src += srcWidth;
}
}
free((void *) tempImage);
@ -2934,19 +2959,33 @@ _mesa_texstore_signed_r8(TEXSTORE_PARAMS)
/**
* Store a texture in MESA_FORMAT_SIGNED_RG88 format.
* Store a texture in a signed normalized two-channel 16-bit format.
*/
static GLboolean
_mesa_texstore_signed_rg88(TEXSTORE_PARAMS)
_mesa_texstore_snorm88(TEXSTORE_PARAMS)
{
const GLboolean littleEndian = _mesa_little_endian();
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
ASSERT(dstFormat == MESA_FORMAT_SIGNED_RG88);
ASSERT(texelBytes == 1);
ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 ||
dstFormat == MESA_FORMAT_SIGNED_RG88_REV);
ASSERT(texelBytes == 2);
/* XXX look at adding optimized paths */
{
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_BYTE &&
littleEndian) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
baseInternalFormat,
@ -2955,20 +2994,22 @@ _mesa_texstore_signed_rg88(TEXSTORE_PARAMS)
srcFormat, srcType, srcAddr,
srcPacking,
ctx->_ImageTransferState);
const GLfloat *srcRow = tempImage;
const GLfloat *src = tempImage;
GLint img, row, col;
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
GLbyte *dstRow = (GLbyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLushort *dstUS = (GLushort *) dstRow;
GLbyte *dst = dstRow;
for (col = 0; col < srcWidth; col++) {
dstUS[col] = PACK_COLOR_88(FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[GCOMP]));
dst[0] = FLOAT_TO_BYTE_TEX(src[0]);
dst[1] = FLOAT_TO_BYTE_TEX(src[1]);
src += 2;
dst += 2;
}
dstRow += dstRowStride;
}
@ -2978,6 +3019,132 @@ _mesa_texstore_signed_rg88(TEXSTORE_PARAMS)
return GL_TRUE;
}
/* Texstore for signed R16, A16, L16, I16. */
static GLboolean
_mesa_texstore_snorm16(TEXSTORE_PARAMS)
{
const GLboolean littleEndian = _mesa_little_endian();
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 ||
dstFormat == MESA_FORMAT_SIGNED_A16 ||
dstFormat == MESA_FORMAT_SIGNED_L16 ||
dstFormat == MESA_FORMAT_SIGNED_I16);
ASSERT(texelBytes == 2);
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_SHORT &&
littleEndian) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
baseInternalFormat,
baseFormat,
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr,
srcPacking,
ctx->_ImageTransferState);
const GLfloat *src = tempImage;
GLint img, row, col;
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLshort *dstUS = (GLshort *) dstRow;
for (col = 0; col < srcWidth; col++) {
GLushort r;
UNCLAMPED_FLOAT_TO_SHORT(r, src[0]);
dstUS[col] = r;
src += 1;
}
dstRow += dstRowStride;
}
}
free((void *) tempImage);
}
return GL_TRUE;
}
/**
* Do texstore for 2-channel, 16-bit/channel, signed normalized formats.
*/
static GLboolean
_mesa_texstore_snorm1616(TEXSTORE_PARAMS)
{
const GLboolean littleEndian = _mesa_little_endian();
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
dstFormat == MESA_FORMAT_SIGNED_GR1616);
ASSERT(texelBytes == 4);
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_SHORT &&
littleEndian) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
baseInternalFormat,
baseFormat,
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr,
srcPacking,
ctx->_ImageTransferState);
const GLfloat *src = tempImage;
GLint img, row, col;
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLshort *dst = (GLshort *) dstRow;
for (col = 0; col < srcWidth; col++) {
GLushort l, a;
UNCLAMPED_FLOAT_TO_SHORT(l, src[0]);
UNCLAMPED_FLOAT_TO_SHORT(a, src[1]);
dst[0] = l;
dst[1] = a;
src += 2;
dst += 2;
}
dstRow += dstRowStride;
}
}
free((void *) tempImage);
}
return GL_TRUE;
}
/**
* Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
@ -3005,18 +3172,19 @@ _mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
GLbyte *dstRow = (GLbyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLuint *dstUI = (GLuint *) dstRow;
GLbyte *dst = dstRow;
for (col = 0; col < srcWidth; col++) {
dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
0xff );
srcRow += 4;
dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
dst[0] = 0xff;
srcRow += 3;
dst += 4;
}
dstRow += dstRowStride;
}
@ -3071,39 +3239,6 @@ _mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else if (!ctx->_ImageTransferState &&
(srcType == GL_BYTE) &&
can_swizzle(baseInternalFormat) &&
can_swizzle(srcFormat)) {
GLubyte dstmap[4];
/* dstmap - how to swizzle from RGBA to dst format:
*/
if ((littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888) ||
(!littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV)) {
dstmap[3] = 0;
dstmap[2] = 1;
dstmap[1] = 2;
dstmap[0] = 3;
}
else {
dstmap[3] = 3;
dstmap[2] = 2;
dstmap[1] = 1;
dstmap[0] = 0;
}
_mesa_swizzle_ubyte_image(ctx, dims,
srcFormat,
srcType,
baseInternalFormat,
dstmap, 4,
dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride, dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcAddr,
srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
@ -3118,28 +3253,30 @@ _mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
GLbyte *dstRow = (GLbyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLuint *dstUI = (GLuint *) dstRow;
GLbyte *dst = dstRow;
if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
for (col = 0; col < srcWidth; col++) {
dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) );
dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
srcRow += 4;
dst += 4;
}
}
else {
for (col = 0; col < srcWidth; col++) {
dstUI[col] = PACK_COLOR_8888_REV( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) );
dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
srcRow += 4;
dst += 4;
}
}
dstRow += dstRowStride;
@ -4119,15 +4256,15 @@ texstore_funcs[MESA_FORMAT_COUNT] =
{ MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 },
{ MESA_FORMAT_SIGNED_R8, _mesa_texstore_signed_r8 },
{ MESA_FORMAT_SIGNED_RG88, _mesa_texstore_signed_rg88 },
{ MESA_FORMAT_SIGNED_R8, _mesa_texstore_snorm8 },
{ MESA_FORMAT_SIGNED_RG88_REV, _mesa_texstore_snorm88 },
{ MESA_FORMAT_SIGNED_RGBX8888, _mesa_texstore_signed_rgbx8888 },
{ MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 },
{ MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 },
{ MESA_FORMAT_SIGNED_R_16, _mesa_texstore_signed_rgba_16 },
{ MESA_FORMAT_SIGNED_RG_16, _mesa_texstore_signed_rgba_16 },
{ MESA_FORMAT_SIGNED_R16, _mesa_texstore_snorm16 },
{ MESA_FORMAT_SIGNED_GR1616, _mesa_texstore_snorm1616 },
{ MESA_FORMAT_SIGNED_RGB_16, _mesa_texstore_signed_rgba_16 },
{ MESA_FORMAT_SIGNED_RGBA_16, _mesa_texstore_signed_rgba_16 },
{ MESA_FORMAT_RGBA_16, _mesa_texstore_rgba_16 },
@ -4142,7 +4279,17 @@ texstore_funcs[MESA_FORMAT_COUNT] =
{ MESA_FORMAT_L_LATC1, _mesa_texstore_red_rgtc1 },
{ MESA_FORMAT_SIGNED_L_LATC1, _mesa_texstore_signed_red_rgtc1 },
{ MESA_FORMAT_LA_LATC2, _mesa_texstore_rg_rgtc2 },
{ MESA_FORMAT_SIGNED_LA_LATC2, _mesa_texstore_signed_rg_rgtc2 }
{ MESA_FORMAT_SIGNED_LA_LATC2, _mesa_texstore_signed_rg_rgtc2 },
{ MESA_FORMAT_SIGNED_A8, _mesa_texstore_snorm8 },
{ MESA_FORMAT_SIGNED_L8, _mesa_texstore_snorm8 },
{ MESA_FORMAT_SIGNED_AL88, _mesa_texstore_snorm88 },
{ MESA_FORMAT_SIGNED_I8, _mesa_texstore_snorm8 },
{ MESA_FORMAT_SIGNED_A16, _mesa_texstore_snorm16 },
{ MESA_FORMAT_SIGNED_L16, _mesa_texstore_snorm16 },
{ MESA_FORMAT_SIGNED_AL1616, _mesa_texstore_snorm1616 },
{ MESA_FORMAT_SIGNED_I16, _mesa_texstore_snorm16 },
};