mesa: Do something sensible when on-line compression is requested but not possible

It is possible to force S3TC extensions to be enabled.  This is
generally done to support applications that will only supply
pre-compressed textures.  This accounts for the vast majority of
applications.

However, there is still the possibility of an application asking for
on-line compression.  In that case, generate a warning and substitute a
generic compressed format.  The driver will either pick an uncompressed
format or a compressed format that Mesa can handle on-line (e.g., FXT1).

This should only cause problems for applications that request on-line
compression and read the compressed texture back.  This is likely an
infinitesimal subset of an already infinitesimal subset.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Ian Romanick
2012-08-21 15:20:23 -07:00
parent 0e0d664461
commit 42723d88d3

View File

@@ -2799,6 +2799,37 @@ _mesa_choose_texture_format(struct gl_context *ctx,
}
}
/* If the application requested compression to an S3TC format but we don't
* have the DTXn library, force a generic compressed format instead.
*/
if (internalFormat != format) {
const GLenum before = internalFormat;
switch (internalFormat) {
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
if (!ctx->Mesa_DXTn)
internalFormat = GL_COMPRESSED_RGB;
break;
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
if (!ctx->Mesa_DXTn)
internalFormat = GL_COMPRESSED_RGBA;
break;
default:
break;
}
if (before != internalFormat) {
_mesa_warning(ctx,
"DXT compression requested (%s), "
"but libtxc_dxtn library not installed. Using %s "
"instead.",
_mesa_lookup_enum_by_nr(before),
_mesa_lookup_enum_by_nr(internalFormat));
}
}
/* choose format from scratch */
f = ctx->Driver.ChooseTextureFormat(ctx, texObj->Target, internalFormat,
format, type);