diff options
Diffstat (limited to 'src/mesa/main/texcompress_s3tc.c')
| -rw-r--r-- | src/mesa/main/texcompress_s3tc.c | 184 | 
1 files changed, 169 insertions, 15 deletions
| diff --git a/src/mesa/main/texcompress_s3tc.c b/src/mesa/main/texcompress_s3tc.c index a19c161b2c..d17e18da6b 100644 --- a/src/mesa/main/texcompress_s3tc.c +++ b/src/mesa/main/texcompress_s3tc.c @@ -3,6 +3,7 @@   * Version:  6.5.3   *   * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved. + * Copyright (c) 2008 VMware, Inc.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -53,6 +54,34 @@  #define DXTN_LIBNAME "libtxc_dxtn.so"  #endif +#if FEATURE_EXT_texture_sRGB +/** + * Convert an 8-bit sRGB value from non-linear space to a + * linear RGB value in [0, 1]. + * Implemented with a 256-entry lookup table. + */ +static INLINE GLfloat +nonlinear_to_linear(GLubyte cs8) +{ +   static GLfloat table[256]; +   static GLboolean tableReady = GL_FALSE; +   if (!tableReady) { +      /* compute lookup table now */ +      GLuint i; +      for (i = 0; i < 256; i++) { +         const GLfloat cs = UBYTE_TO_FLOAT(i); +         if (cs <= 0.04045) { +            table[i] = cs / 12.92f; +         } +         else { +            table[i] = (GLfloat) _mesa_pow((cs + 0.055) / 1.055, 2.4); +         } +      } +      tableReady = GL_TRUE; +   } +   return table[cs8]; +} +#endif /* FEATURE_EXT_texture_sRGB */  typedef void (*dxtFetchTexelFuncExt)( GLint srcRowstride, GLubyte *pixdata, GLint col, GLint row, GLvoid *texelOut ); @@ -483,6 +512,59 @@ fetch_texel_2d_f_rgba_dxt5( const struct gl_texture_image *texImage,     texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]);  } +#if FEATURE_EXT_texture_sRGB +static void +fetch_texel_2d_f_srgb_dxt1( const struct gl_texture_image *texImage, +                            GLint i, GLint j, GLint k, GLfloat *texel ) +{ +   /* just sample as GLchan and convert to float here */ +   GLchan rgba[4]; +   fetch_texel_2d_rgb_dxt1(texImage, i, j, k, rgba); +   texel[RCOMP] = nonlinear_to_linear(rgba[RCOMP]); +   texel[GCOMP] = nonlinear_to_linear(rgba[GCOMP]); +   texel[BCOMP] = nonlinear_to_linear(rgba[BCOMP]); +   texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]); +} + +static void +fetch_texel_2d_f_srgba_dxt1( const struct gl_texture_image *texImage, +                             GLint i, GLint j, GLint k, GLfloat *texel ) +{ +   /* just sample as GLchan and convert to float here */ +   GLchan rgba[4]; +   fetch_texel_2d_rgba_dxt1(texImage, i, j, k, rgba); +   texel[RCOMP] = nonlinear_to_linear(rgba[RCOMP]); +   texel[GCOMP] = nonlinear_to_linear(rgba[GCOMP]); +   texel[BCOMP] = nonlinear_to_linear(rgba[BCOMP]); +   texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]); +} + +static void +fetch_texel_2d_f_srgba_dxt3( const struct gl_texture_image *texImage, +                             GLint i, GLint j, GLint k, GLfloat *texel ) +{ +   /* just sample as GLchan and convert to float here */ +   GLchan rgba[4]; +   fetch_texel_2d_rgba_dxt3(texImage, i, j, k, rgba); +   texel[RCOMP] = nonlinear_to_linear(rgba[RCOMP]); +   texel[GCOMP] = nonlinear_to_linear(rgba[GCOMP]); +   texel[BCOMP] = nonlinear_to_linear(rgba[BCOMP]); +   texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]); +} + +static void +fetch_texel_2d_f_srgba_dxt5( const struct gl_texture_image *texImage, +                             GLint i, GLint j, GLint k, GLfloat *texel ) +{ +   /* just sample as GLchan and convert to float here */ +   GLchan rgba[4]; +   fetch_texel_2d_rgba_dxt5(texImage, i, j, k, rgba); +   texel[RCOMP] = nonlinear_to_linear(rgba[RCOMP]); +   texel[GCOMP] = nonlinear_to_linear(rgba[GCOMP]); +   texel[BCOMP] = nonlinear_to_linear(rgba[BCOMP]); +   texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]); +} +#endif  const struct gl_texture_format _mesa_texformat_rgb_dxt1 = {     MESA_FORMAT_RGB_DXT1,		/* MesaFormat */ @@ -508,6 +590,78 @@ const struct gl_texture_format _mesa_texformat_rgb_dxt1 = {     NULL					/* StoreTexel */  }; +const struct gl_texture_format _mesa_texformat_rgba_dxt1 = { +   MESA_FORMAT_RGBA_DXT1,		/* MesaFormat */ +   GL_RGBA,				/* BaseFormat */ +   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */ +   4, /*approx*/			/* RedBits */ +   4, /*approx*/			/* GreenBits */ +   4, /*approx*/			/* BlueBits */ +   1, /*approx*/			/* AlphaBits */ +   0,					/* LuminanceBits */ +   0,					/* IntensityBits */ +   0,					/* IndexBits */ +   0,					/* DepthBits */ +   0,					/* StencilBits */ +   0,					/* TexelBytes */ +   texstore_rgba_dxt1,			/* StoreTexImageFunc */ +   NULL, /*impossible*/ 		/* FetchTexel1D */ +   fetch_texel_2d_rgba_dxt1, 		/* FetchTexel2D */ +   NULL, /*impossible*/ 		/* FetchTexel3D */ +   NULL, /*impossible*/ 		/* FetchTexel1Df */ +   fetch_texel_2d_f_rgba_dxt1, 		/* FetchTexel2Df */ +   NULL, /*impossible*/ 		/* FetchTexel3Df */ +   NULL					/* StoreTexel */ +}; + +const struct gl_texture_format _mesa_texformat_rgba_dxt3 = { +   MESA_FORMAT_RGBA_DXT3,		/* MesaFormat */ +   GL_RGBA,				/* BaseFormat */ +   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */ +   4, /*approx*/			/* RedBits */ +   4, /*approx*/			/* GreenBits */ +   4, /*approx*/			/* BlueBits */ +   4, /*approx*/			/* AlphaBits */ +   0,					/* LuminanceBits */ +   0,					/* IntensityBits */ +   0,					/* IndexBits */ +   0,					/* DepthBits */ +   0,					/* StencilBits */ +   0,					/* TexelBytes */ +   texstore_rgba_dxt3,			/* StoreTexImageFunc */ +   NULL, /*impossible*/ 		/* FetchTexel1D */ +   fetch_texel_2d_rgba_dxt3, 		/* FetchTexel2D */ +   NULL, /*impossible*/ 		/* FetchTexel3D */ +   NULL, /*impossible*/ 		/* FetchTexel1Df */ +   fetch_texel_2d_f_rgba_dxt3, 		/* FetchTexel2Df */ +   NULL, /*impossible*/ 		/* FetchTexel3Df */ +   NULL					/* StoreTexel */ +}; + +const struct gl_texture_format _mesa_texformat_rgba_dxt5 = { +   MESA_FORMAT_RGBA_DXT5,		/* MesaFormat */ +   GL_RGBA,				/* BaseFormat */ +   GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */ +   4,/*approx*/				/* RedBits */ +   4,/*approx*/				/* GreenBits */ +   4,/*approx*/				/* BlueBits */ +   4,/*approx*/				/* AlphaBits */ +   0,					/* LuminanceBits */ +   0,					/* IntensityBits */ +   0,					/* IndexBits */ +   0,					/* DepthBits */ +   0,					/* StencilBits */ +   0,					/* TexelBytes */ +   texstore_rgba_dxt5,			/* StoreTexImageFunc */ +   NULL, /*impossible*/ 		/* FetchTexel1D */ +   fetch_texel_2d_rgba_dxt5, 		/* FetchTexel2D */ +   NULL, /*impossible*/ 		/* FetchTexel3D */ +   NULL, /*impossible*/ 		/* FetchTexel1Df */ +   fetch_texel_2d_f_rgba_dxt5, 		/* FetchTexel2Df */ +   NULL, /*impossible*/ 		/* FetchTexel3Df */ +   NULL					/* StoreTexel */ +}; +  #if FEATURE_EXT_texture_sRGB  const struct gl_texture_format _mesa_texformat_srgb_dxt1 = {     MESA_FORMAT_SRGB_DXT1,		/* MesaFormat */ @@ -525,17 +679,16 @@ const struct gl_texture_format _mesa_texformat_srgb_dxt1 = {     0,					/* TexelBytes */     texstore_rgb_dxt1,			/* StoreTexImageFunc */     NULL, /*impossible*/ 		/* FetchTexel1D */ -   fetch_texel_2d_rgb_dxt1, 		/* FetchTexel2D */ +   NULL, 				/* FetchTexel2D */     NULL, /*impossible*/ 		/* FetchTexel3D */     NULL, /*impossible*/ 		/* FetchTexel1Df */ -   fetch_texel_2d_f_rgb_dxt1, 		/* FetchTexel2Df */ +   fetch_texel_2d_f_srgb_dxt1, 		/* FetchTexel2Df */     NULL, /*impossible*/ 		/* FetchTexel3Df */     NULL					/* StoreTexel */  }; -#endif -const struct gl_texture_format _mesa_texformat_rgba_dxt1 = { -   MESA_FORMAT_RGBA_DXT1,		/* MesaFormat */ +const struct gl_texture_format _mesa_texformat_srgba_dxt1 = { +   MESA_FORMAT_SRGBA_DXT1,		/* MesaFormat */     GL_RGBA,				/* BaseFormat */     GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */     4, /*approx*/			/* RedBits */ @@ -550,16 +703,16 @@ const struct gl_texture_format _mesa_texformat_rgba_dxt1 = {     0,					/* TexelBytes */     texstore_rgba_dxt1,			/* StoreTexImageFunc */     NULL, /*impossible*/ 		/* FetchTexel1D */ -   fetch_texel_2d_rgba_dxt1, 		/* FetchTexel2D */ +   NULL, 				/* FetchTexel2D */     NULL, /*impossible*/ 		/* FetchTexel3D */     NULL, /*impossible*/ 		/* FetchTexel1Df */ -   fetch_texel_2d_f_rgba_dxt1, 		/* FetchTexel2Df */ +   fetch_texel_2d_f_srgba_dxt1, 	/* FetchTexel2Df */     NULL, /*impossible*/ 		/* FetchTexel3Df */     NULL					/* StoreTexel */  }; -const struct gl_texture_format _mesa_texformat_rgba_dxt3 = { -   MESA_FORMAT_RGBA_DXT3,		/* MesaFormat */ +const struct gl_texture_format _mesa_texformat_srgba_dxt3 = { +   MESA_FORMAT_SRGBA_DXT3,		/* MesaFormat */     GL_RGBA,				/* BaseFormat */     GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */     4, /*approx*/			/* RedBits */ @@ -574,16 +727,16 @@ const struct gl_texture_format _mesa_texformat_rgba_dxt3 = {     0,					/* TexelBytes */     texstore_rgba_dxt3,			/* StoreTexImageFunc */     NULL, /*impossible*/ 		/* FetchTexel1D */ -   fetch_texel_2d_rgba_dxt3, 		/* FetchTexel2D */ +   NULL, 				/* FetchTexel2D */     NULL, /*impossible*/ 		/* FetchTexel3D */     NULL, /*impossible*/ 		/* FetchTexel1Df */ -   fetch_texel_2d_f_rgba_dxt3, 		/* FetchTexel2Df */ +   fetch_texel_2d_f_srgba_dxt3, 	/* FetchTexel2Df */     NULL, /*impossible*/ 		/* FetchTexel3Df */     NULL					/* StoreTexel */  }; -const struct gl_texture_format _mesa_texformat_rgba_dxt5 = { -   MESA_FORMAT_RGBA_DXT5,		/* MesaFormat */ +const struct gl_texture_format _mesa_texformat_srgba_dxt5 = { +   MESA_FORMAT_SRGBA_DXT5,		/* MesaFormat */     GL_RGBA,				/* BaseFormat */     GL_UNSIGNED_NORMALIZED_ARB,		/* DataType */     4,/*approx*/				/* RedBits */ @@ -598,10 +751,11 @@ const struct gl_texture_format _mesa_texformat_rgba_dxt5 = {     0,					/* TexelBytes */     texstore_rgba_dxt5,			/* StoreTexImageFunc */     NULL, /*impossible*/ 		/* FetchTexel1D */ -   fetch_texel_2d_rgba_dxt5, 		/* FetchTexel2D */ +   NULL, 				/* FetchTexel2D */     NULL, /*impossible*/ 		/* FetchTexel3D */     NULL, /*impossible*/ 		/* FetchTexel1Df */ -   fetch_texel_2d_f_rgba_dxt5, 		/* FetchTexel2Df */ +   fetch_texel_2d_f_srgba_dxt5, 	/* FetchTexel2Df */     NULL, /*impossible*/ 		/* FetchTexel3Df */     NULL					/* StoreTexel */  }; +#endif | 
