Other than the issue Brian spotted, these patches look good to me. Whenever I look at this code, I feel like we're doing it wrong. It's such a giant pile of source. It seems like there should be a better way...I don't know what that way is, but I'm sure it's out there!
On Mon, 2009-01-19 at 21:50 +0100, [email protected] wrote: > From: Thomas Hellstrom <thellstrom-at-vmware-dot-com> > > --- > src/mesa/main/colormac.h | 4 ++ > src/mesa/main/texformat.c | 48 ++++++++++++++++++ > src/mesa/main/texformat.h | 4 ++ > src/mesa/main/texformat_tmp.h | 47 ++++++++++++++++++ > src/mesa/main/texstore.c | 107 > +++++++++++++++++++++++++++++++++++++++++ > src/mesa/main/texstore.h | 2 + > 6 files changed, 212 insertions(+), 0 deletions(-) > > diff --git a/src/mesa/main/colormac.h b/src/mesa/main/colormac.h > index a34bd2e..74692e9 100644 > --- a/src/mesa/main/colormac.h > +++ b/src/mesa/main/colormac.h > @@ -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)) > diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c > index 1dd7bdd..0872584 100644 > --- a/src/mesa/main/texformat.c > +++ b/src/mesa/main/texformat.c > @@ -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 */ > diff --git a/src/mesa/main/texformat.h b/src/mesa/main/texformat.h > index 18900fe..b1604d4 100644 > --- a/src/mesa/main/texformat.h > +++ b/src/mesa/main/texformat.h > @@ -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; > diff --git a/src/mesa/main/texformat_tmp.h b/src/mesa/main/texformat_tmp.h > index 7499ba7..197593d 100644 > --- a/src/mesa/main/texformat_tmp.h > +++ b/src/mesa/main/texformat_tmp.h > @@ -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 > ******************************************************/ > > diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c > index 4b2b129..ddaa2ba 100644 > --- a/src/mesa/main/texstore.c > +++ b/src/mesa/main/texstore.c > @@ -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[ACOMP]), > + CHAN_TO_UBYTE(src[RCOMP]), > + CHAN_TO_UBYTE(src[GCOMP]), > + CHAN_TO_UBYTE(src[BCOMP]) ); > + src += 4; > + } > + dstRow += dstRowStride; > + } > + } > + _mesa_free((void *) tempImage); > + } > + return GL_TRUE; > +} > > GLboolean > _mesa_texstore_argb1555(TEXSTORE_PARAMS) > diff --git a/src/mesa/main/texstore.h b/src/mesa/main/texstore.h > index c9edf14..951d0a1 100644 > --- a/src/mesa/main/texstore.h > +++ b/src/mesa/main/texstore.h > @@ -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);
signature.asc
Description: This is a digitally signed message part
------------------------------------------------------------------------------ This SF.net email is sponsored by: SourcForge Community SourceForge wants to tell your story. http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________ Mesa3d-dev mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mesa3d-dev
