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 <srol...@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 <imir...@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), >> }; >> >> >> > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev