Add RGBA4444 and RGBA5551 texture formats.
This commit is contained in:
@@ -195,6 +195,10 @@ do { \
|
||||
#define PACK_COLOR_565_REV( X, Y, Z ) \
|
||||
(((X) & 0xf8) | ((Y) & 0xe0) >> 5 | (((Y) & 0x1c) << 11) | (((Z) & 0xf8) << 5))
|
||||
|
||||
#define PACK_COLOR_5551( R, G, B, A ) \
|
||||
((((R) & 0xf8) << 8) | (((G) & 0xf8) << 3) | (((B) & 0xf8) >> 2) | \
|
||||
((A) ? 1 : 0))
|
||||
|
||||
#define PACK_COLOR_1555( A, B, G, R ) \
|
||||
((((B) & 0xf8) << 7) | (((G) & 0xf8) << 2) | (((R) & 0xf8) >> 3) | \
|
||||
((A) ? 0x8000 : 0))
|
||||
|
||||
@@ -871,6 +871,30 @@ const struct gl_texture_format _mesa_texformat_rgb565_rev = {
|
||||
store_texel_rgb565_rev /* StoreTexel */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_rgba4444 = {
|
||||
MESA_FORMAT_RGBA4444, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
4, /* RedBits */
|
||||
4, /* GreenBits */
|
||||
4, /* BlueBits */
|
||||
4, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
0, /* StencilBits */
|
||||
2, /* TexelBytes */
|
||||
_mesa_texstore_rgba4444, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_rgba4444, /* FetchTexel1D */
|
||||
fetch_texel_2d_rgba4444, /* FetchTexel2D */
|
||||
fetch_texel_3d_rgba4444, /* FetchTexel3D */
|
||||
NULL, /* FetchTexel1Df */
|
||||
NULL, /* FetchTexel2Df */
|
||||
NULL, /* FetchTexel3Df */
|
||||
store_texel_rgba4444 /* StoreTexel */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_argb4444 = {
|
||||
MESA_FORMAT_ARGB4444, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
@@ -919,6 +943,30 @@ const struct gl_texture_format _mesa_texformat_argb4444_rev = {
|
||||
store_texel_argb4444_rev /* StoreTexel */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_rgba5551 = {
|
||||
MESA_FORMAT_RGBA5551, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
5, /* RedBits */
|
||||
5, /* GreenBits */
|
||||
5, /* BlueBits */
|
||||
1, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
0, /* StencilBits */
|
||||
2, /* TexelBytes */
|
||||
_mesa_texstore_rgba5551, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_rgba5551, /* FetchTexel1D */
|
||||
fetch_texel_2d_rgba5551, /* FetchTexel2D */
|
||||
fetch_texel_3d_rgba5551, /* FetchTexel3D */
|
||||
NULL, /* FetchTexel1Df */
|
||||
NULL, /* FetchTexel2Df */
|
||||
NULL, /* FetchTexel3Df */
|
||||
store_texel_rgba5551 /* StoreTexel */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_argb1555 = {
|
||||
MESA_FORMAT_ARGB1555, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
|
||||
@@ -70,8 +70,10 @@ enum _format {
|
||||
MESA_FORMAT_BGR888, /* BBBB BBBB GGGG GGGG RRRR RRRR */
|
||||
MESA_FORMAT_RGB565, /* RRRR RGGG GGGB BBBB */
|
||||
MESA_FORMAT_RGB565_REV, /* GGGB BBBB RRRR RGGG */
|
||||
MESA_FORMAT_RGBA4444, /* RRRR GGGG BBBB AAAA */
|
||||
MESA_FORMAT_ARGB4444, /* AAAA RRRR GGGG BBBB */
|
||||
MESA_FORMAT_ARGB4444_REV, /* GGGG BBBB AAAA RRRR */
|
||||
MESA_FORMAT_RGBA5551, /* RRRR RGGG GGBB BBBA */
|
||||
MESA_FORMAT_ARGB1555, /* ARRR RRGG GGGB BBBB */
|
||||
MESA_FORMAT_ARGB1555_REV, /* GGGB BBBB ARRR RRGG */
|
||||
MESA_FORMAT_AL88, /* AAAA AAAA LLLL LLLL */
|
||||
@@ -200,10 +202,12 @@ extern const struct gl_texture_format _mesa_texformat_rgb888;
|
||||
extern const struct gl_texture_format _mesa_texformat_bgr888;
|
||||
extern const struct gl_texture_format _mesa_texformat_rgb565;
|
||||
extern const struct gl_texture_format _mesa_texformat_rgb565_rev;
|
||||
extern const struct gl_texture_format _mesa_texformat_rgba4444;
|
||||
extern const struct gl_texture_format _mesa_texformat_argb4444;
|
||||
extern const struct gl_texture_format _mesa_texformat_argb4444_rev;
|
||||
extern const struct gl_texture_format _mesa_texformat_argb1555;
|
||||
extern const struct gl_texture_format _mesa_texformat_argb1555_rev;
|
||||
extern const struct gl_texture_format _mesa_texformat_rgba5551;
|
||||
extern const struct gl_texture_format _mesa_texformat_al88;
|
||||
extern const struct gl_texture_format _mesa_texformat_al88_rev;
|
||||
extern const struct gl_texture_format _mesa_texformat_rgb332;
|
||||
|
||||
@@ -803,6 +803,30 @@ static void store_texel_rgb565_rev(struct gl_texture_image *texImage,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* MESA_FORMAT_RGBA4444 ******************************************************/
|
||||
|
||||
/* Fetch texel from 1D, 2D or 3D argb444 texture, return 4 GLchans */
|
||||
static void FETCH(rgba4444)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) | ((s >> 8) & 0xf0) );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) | ((s >> 4) & 0xf0) );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) | ((s ) & 0xf0) );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) | ((s << 4) & 0xf0) );
|
||||
}
|
||||
|
||||
#if DIM == 3
|
||||
static void store_texel_rgba4444(struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, const void *texel)
|
||||
{
|
||||
const GLubyte *rgba = (const GLubyte *) texel;
|
||||
GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
|
||||
*dst = PACK_COLOR_4444(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* MESA_FORMAT_ARGB4444 ******************************************************/
|
||||
|
||||
@@ -852,6 +876,29 @@ static void store_texel_argb4444_rev(struct gl_texture_image *texImage,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* MESA_FORMAT_RGBA5551 ******************************************************/
|
||||
|
||||
/* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
|
||||
static void FETCH(rgba5551)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) | ((s >> 13) & 0x7) );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xf8) | ((s >> 8) & 0x7) );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s << 2) & 0xf8) | ((s >> 3) & 0x7) );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( ((s) & 0x01) ? 255 : 0);
|
||||
}
|
||||
|
||||
#if DIM == 3
|
||||
static void store_texel_rgba5551(struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, const void *texel)
|
||||
{
|
||||
const GLubyte *rgba = (const GLubyte *) texel;
|
||||
GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
|
||||
*dst = PACK_COLOR_5551(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* MESA_FORMAT_ARGB1555 ******************************************************/
|
||||
|
||||
|
||||
@@ -1898,6 +1898,60 @@ _mesa_texstore_bgr888(TEXSTORE_PARAMS)
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_rgba4444(TEXSTORE_PARAMS)
|
||||
{
|
||||
ASSERT(dstFormat == &_mesa_texformat_rgba4444);
|
||||
ASSERT(dstFormat->TexelBytes == 2);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
dstFormat == &_mesa_texformat_rgba4444 &&
|
||||
baseInternalFormat == GL_RGBA &&
|
||||
srcFormat == GL_RGBA &&
|
||||
srcType == GL_UNSIGNED_SHORT_4_4_4_4){
|
||||
/* 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 GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src = tempImage;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = (GLubyte *) dstAddr
|
||||
+ dstImageOffsets[dstZoffset + img] * dstFormat->TexelBytes
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLushort *dstUS = (GLushort *) dstRow;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[RCOMP]),
|
||||
CHAN_TO_UBYTE(src[GCOMP]),
|
||||
CHAN_TO_UBYTE(src[BCOMP]),
|
||||
CHAN_TO_UBYTE(src[ACOMP]) );
|
||||
src += 4;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_argb4444(TEXSTORE_PARAMS)
|
||||
@@ -1966,7 +2020,60 @@ _mesa_texstore_argb4444(TEXSTORE_PARAMS)
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
|
||||
{
|
||||
ASSERT(dstFormat == &_mesa_texformat_rgba5551);
|
||||
ASSERT(dstFormat->TexelBytes == 2);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
dstFormat == &_mesa_texformat_rgba5551 &&
|
||||
baseInternalFormat == GL_RGBA &&
|
||||
srcFormat == GL_RGBA &&
|
||||
srcType == GL_UNSIGNED_SHORT_5_5_5_1) {
|
||||
/* 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 GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src =tempImage;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = (GLubyte *) dstAddr
|
||||
+ dstImageOffsets[dstZoffset + img] * dstFormat->TexelBytes
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLushort *dstUS = (GLushort *) dstRow;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUS[col] = PACK_COLOR_5551( CHAN_TO_UBYTE(src[RCOMP]),
|
||||
CHAN_TO_UBYTE(src[GCOMP]),
|
||||
CHAN_TO_UBYTE(src[BCOMP]),
|
||||
CHAN_TO_UBYTE(src[ACOMP]) );
|
||||
src += 4;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_argb1555(TEXSTORE_PARAMS)
|
||||
|
||||
@@ -46,8 +46,10 @@ extern GLboolean _mesa_texstore_rgb888(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_bgr888(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgb565(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgb565_rev(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgba4444(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_argb4444(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_argb4444_rev(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgba5551(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_argb1555(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_argb1555_rev(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_al88(TEXSTORE_PARAMS);
|
||||
|
||||
Reference in New Issue
Block a user