[Mesa-dev] [PATCH] mesa: Do something sensible when on-line compression is requested but not possible
Ian Romanick
idr at freedesktop.org
Fri Aug 24 20:23:30 PDT 2012
From: Ian Romanick <ian.d.romanick at intel.com>
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 at intel.com>
---
src/mesa/main/teximage.c | 31 +++++++++++++++++++++++++++++++
1 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index c0868fa..11b1b30 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);
--
1.7.6.5
More information about the mesa-dev
mailing list