mesa: fixes for srgb, new srgb formats
add some more srgb texture formats, including compressed ones various fixes relating to srgb formats issues: _mesa_get_teximage is completely broken for srgb textures, both for non-compressed ones (swizzling) and compressed ones (shouldn't do standard-to-linear conversion) texelFetch function may be broken for little or big endian (or both...)
This commit is contained in:
@@ -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"),
|
||||
@@ -56,6 +57,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 );
|
||||
|
||||
@@ -552,6 +581,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 */
|
||||
@@ -577,32 +659,6 @@ const struct gl_texture_format _mesa_texformat_rgb_dxt1 = {
|
||||
NULL /* StoreTexel */
|
||||
};
|
||||
|
||||
#if FEATURE_EXT_texture_sRGB
|
||||
const struct gl_texture_format _mesa_texformat_srgb_dxt1 = {
|
||||
MESA_FORMAT_SRGB_DXT1, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
4, /*approx*/ /* RedBits */
|
||||
4, /*approx*/ /* GreenBits */
|
||||
4, /*approx*/ /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
0, /* StencilBits */
|
||||
0, /* TexelBytes */
|
||||
texstore_rgb_dxt1, /* StoreTexImageFunc */
|
||||
NULL, /*impossible*/ /* FetchTexel1D */
|
||||
fetch_texel_2d_rgb_dxt1, /* FetchTexel2D */
|
||||
NULL, /*impossible*/ /* FetchTexel3D */
|
||||
NULL, /*impossible*/ /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_rgb_dxt1, /* FetchTexel2Df */
|
||||
NULL, /*impossible*/ /* FetchTexel3Df */
|
||||
NULL /* StoreTexel */
|
||||
};
|
||||
#endif
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_rgba_dxt1 = {
|
||||
MESA_FORMAT_RGBA_DXT1, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
@@ -674,3 +730,101 @@ const struct gl_texture_format _mesa_texformat_rgba_dxt5 = {
|
||||
NULL, /*impossible*/ /* FetchTexel3Df */
|
||||
NULL /* StoreTexel */
|
||||
};
|
||||
|
||||
#if FEATURE_EXT_texture_sRGB
|
||||
const struct gl_texture_format _mesa_texformat_srgb_dxt1 = {
|
||||
MESA_FORMAT_SRGB_DXT1, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
4, /*approx*/ /* RedBits */
|
||||
4, /*approx*/ /* GreenBits */
|
||||
4, /*approx*/ /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
0, /* StencilBits */
|
||||
0, /* TexelBytes */
|
||||
texstore_rgb_dxt1, /* StoreTexImageFunc */
|
||||
NULL, /*impossible*/ /* FetchTexel1D */
|
||||
NULL, /* FetchTexel2D */
|
||||
NULL, /*impossible*/ /* FetchTexel3D */
|
||||
NULL, /*impossible*/ /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_srgb_dxt1, /* FetchTexel2Df */
|
||||
NULL, /*impossible*/ /* FetchTexel3Df */
|
||||
NULL /* StoreTexel */
|
||||
};
|
||||
|
||||
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 */
|
||||
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 */
|
||||
NULL, /* FetchTexel2D */
|
||||
NULL, /*impossible*/ /* FetchTexel3D */
|
||||
NULL, /*impossible*/ /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_srgba_dxt1, /* FetchTexel2Df */
|
||||
NULL, /*impossible*/ /* FetchTexel3Df */
|
||||
NULL /* StoreTexel */
|
||||
};
|
||||
|
||||
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 */
|
||||
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 */
|
||||
NULL, /* FetchTexel2D */
|
||||
NULL, /*impossible*/ /* FetchTexel3D */
|
||||
NULL, /*impossible*/ /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_srgba_dxt3, /* FetchTexel2Df */
|
||||
NULL, /*impossible*/ /* FetchTexel3Df */
|
||||
NULL /* StoreTexel */
|
||||
};
|
||||
|
||||
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 */
|
||||
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 */
|
||||
NULL, /* FetchTexel2D */
|
||||
NULL, /*impossible*/ /* FetchTexel3D */
|
||||
NULL, /*impossible*/ /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_srgba_dxt5, /* FetchTexel2Df */
|
||||
NULL, /*impossible*/ /* FetchTexel3Df */
|
||||
NULL /* StoreTexel */
|
||||
};
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user