[Mesa-dev] [PATCH 1/5] mesa: add GL_AMD_compressed_ATC_texture support
Ilia Mirkin
imirkin at alum.mit.edu
Mon Mar 2 08:06:03 PST 2015
While it is proprietary, there's a guide on how to convert it to the
relevant DXTn format:
http://www.guildsoftware.com/papers/2012.Converting.DXTC.to.ATC.pdf
My understanding is that a lot of android games still make use of it,
so it made sense to provide. While freedreno doesn't currently run on
android, I think that there will be some solution to that. For
reference, the Qualcomm-provided drivers expose this extension on both
a3xx and a4xx hardware. I suspect it shouldn't be that hard to add it
to the freedreno a2xx (or a4xx) drivers, but I don't have the hw to
determine the format id's.
Note that the gallium exposure to this 'fringe' feature is little more
than 3 PIPE_FORMAT values.
On Mon, Mar 2, 2015 at 10:34 AM, Roland Scheidegger <sroland at vmware.com> wrote:
> I'll have to say I don't particularly like this. Not only is this a
> proprietary format but it's also undisclosed (the encoding is secret).
> Is this really all that useful? You enable it only on a3xx, it looks to
> me like it would have been mostly interesting for a lot older chips
> (pre-a2xx) as the extension is written against gles 1.1 and there's
> alternatives available for the later chips.
> I'm not exactly thrilled about supporting such proprietary fringe
> features in gallium.
>
> Roland
>
>
> Am 02.03.2015 um 04:08 schrieb Ilia Mirkin:
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>> src/mapi/glapi/gen/es_EXT.xml | 6 ++++++
>> src/mesa/main/extensions.c | 1 +
>> src/mesa/main/format_info.py | 2 ++
>> src/mesa/main/formats.c | 11 +++++++++++
>> src/mesa/main/formats.csv | 5 +++++
>> src/mesa/main/formats.h | 5 +++++
>> src/mesa/main/glformats.c | 8 ++++++++
>> src/mesa/main/glformats.h | 5 +++++
>> src/mesa/main/mtypes.h | 1 +
>> src/mesa/main/texcompress.c | 39 ++++++++++++++++++++++++++++++++++++++-
>> src/mesa/main/teximage.c | 15 +++++++++++++++
>> src/mesa/swrast/s_texfetch.c | 6 +++++-
>> 12 files changed, 102 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/mapi/glapi/gen/es_EXT.xml b/src/mapi/glapi/gen/es_EXT.xml
>> index 3a2adeb..e691ae1 100644
>> --- a/src/mapi/glapi/gen/es_EXT.xml
>> +++ b/src/mapi/glapi/gen/es_EXT.xml
>> @@ -602,6 +602,12 @@
>> <enum name="HALF_FLOAT_OES" value="0x8D61"/>
>> </category>
>>
>> +<category name="GL_AMD_compressed_ATC_texture" number="40">
>> + <enum name="ATC_RGB_AMD" value="0x8C92"/>
>> + <enum name="ATC_RGBA_EXPLICIT_ALPHA_AMD" value="0x8C93"/>
>> + <enum name="ATC_RGBA_INTERPOLATED_ALPHA_AMD" value="0x87EE"/>
>> +</category>
>> +
>> <!-- 41. GL_EXT_texture_filter_anisotropic -->
>>
>> <category name="GL_EXT_texture_type_2_10_10_10_REV" number="42">
>> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
>> index f212015..913de1a 100644
>> --- a/src/mesa/main/extensions.c
>> +++ b/src/mesa/main/extensions.c
>> @@ -335,6 +335,7 @@ static const struct extension extension_table[] = {
>>
>> /* Vendor extensions */
>> { "GL_3DFX_texture_compression_FXT1", o(TDFX_texture_compression_FXT1), GL, 1999 },
>> + { "GL_AMD_compressed_ATC_texture", o(AMD_compressed_ATC_texture), ES1 | ES2, 2007 },
>> { "GL_AMD_conservative_depth", o(ARB_conservative_depth), GL, 2009 },
>> { "GL_AMD_draw_buffers_blend", o(ARB_draw_buffers_blend), GL, 2009 },
>> { "GL_AMD_performance_monitor", o(AMD_performance_monitor), GL, 2007 },
>> diff --git a/src/mesa/main/format_info.py b/src/mesa/main/format_info.py
>> index 3bae57e..0c6fccf 100644
>> --- a/src/mesa/main/format_info.py
>> +++ b/src/mesa/main/format_info.py
>> @@ -130,6 +130,8 @@ def get_channel_bits(fmat, chan_name):
>> elif fmat.layout == 'bptc':
>> bits = 16 if fmat.name.endswith('_FLOAT') else 8
>> return bits if fmat.has_channel(chan_name) else 0
>> + elif fmat.layout == 'atc':
>> + return 8 if fmat.has_channel(chan_name) else 0
>> else:
>> assert False
>> else:
>> diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
>> index df852f3..cf363b3 100644
>> --- a/src/mesa/main/formats.c
>> +++ b/src/mesa/main/formats.c
>> @@ -712,11 +712,14 @@ _mesa_get_uncompressed_format(mesa_format format)
>> case MESA_FORMAT_ETC1_RGB8:
>> case MESA_FORMAT_ETC2_RGB8:
>> case MESA_FORMAT_ETC2_SRGB8:
>> + case MESA_FORMAT_ATC_RGB:
>> return MESA_FORMAT_BGR_UNORM8;
>> case MESA_FORMAT_ETC2_RGBA8_EAC:
>> case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
>> case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
>> case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
>> + case MESA_FORMAT_ATC_RGBA_EXPLICIT:
>> + case MESA_FORMAT_ATC_RGBA_INTERPOLATED:
>> return MESA_FORMAT_A8B8G8R8_UNORM;
>> case MESA_FORMAT_ETC2_R11_EAC:
>> case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
>> @@ -1242,6 +1245,9 @@ _mesa_format_to_type_and_comps(mesa_format format,
>> case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
>> case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
>> case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
>> + case MESA_FORMAT_ATC_RGB:
>> + case MESA_FORMAT_ATC_RGBA_EXPLICIT:
>> + case MESA_FORMAT_ATC_RGBA_INTERPOLATED:
>> /* XXX generate error instead? */
>> *datatype = GL_UNSIGNED_BYTE;
>> *comps = 0;
>> @@ -2079,6 +2085,11 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
>> case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
>> return GL_FALSE;
>>
>> + case MESA_FORMAT_ATC_RGB:
>> + case MESA_FORMAT_ATC_RGBA_EXPLICIT:
>> + case MESA_FORMAT_ATC_RGBA_INTERPOLATED:
>> + return GL_FALSE;
>> +
>> case MESA_FORMAT_A_SNORM8:
>> return format == GL_ALPHA && type == GL_BYTE;
>> case MESA_FORMAT_L_SNORM8:
>> diff --git a/src/mesa/main/formats.csv b/src/mesa/main/formats.csv
>> index e159e7d..1d669af 100644
>> --- a/src/mesa/main/formats.csv
>> +++ b/src/mesa/main/formats.csv
>> @@ -301,3 +301,8 @@ MESA_FORMAT_BPTC_RGBA_UNORM , bptc , 4, 4, x128, , ,
>> MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM , bptc , 4, 4, x128, , , , xyzw, srgb
>> MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT , bptc , 4, 4, x128, , , , xyz1, rgb
>> MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT , bptc , 4, 4, x128, , , , xyz1, rgb
>> +
>> +# ATC compressed formats
>> +MESA_FORMAT_ATC_RGB , atc , 4, 4, x64 , , , , xyz1, rgb
>> +MESA_FORMAT_ATC_RGBA_EXPLICIT , atc , 4, 4, x128, , , , xyzw, rgb
>> +MESA_FORMAT_ATC_RGBA_INTERPOLATED , atc , 4, 4, x128, , , , xyzw, rgb
>> diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
>> index 7e451ca..4909cad 100644
>> --- a/src/mesa/main/formats.h
>> +++ b/src/mesa/main/formats.h
>> @@ -575,6 +575,11 @@ typedef enum
>> MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT,
>> MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT,
>>
>> + /* ATC compressed formats */
>> + MESA_FORMAT_ATC_RGB,
>> + MESA_FORMAT_ATC_RGBA_EXPLICIT,
>> + MESA_FORMAT_ATC_RGBA_INTERPOLATED,
>> +
>> MESA_FORMAT_COUNT
>> } mesa_format;
>>
>> diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
>> index 4e05229..e30c427 100644
>> --- a/src/mesa/main/glformats.c
>> +++ b/src/mesa/main/glformats.c
>> @@ -1003,6 +1003,9 @@ _mesa_is_color_format(GLenum format)
>> case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
>> case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:
>> case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
>> + case GL_ATC_RGB_AMD:
>> + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
>> + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
>> /* generic integer formats */
>> case GL_RED_INTEGER_EXT:
>> case GL_GREEN_INTEGER_EXT:
>> @@ -1262,6 +1265,11 @@ _mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
>> case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
>> return _mesa_is_desktop_gl(ctx) &&
>> ctx->Extensions.ARB_texture_compression_bptc;
>> + case GL_ATC_RGB_AMD:
>> + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
>> + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
>> + return _mesa_is_gles(ctx)
>> + && ctx->Extensions.AMD_compressed_ATC_texture;
>> case GL_PALETTE4_RGB8_OES:
>> case GL_PALETTE4_RGBA8_OES:
>> case GL_PALETTE4_R5_G6_B5_OES:
>> diff --git a/src/mesa/main/glformats.h b/src/mesa/main/glformats.h
>> index e1ecd64..295fb83 100644
>> --- a/src/mesa/main/glformats.h
>> +++ b/src/mesa/main/glformats.h
>> @@ -30,11 +30,16 @@
>>
>> #include <GL/gl.h>
>>
>> +#define GL_ATC_RGB_AMD 0x8C92
>> +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93
>> +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE
>>
>> #ifdef __cplusplus
>> extern "C" {
>> #endif
>>
>> +struct gl_context;
>> +
>> extern void
>> _mesa_compute_component_mapping(GLenum inFormat, GLenum outFormat, GLubyte *map);
>>
>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>> index 6e99773..24d98ef 100644
>> --- a/src/mesa/main/mtypes.h
>> +++ b/src/mesa/main/mtypes.h
>> @@ -3855,6 +3855,7 @@ struct gl_extensions
>> GLboolean EXT_vertex_array_bgra;
>> GLboolean OES_standard_derivatives;
>> /* vendor extensions */
>> + GLboolean AMD_compressed_ATC_texture;
>> GLboolean AMD_performance_monitor;
>> GLboolean AMD_pinned_memory;
>> GLboolean AMD_seamless_cubemap_per_texture;
>> diff --git a/src/mesa/main/texcompress.c b/src/mesa/main/texcompress.c
>> index 00234d4..1c1a4f5 100644
>> --- a/src/mesa/main/texcompress.c
>> +++ b/src/mesa/main/texcompress.c
>> @@ -30,6 +30,7 @@
>> */
>>
>>
>> +#include "glformats.h"
>> #include "glheader.h"
>> #include "imports.h"
>> #include "colormac.h"
>> @@ -44,7 +45,6 @@
>> #include "texcompress_etc.h"
>> #include "texcompress_bptc.h"
>>
>> -
>> /**
>> * Get the GL base format of a specified GL compressed texture format
>> *
>> @@ -101,6 +101,7 @@ _mesa_gl_compressed_format_base_format(GLenum format)
>> case GL_ETC1_RGB8_OES:
>> case GL_COMPRESSED_RGB8_ETC2:
>> case GL_COMPRESSED_SRGB8_ETC2:
>> + case GL_ATC_RGB_AMD:
>> return GL_RGB;
>>
>> case GL_COMPRESSED_RGBA:
>> @@ -118,6 +119,8 @@ _mesa_gl_compressed_format_base_format(GLenum format)
>> case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
>> case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
>> case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
>> + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
>> + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
>> return GL_RGBA;
>>
>> case GL_COMPRESSED_ALPHA:
>> @@ -326,6 +329,26 @@ _mesa_get_compressed_formats(struct gl_context *ctx, GLint *formats)
>> }
>> }
>>
>> + /* The GL_AMD_compressed_ATC_texture spec says:
>> + *
>> + * "New State
>> + *
>> + * The queries for NUM_COMPRESSED_TEXTURE_FORMATS and
>> + * COMPRESSED_TEXTURE_FORMATS include ATC_RGB_AMD,
>> + * ATC_RGBA_EXPLICIT_ALPHA_AMD, and ATC_RGBA_INTERPOLATED_ALPHA_AMD."
>> + */
>> + if (_mesa_is_gles(ctx)
>> + && ctx->Extensions.AMD_compressed_ATC_texture) {
>> + if (formats) {
>> + formats[n++] = GL_ATC_RGB_AMD;
>> + formats[n++] = GL_ATC_RGBA_EXPLICIT_ALPHA_AMD;
>> + formats[n++] = GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD;
>> + }
>> + else {
>> + n += 3;
>> + }
>> + }
>> +
>> if (ctx->API == API_OPENGLES) {
>> if (formats) {
>> formats[n++] = GL_PALETTE4_RGB8_OES;
>> @@ -450,6 +473,13 @@ _mesa_glenum_to_compressed_format(GLenum format)
>> case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
>> return MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT;
>>
>> + case GL_ATC_RGB_AMD:
>> + return MESA_FORMAT_ATC_RGB;
>> + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
>> + return MESA_FORMAT_ATC_RGBA_EXPLICIT;
>> + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
>> + return MESA_FORMAT_ATC_RGBA_INTERPOLATED;
>> +
>> default:
>> return MESA_FORMAT_NONE;
>> }
>> @@ -540,6 +570,13 @@ _mesa_compressed_format_to_glenum(struct gl_context *ctx, mesa_format mesaFormat
>> case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
>> return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT;
>>
>> + case MESA_FORMAT_ATC_RGB:
>> + return GL_ATC_RGB_AMD;
>> + case MESA_FORMAT_ATC_RGBA_EXPLICIT:
>> + return GL_ATC_RGBA_EXPLICIT_ALPHA_AMD;
>> + case MESA_FORMAT_ATC_RGBA_INTERPOLATED:
>> + return GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD;
>> +
>> default:
>> _mesa_problem(ctx, "Unexpected mesa texture format in"
>> " _mesa_compressed_format_to_glenum()");
>> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
>> index 6e45cc9..16f09ec 100644
>> --- a/src/mesa/main/teximage.c
>> +++ b/src/mesa/main/teximage.c
>> @@ -561,6 +561,18 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
>> }
>> }
>>
>> + if (_mesa_is_gles(ctx) && ctx->Extensions.AMD_compressed_ATC_texture) {
>> + switch (internalFormat) {
>> + case GL_ATC_RGB_AMD:
>> + return GL_RGB;
>> + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
>> + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
>> + return GL_RGBA;
>> + default:
>> + ; /* fallthrough */
>> + }
>> + }
>> +
>> if (_mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility) {
>> switch (internalFormat) {
>> case GL_COMPRESSED_RGB8_ETC2:
>> @@ -1778,6 +1790,9 @@ compressedteximage_only_format(const struct gl_context *ctx, GLenum format)
>> case GL_PALETTE8_R5_G6_B5_OES:
>> case GL_PALETTE8_RGBA4_OES:
>> case GL_PALETTE8_RGB5_A1_OES:
>> + case GL_ATC_RGB_AMD:
>> + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD:
>> + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
>> return GL_TRUE;
>> default:
>> return GL_FALSE;
>> diff --git a/src/mesa/swrast/s_texfetch.c b/src/mesa/swrast/s_texfetch.c
>> index 242f8a4..01a8de9 100644
>> --- a/src/mesa/swrast/s_texfetch.c
>> +++ b/src/mesa/swrast/s_texfetch.c
>> @@ -552,7 +552,11 @@ texfetch_funcs[] =
>> fetch_compressed,
>> fetch_compressed,
>> fetch_compressed
>> - }
>> + },
>> +
>> + FETCH_NULL(ATC_RGB),
>> + FETCH_NULL(ATC_RGBA_EXPLICIT),
>> + FETCH_NULL(ATC_RGBA_INTERPOLATED),
>> };
>>
>>
>>
>
More information about the mesa-dev
mailing list