From 42723d88d370a7599398cc1c2349aeb951ba1c57 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 21 Aug 2012 15:20:23 -0700 Subject: [PATCH] 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 Reviewed-by: Kenneth Graunke --- src/mesa/main/teximage.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index c0868fabb21..11b1b3043a9 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -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); -- 2.30.2