[Mesa-dev] [PATCH 2/2] intel: add ANGLE_texture_compression_dxt extension support.

Ian Romanick idr at freedesktop.org
Tue Sep 4 11:08:41 PDT 2012


On 09/04/2012 04:53 AM, Oliver McFadden wrote:
> 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;
> +      }

This is unnecessary.  The extension will only be advertised in GLES2 (or 
GLES3).  The only other case where we have an API check like this is 
where there is a behavior conflict between an extension and an API where 
it could be advertised (e.g., GL_ARB_texture_buffer_objects and pre-3.1 
desktop OpenGL).

>      }
>   #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) */

There's no reason for this clutter.

> +      return
> +#if FEATURE_ANGLE_texture_compression_dxt
> +      (_mesa_is_gles2(ctx)

OpenGL ES 3.0 is backwards compatible with ES 2.0.  Once we get full 3.0 
support, the Intel driver will only have 3.0 (just like in desktop GL we 
only have 3.0 instead of 2.1).  That will cause this check to fail.  You 
really want 'ctx->API == API_OPENGLES2' here.

> +        && 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) */

Again, there's no reason for this clutter.

>      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) */

Ditto.

>      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) */

Ditto.

>   	    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:
>



More information about the mesa-dev mailing list