From: Brian Paul Date: Fri, 21 Dec 2012 20:41:23 +0000 (-0700) Subject: mesa: add missing texel fetch code for sRGB DXT formats X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7c35521295e647978ed8e7ab9f490ef70d672cd3;p=mesa.git mesa: add missing texel fetch code for sRGB DXT formats Fixes http://bugs.freedesktop.org/show_bug.cgi?id=58548 --- diff --git a/src/mesa/main/texcompress.c b/src/mesa/main/texcompress.c index 33c580a88f0..077a967da7e 100644 --- a/src/mesa/main/texcompress.c +++ b/src/mesa/main/texcompress.c @@ -533,6 +533,10 @@ _mesa_get_compressed_fetch_func(gl_format format) case MESA_FORMAT_RGBA_DXT1: case MESA_FORMAT_RGBA_DXT3: case MESA_FORMAT_RGBA_DXT5: + case MESA_FORMAT_SRGB_DXT1: + case MESA_FORMAT_SRGBA_DXT1: + case MESA_FORMAT_SRGBA_DXT3: + case MESA_FORMAT_SRGBA_DXT5: return _mesa_get_dxt_fetch_func(format); case MESA_FORMAT_RGB_FXT1: case MESA_FORMAT_RGBA_FXT1: diff --git a/src/mesa/main/texcompress_s3tc.c b/src/mesa/main/texcompress_s3tc.c index 23a5a086816..4a81ad8031b 100644 --- a/src/mesa/main/texcompress_s3tc.c +++ b/src/mesa/main/texcompress_s3tc.c @@ -417,6 +417,80 @@ fetch_rgba_dxt5(const GLubyte *map, const GLuint imageOffsets[], } +static void +fetch_srgb_dxt1(const GLubyte *map, const GLuint imageOffsets[], + GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel) +{ + if (fetch_ext_rgb_dxt1) { + GLuint sliceOffset = k ? imageOffsets[k] / 2 : 0; + GLubyte tex[4]; + fetch_ext_rgb_dxt1(rowStride, map + sliceOffset, i, j, tex); + texel[RCOMP] = _mesa_nonlinear_to_linear(tex[RCOMP]); + texel[GCOMP] = _mesa_nonlinear_to_linear(tex[GCOMP]); + texel[BCOMP] = _mesa_nonlinear_to_linear(tex[BCOMP]); + texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]); + } + else { + problem("srgb_dxt1"); + } +} + +static void +fetch_srgba_dxt1(const GLubyte *map, const GLuint imageOffsets[], + GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel) +{ + if (fetch_ext_rgba_dxt1) { + GLuint sliceOffset = k ? imageOffsets[k] / 2 : 0; + GLubyte tex[4]; + fetch_ext_rgba_dxt1(rowStride, map + sliceOffset, i, j, tex); + texel[RCOMP] = _mesa_nonlinear_to_linear(tex[RCOMP]); + texel[GCOMP] = _mesa_nonlinear_to_linear(tex[GCOMP]); + texel[BCOMP] = _mesa_nonlinear_to_linear(tex[BCOMP]); + texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]); + } + else { + problem("srgba_dxt1"); + } +} + +static void +fetch_srgba_dxt3(const GLubyte *map, const GLuint imageOffsets[], + GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel) +{ + if (fetch_ext_rgba_dxt3) { + GLuint sliceOffset = k ? imageOffsets[k] : 0; + GLubyte tex[4]; + fetch_ext_rgba_dxt3(rowStride, map + sliceOffset, i, j, tex); + texel[RCOMP] = _mesa_nonlinear_to_linear(tex[RCOMP]); + texel[GCOMP] = _mesa_nonlinear_to_linear(tex[GCOMP]); + texel[BCOMP] = _mesa_nonlinear_to_linear(tex[BCOMP]); + texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]); + } + else { + problem("srgba_dxt3"); + } +} + +static void +fetch_srgba_dxt5(const GLubyte *map, const GLuint imageOffsets[], + GLint rowStride, GLint i, GLint j, GLint k, GLfloat *texel) +{ + if (fetch_ext_rgba_dxt5) { + GLuint sliceOffset = k ? imageOffsets[k] : 0; + GLubyte tex[4]; + fetch_ext_rgba_dxt5(rowStride, map + sliceOffset, i, j, tex); + texel[RCOMP] = _mesa_nonlinear_to_linear(tex[RCOMP]); + texel[GCOMP] = _mesa_nonlinear_to_linear(tex[GCOMP]); + texel[BCOMP] = _mesa_nonlinear_to_linear(tex[BCOMP]); + texel[ACOMP] = UBYTE_TO_FLOAT(tex[ACOMP]); + } + else { + problem("srgba_dxt5"); + } +} + + + compressed_fetch_func _mesa_get_dxt_fetch_func(gl_format format) { @@ -429,6 +503,14 @@ _mesa_get_dxt_fetch_func(gl_format format) return fetch_rgba_dxt3; case MESA_FORMAT_RGBA_DXT5: return fetch_rgba_dxt5; + case MESA_FORMAT_SRGB_DXT1: + return fetch_srgb_dxt1; + case MESA_FORMAT_SRGBA_DXT1: + return fetch_srgba_dxt1; + case MESA_FORMAT_SRGBA_DXT3: + return fetch_srgba_dxt3; + case MESA_FORMAT_SRGBA_DXT5: + return fetch_srgba_dxt5; default: return NULL; }