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);

Attachment: 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

Reply via email to