This patch is a followup on this: http://lists.freedesktop.org/archives/mesa-dev/2015-June/087055.html
On Tue, Aug 11, 2015 at 4:54 PM, Nanley Chery <nanleych...@gmail.com> wrote: > From: Nanley Chery <nanley.g.ch...@intel.com> > > In agreement with the ASTC spec, this makes calls to TexImage*D > unsuccessful. > Implied by the spec, Generate[Texture]Mipmap and [Copy]TexSubImage*D calls > must be unsuccessful as well. > > v2. actually force attempts to compress online to fail. > v3. indentation (Matt). > > Signed-off-by: Nanley Chery <nanley.g.ch...@intel.com> > --- > src/mesa/main/genmipmap.c | 1 + > src/mesa/main/glformats.c | 41 +++++++++++++++++++++++++++++++++++++++++ > src/mesa/main/glformats.h | 3 +++ > src/mesa/main/texcompress.c | 22 ++++++++++++++++++++++ > src/mesa/main/teximage.c | 15 ++++++++++++--- > 5 files changed, 79 insertions(+), 3 deletions(-) > > diff --git a/src/mesa/main/genmipmap.c b/src/mesa/main/genmipmap.c > index c18f9d5..4ec8385 100644 > --- a/src/mesa/main/genmipmap.c > +++ b/src/mesa/main/genmipmap.c > @@ -111,6 +111,7 @@ _mesa_generate_texture_mipmap(struct gl_context *ctx, > > if (_mesa_is_enum_format_integer(srcImage->InternalFormat) || > _mesa_is_depthstencil_format(srcImage->InternalFormat) || > + _mesa_is_astc_format(srcImage->InternalFormat) || > _mesa_is_stencil_format(srcImage->InternalFormat)) { > _mesa_unlock_texture(ctx, texObj); > _mesa_error(ctx, GL_INVALID_OPERATION, > diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c > index c3fd734..2240fa9 100644 > --- a/src/mesa/main/glformats.c > +++ b/src/mesa/main/glformats.c > @@ -820,6 +820,47 @@ _mesa_is_enum_format_signed_int(GLenum format) > } > } > > +/** > + * Test if the given format is an ASTC format. > + */ > +GLboolean > +_mesa_is_astc_format(GLenum internalFormat) > +{ > + switch (internalFormat) { > + case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: > + case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: > + case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: > + case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: > + case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: > + case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: > + case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: > + case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: > + case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: > + case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: > + case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: > + case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: > + case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: > + case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: > + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: > + return true; > + default: > + return false; > + } > +} > + > > /** > * Test if the given format is an integer (non-normalized) format. > diff --git a/src/mesa/main/glformats.h b/src/mesa/main/glformats.h > index 419955a..aec905d 100644 > --- a/src/mesa/main/glformats.h > +++ b/src/mesa/main/glformats.h > @@ -57,6 +57,9 @@ extern GLint > _mesa_bytes_per_vertex_attrib(GLint comps, GLenum type); > > extern GLboolean > +_mesa_is_astc_format(GLenum internalFormat); > + > +extern GLboolean > _mesa_is_type_unsigned(GLenum type); > > extern GLboolean > diff --git a/src/mesa/main/texcompress.c b/src/mesa/main/texcompress.c > index 0fd1a36..1654fc6 100644 > --- a/src/mesa/main/texcompress.c > +++ b/src/mesa/main/texcompress.c > @@ -229,6 +229,28 @@ _mesa_gl_compressed_format_base_format(GLenum format) > * what GL_NUM_COMPRESSED_TEXTURE_FORMATS and > * GL_COMPRESSED_TEXTURE_FORMATS return." > * > + * The KHR_texture_compression_astc_hdr spec says: > + * > + * "Interactions with OpenGL 4.2 > + * > + * OpenGL 4.2 supports the feature that compressed textures can be > + * compressed online, by passing the compressed texture format > enum as > + * the internal format when uploading a texture using TexImage1D, > + * TexImage2D or TexImage3D (see Section 3.9.3, Texture Image > + * Specification, subsection Encoding of Special Internal Formats). > + * > + * Due to the complexity of the ASTC compression algorithm, it is > not > + * usually suitable for online use, and therefore ASTC support > will be > + * limited to pre-compressed textures only. Where on-device > compression > + * is required, a domain-specific limited compressor will typically > + * be used, and this is therefore not suitable for implementation > in > + * the driver. > + * > + * In particular, the ASTC format specifiers will not be added to > + * Table 3.14, and thus will not be accepted by the TexImage*D > + * functions, and will not be returned by the (already deprecated) > + * COMPRESSED_TEXTURE_FORMATS query." > + * > * There is no formal spec for GL_ATI_texture_compression_3dc. Since the > * formats added by this extension are luminance-alpha formats, it is > * reasonable to expect them to follow the same rules as > diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c > index fc69387..3e9a7b9 100644 > --- a/src/mesa/main/teximage.c > +++ b/src/mesa/main/teximage.c > @@ -1784,6 +1784,15 @@ compressedteximage_only_format(const struct > gl_context *ctx, GLenum format) > } > } > > +/** > + * Return true if the format doesn't support online compression. > + */ > +static bool > +_mesa_format_no_online_compression(const struct gl_context *ctx, GLenum > format) > +{ > + return _mesa_is_astc_format(format) || > + compressedteximage_only_format(ctx, format); > +} > > /** > * Helper function to determine whether a target and specific compression > @@ -2289,7 +2298,7 @@ texture_error_check( struct gl_context *ctx, > "glTexImage%dD(target can't be compressed)", > dimensions); > return GL_TRUE; > } > - if (compressedteximage_only_format(ctx, internalFormat)) { > + if (_mesa_format_no_online_compression(ctx, internalFormat)) { > _mesa_error(ctx, GL_INVALID_OPERATION, > "glTexImage%dD(no compression for format)", > dimensions); > return GL_TRUE; > @@ -2561,7 +2570,7 @@ texsubimage_error_check(struct gl_context *ctx, > GLuint dimensions, > } > > if (_mesa_is_format_compressed(texImage->TexFormat)) { > - if (compressedteximage_only_format(ctx, texImage->InternalFormat)) { > + if (_mesa_format_no_online_compression(ctx, > texImage->InternalFormat)) { > _mesa_error(ctx, GL_INVALID_OPERATION, > "%s(no compression for format)", callerName); > return GL_TRUE; > @@ -2899,7 +2908,7 @@ copytexsubimage_error_check(struct gl_context *ctx, > GLuint dimensions, > } > > if (_mesa_is_format_compressed(texImage->TexFormat)) { > - if (compressedteximage_only_format(ctx, texImage->InternalFormat)) { > + if (_mesa_format_no_online_compression(ctx, > texImage->InternalFormat)) { > _mesa_error(ctx, GL_INVALID_OPERATION, > "%s(no compression for format)", caller); > return GL_TRUE; > -- > 2.4.2 > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev