[Mesa-dev] [PATCH 2/2] intel: add ANGLE_texture_compression_dxt extension support.
Oliver McFadden
oliver.mcfadden at linux.intel.com
Tue Sep 4 04:53:57 PDT 2012
From: Oliver McFadden <oliver.mcfadden at intel.com>
http://www.khronos.org/registry/gles/extensions/ANGLE/ANGLE_texture_compression_dxt.txt
Signed-off-by: Oliver McFadden <oliver.mcfadden at intel.com>
---
src/glx/glxextensions.h | 1 +
src/mapi/glapi/gen/es_EXT.xml | 6 ++++++
src/mesa/drivers/dri/intel/intel_extensions.c | 5 +++++
src/mesa/main/APIspec.xml | 3 +++
src/mesa/main/extensions.c | 12 ++++++++++++
src/mesa/main/formats.c | 2 ++
src/mesa/main/glformats.c | 11 +++++++++--
src/mesa/main/glheader.h | 10 ++++++++++
src/mesa/main/mfeatures.h | 1 +
src/mesa/main/mtypes.h | 1 +
src/mesa/main/texcompress.c | 6 ++++++
src/mesa/main/texcompress_s3tc.c | 4 ++--
src/mesa/main/texcompress_s3tc.h | 6 +++---
src/mesa/main/texformat.c | 22 +++++++++++++++-------
src/mesa/main/teximage.c | 12 ++++++++++++
src/mesa/state_tracker/st_format.c | 4 ++++
16 files changed, 92 insertions(+), 14 deletions(-)
diff --git a/src/glx/glxextensions.h b/src/glx/glxextensions.h
index 90c27a7..2cbd8d4 100644
--- a/src/glx/glxextensions.h
+++ b/src/glx/glxextensions.h
@@ -132,6 +132,7 @@ enum
GL_EXT_texture_bit,
GL_EXT_texture3D_bit,
GL_EXT_texture_compression_dxt1_bit,
+ GL_ANGLE_texture_compression_dxt_bit,
GL_EXT_texture_compression_s3tc_bit,
GL_EXT_texture_edge_clamp_bit,
GL_EXT_texture_env_combine_bit,
diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
index fc2ec62..2698110 100644
--- a/src/mapi/glapi/gen/es_EXT.xml
+++ b/src/mapi/glapi/gen/es_EXT.xml
@@ -731,4 +731,10 @@
<enum name="RG8_EXT" value="0x822B"/>
</category>
+<!-- 111. GL_ANGLE_texture_compression_dxt -->
+<category name="ANGLE_texture_compression_dxt" number="111">
+ <enum name="COMPRESSED_RGBA_S3TC_DXT3_ANGLE" value="0x83F2"/>
+ <enum name="COMPRESSED_RGBA_S3TC_DXT5_ANGLE" value="0x83F3"/>
+</category>
+
</OpenGLAPI>
diff --git a/src/mesa/drivers/dri/intel/intel_extensions.c b/src/mesa/drivers/dri/intel/intel_extensions.c
index 885e8a4..b8cf933 100755
--- a/src/mesa/drivers/dri/intel/intel_extensions.c
+++ b/src/mesa/drivers/dri/intel/intel_extensions.c
@@ -184,6 +184,11 @@ intelInitExtensions(struct gl_context *ctx)
}
if (intel->ctx.Mesa_DXTn) {
+ /* Does not require compression, but still needs the library for
+ * decompression! */
+ ctx->Extensions.ANGLE_texture_compression_dxt = true;
+
+ /* Requires both compression and decompression functions. */
ctx->Extensions.EXT_texture_compression_s3tc = true;
ctx->Extensions.S3_s3tc = true;
}
diff --git a/src/mesa/main/APIspec.xml b/src/mesa/main/APIspec.xml
index a65c5c5..c396952 100644
--- a/src/mesa/main/APIspec.xml
+++ b/src/mesa/main/APIspec.xml
@@ -2172,6 +2172,9 @@
<category name="NV_draw_buffers"/>
<category name="NV_read_buffer"/>
+ <!-- GL_ANGLE_texture_compression_dxt -->
+ <category name="ANGLE_texture_compression_dxt"/>
+
<function name="DrawBuffersNV" template="DrawBuffers"/>
<function name="ReadBufferNV" template="ReadBuffer"/>
diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
index 7e116bd..0469beb 100644
--- a/src/mesa/main/extensions.c
+++ b/src/mesa/main/extensions.c
@@ -195,6 +195,8 @@ static const struct extension extension_table[] = {
{ "GL_EXT_texture3D", o(EXT_texture3D), GLL, 1996 },
{ "GL_EXT_texture_array", o(EXT_texture_array), GL, 2006 },
{ "GL_EXT_texture_compression_dxt1", o(EXT_texture_compression_s3tc), GL | ES1 | ES2, 2004 },
+ { "GL_ANGLE_texture_compression_dxt3", o(ANGLE_texture_compression_dxt), ES2, 2011 },
+ { "GL_ANGLE_texture_compression_dxt5", o(ANGLE_texture_compression_dxt), ES2, 2011 },
{ "GL_EXT_texture_compression_latc", o(EXT_texture_compression_latc), GL, 2006 },
{ "GL_EXT_texture_compression_rgtc", o(ARB_texture_compression_rgtc), GL, 2004 },
{ "GL_EXT_texture_compression_s3tc", o(EXT_texture_compression_s3tc), GL, 2000 },
@@ -531,6 +533,16 @@ _mesa_enable_sw_extensions(struct gl_context *ctx)
if (ctx->Mesa_DXTn) {
_mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
_mesa_enable_extension(ctx, "GL_S3_s3tc");
+
+ /* If we can support S3TC texture compression, then we can also support
+ * ANGLE texture compression. However the ANGLE_texture_compression_dxt
+ * spec says:
+ *
+ * The extension is written against the OpenGL ES 2.0 specification.
+ */
+ if (ctx->API == API_OPENGLES2) {
+ ctx->Extensions.ANGLE_texture_compression_dxt = GL_TRUE;
+ }
}
#endif
}
diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index 1fa641c..b22672e 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -2269,9 +2269,11 @@ _mesa_format_to_type_and_comps(gl_format format,
case MESA_FORMAT_RGB_FXT1:
case MESA_FORMAT_RGBA_FXT1:
#endif
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
#if FEATURE_texture_s3tc
case MESA_FORMAT_RGB_DXT1:
case MESA_FORMAT_RGBA_DXT1:
+#endif
case MESA_FORMAT_RGBA_DXT3:
case MESA_FORMAT_RGBA_DXT5:
#if FEATURE_EXT_texture_sRGB
diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
index 2d06cb7..01a67d6 100644
--- a/src/mesa/main/glformats.c
+++ b/src/mesa/main/glformats.c
@@ -793,8 +793,15 @@ _mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
return ctx->Extensions.EXT_texture_compression_s3tc;
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
- return _mesa_is_desktop_gl(ctx)
- && ctx->Extensions.EXT_texture_compression_s3tc;
+ /* case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: (duplicate case value) */
+ /* case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: (duplicate case value) */
+ return
+#if FEATURE_ANGLE_texture_compression_dxt
+ (_mesa_is_gles2(ctx)
+ && ctx->Extensions.ANGLE_texture_compression_dxt) ||
+#endif
+ (_mesa_is_desktop_gl(ctx)
+ && ctx->Extensions.EXT_texture_compression_s3tc);
case GL_RGB_S3TC:
case GL_RGB4_S3TC:
case GL_RGBA_S3TC:
diff --git a/src/mesa/main/glheader.h b/src/mesa/main/glheader.h
index 3152323..2c2182e 100644
--- a/src/mesa/main/glheader.h
+++ b/src/mesa/main/glheader.h
@@ -143,6 +143,16 @@ typedef void *GLeglImageOES;
#define GL_ETC1_RGB8_OES 0x8D64
#endif
+/* GL_ANGLE_texture_compression_dxt3 */
+#ifndef GL_ANGLE_texture_compression_dxt3
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2
+#endif
+
+/* GL_ANGLE_texture_compression_dxt5 */
+#ifndef GL_ANGLE_texture_compression_dxt5
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3
+#endif
+
/**
* Internal token to represent a GLSL shader program (a collection of
diff --git a/src/mesa/main/mfeatures.h b/src/mesa/main/mfeatures.h
index b67f046..38325e8 100644
--- a/src/mesa/main/mfeatures.h
+++ b/src/mesa/main/mfeatures.h
@@ -105,6 +105,7 @@
#define FEATURE_rastpos FEATURE_GL
#define FEATURE_texture_fxt1 FEATURE_GL
#define FEATURE_texture_s3tc FEATURE_GL
+#define FEATURE_ANGLE_texture_compression_dxt FEATURE_ES2
#define FEATURE_extra_context_init FEATURE_ES
#define FEATURE_point_size_array FEATURE_ES
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index ba43e57..1cf41da 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3035,6 +3035,7 @@ struct gl_extensions
GLboolean EXT_texture_array;
GLboolean EXT_texture_compression_latc;
GLboolean EXT_texture_compression_s3tc;
+ GLboolean ANGLE_texture_compression_dxt;
GLboolean EXT_texture_env_dot3;
GLboolean EXT_texture_filter_anisotropic;
GLboolean EXT_texture_integer;
diff --git a/src/mesa/main/texcompress.c b/src/mesa/main/texcompress.c
index 846d4bb..3321b15 100644
--- a/src/mesa/main/texcompress.c
+++ b/src/mesa/main/texcompress.c
@@ -102,7 +102,9 @@ _mesa_gl_compressed_format_base_format(GLenum format)
case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB:
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+ /* case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: (duplicate case value) */
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+ /* case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: (duplicate case value) */
case GL_COMPRESSED_RGBA_FXT1_3DFX:
case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
@@ -318,9 +320,11 @@ _mesa_glenum_to_compressed_format(GLenum format)
case GL_RGB4_S3TC:
return MESA_FORMAT_RGBA_DXT1;
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+ /* case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: (duplicate case value) */
case GL_RGBA_S3TC:
return MESA_FORMAT_RGBA_DXT3;
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+ /* case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: (duplicate case value) */
case GL_RGBA4_S3TC:
return MESA_FORMAT_RGBA_DXT5;
@@ -381,11 +385,13 @@ _mesa_compressed_format_to_glenum(struct gl_context *ctx, gl_format mesaFormat)
case MESA_FORMAT_RGBA_FXT1:
return GL_COMPRESSED_RGBA_FXT1_3DFX;
#endif
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
#if FEATURE_texture_s3tc
case MESA_FORMAT_RGB_DXT1:
return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
case MESA_FORMAT_RGBA_DXT1:
return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+#endif
case MESA_FORMAT_RGBA_DXT3:
return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
case MESA_FORMAT_RGBA_DXT5:
diff --git a/src/mesa/main/texcompress_s3tc.c b/src/mesa/main/texcompress_s3tc.c
index 8736e20..e0c8478 100644
--- a/src/mesa/main/texcompress_s3tc.c
+++ b/src/mesa/main/texcompress_s3tc.c
@@ -47,7 +47,7 @@
#include "swrast/s_context.h"
-#if FEATURE_texture_s3tc
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
#if defined(_WIN32) || defined(WIN32)
@@ -533,4 +533,4 @@ _mesa_fetch_texel_srgba_dxt5(const struct swrast_texture_image *texImage,
#endif /* FEATURE_EXT_texture_sRGB */
-#endif /* FEATURE_texture_s3tc */
+#endif /* FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt */
diff --git a/src/mesa/main/texcompress_s3tc.h b/src/mesa/main/texcompress_s3tc.h
index 2c06e50..f3c42f6 100644
--- a/src/mesa/main/texcompress_s3tc.h
+++ b/src/mesa/main/texcompress_s3tc.h
@@ -33,7 +33,7 @@
struct gl_context;
struct swrast_texture_image;
-#if FEATURE_texture_s3tc
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
extern GLboolean
_mesa_texstore_rgb_dxt1(TEXSTORE_PARAMS);
@@ -82,7 +82,7 @@ _mesa_fetch_texel_srgba_dxt5(const struct swrast_texture_image *texImage,
extern void
_mesa_init_texture_s3tc(struct gl_context *ctx);
-#else /* FEATURE_texture_s3tc */
+#else /* FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt */
/* these are used only in texstore_funcs[] */
#define _mesa_texstore_rgb_dxt1 NULL
@@ -105,6 +105,6 @@ _mesa_init_texture_s3tc(struct gl_context *ctx)
{
}
-#endif /* FEATURE_texture_s3tc */
+#endif /* FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt */
#endif /* TEXCOMPRESS_S3TC_H */
diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c
index 1a318ab..38584f2 100644
--- a/src/mesa/main/texformat.c
+++ b/src/mesa/main/texformat.c
@@ -304,19 +304,24 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
}
#endif
-#if FEATURE_texture_s3tc
- if (ctx->Extensions.EXT_texture_compression_s3tc) {
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
+ if (ctx->Extensions.EXT_texture_compression_s3tc ||
+ ctx->Extensions.ANGLE_texture_compression_dxt) {
switch (internalFormat) {
+#if FEATURE_texture_s3tc
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
break;
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
break;
+#endif
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+ /* case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: (duplicate case value) */
RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
break;
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+ /* case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: (duplicate case value) */
RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
break;
default:
@@ -595,14 +600,15 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
break;
case GL_COMPRESSED_SRGB_ALPHA_EXT:
-#if FEATURE_texture_s3tc
- if (ctx->Extensions.EXT_texture_compression_s3tc)
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
+ if (ctx->Extensions.EXT_texture_compression_s3tc ||
+ ctx->Extensions.ANGLE_texture_compression_dxt)
RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
#endif
RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
break;
-#if FEATURE_texture_s3tc
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
if (ctx->Extensions.EXT_texture_compression_s3tc)
RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
@@ -614,12 +620,14 @@ _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
break;
case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
- if (ctx->Extensions.EXT_texture_compression_s3tc)
+ if (ctx->Extensions.EXT_texture_compression_s3tc ||
+ ctx->Extensions.ANGLE_texture_compression_dxt)
RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
break;
case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
- if (ctx->Extensions.EXT_texture_compression_s3tc)
+ if (ctx->Extensions.EXT_texture_compression_s3tc ||
+ ctx->Extensions.ANGLE_texture_compression_dxt)
RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
break;
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index cdb0905..9f6a08c 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -209,6 +209,18 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
}
}
+#if FEATURE_ANGLE_texture_compression_dxt
+ if (ctx->Extensions.ANGLE_texture_compression_dxt) {
+ switch (internalFormat) {
+ case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+ case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+ return GL_RGBA;
+ default:
+ ; /* fallthrough */
+ }
+ }
+#endif
+
if (ctx->Extensions.S3_s3tc) {
switch (internalFormat) {
case GL_RGB_S3TC:
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index 302b58c..3dfb98a 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -119,11 +119,13 @@ st_mesa_format_to_pipe_format(gl_format mesaFormat)
return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT;
case MESA_FORMAT_YCBCR:
return PIPE_FORMAT_UYVY;
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
#if FEATURE_texture_s3tc
case MESA_FORMAT_RGB_DXT1:
return PIPE_FORMAT_DXT1_RGB;
case MESA_FORMAT_RGBA_DXT1:
return PIPE_FORMAT_DXT1_RGBA;
+#endif
case MESA_FORMAT_RGBA_DXT3:
return PIPE_FORMAT_DXT3_RGBA;
case MESA_FORMAT_RGBA_DXT5:
@@ -449,11 +451,13 @@ st_pipe_format_to_mesa_format(enum pipe_format format)
case PIPE_FORMAT_YUYV:
return MESA_FORMAT_YCBCR_REV;
+#if FEATURE_texture_s3tc || FEATURE_ANGLE_texture_compression_dxt
#if FEATURE_texture_s3tc
case PIPE_FORMAT_DXT1_RGB:
return MESA_FORMAT_RGB_DXT1;
case PIPE_FORMAT_DXT1_RGBA:
return MESA_FORMAT_RGBA_DXT1;
+#endif
case PIPE_FORMAT_DXT3_RGBA:
return MESA_FORMAT_RGBA_DXT3;
case PIPE_FORMAT_DXT5_RGBA:
--
1.7.8.6
More information about the mesa-dev
mailing list