author | Jeff Gilbert (:jgilbert) <jgilbert@mozilla.com> |
Tue, 22 Nov 2016 18:59:35 -0800 | |
changeset 442821 | 87e3845768c4cfb946c345848fd5ce15a9ed826c |
parent 442820 | 84f06c4be499a8ecff9a42e9e21d976aa60731cc |
child 537895 | 1b3c25a030b4d991f1b9225fd5a541201afe7d37 |
push id | 36824 |
push user | bmo:jgilbert@mozilla.com |
push date | Wed, 23 Nov 2016 09:05:24 +0000 |
reviewers | ethlin |
bugs | 1250077 |
milestone | 53.0a1 |
--- a/dom/canvas/WebGLContext.h +++ b/dom/canvas/WebGLContext.h @@ -268,16 +268,17 @@ class WebGLContext , public WebGLRectangleObject , public nsWrapperCache { friend class ScopedDrawHelper; friend class ScopedDrawWithTransformFeedback; friend class ScopedFBRebinder; friend class WebGL2Context; friend class WebGLContextUserData; + friend class WebGLExtensionCompressedTextureASTC; friend class WebGLExtensionCompressedTextureATC; friend class WebGLExtensionCompressedTextureES3; friend class WebGLExtensionCompressedTextureETC1; friend class WebGLExtensionCompressedTexturePVRTC; friend class WebGLExtensionCompressedTextureS3TC; friend class WebGLExtensionDepthTexture; friend class WebGLExtensionDisjointTimerQuery; friend class WebGLExtensionDrawBuffers;
--- a/dom/canvas/WebGLContextExtensions.cpp +++ b/dom/canvas/WebGLContextExtensions.cpp @@ -43,16 +43,17 @@ WebGLContext::GetExtensionString(WebGLEx WEBGL_EXTENSION_IDENTIFIER(OES_element_index_uint) WEBGL_EXTENSION_IDENTIFIER(OES_standard_derivatives) WEBGL_EXTENSION_IDENTIFIER(OES_texture_float) WEBGL_EXTENSION_IDENTIFIER(OES_texture_float_linear) WEBGL_EXTENSION_IDENTIFIER(OES_texture_half_float) WEBGL_EXTENSION_IDENTIFIER(OES_texture_half_float_linear) WEBGL_EXTENSION_IDENTIFIER(OES_vertex_array_object) WEBGL_EXTENSION_IDENTIFIER(WEBGL_color_buffer_float) + WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_astc) WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_atc) WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_etc) WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_etc1) WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_pvrtc) WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_s3tc) WEBGL_EXTENSION_IDENTIFIER(WEBGL_debug_renderer_info) WEBGL_EXTENSION_IDENTIFIER(WEBGL_debug_shaders) WEBGL_EXTENSION_IDENTIFIER(WEBGL_depth_texture) @@ -117,16 +118,18 @@ WebGLContext::IsExtensionSupported(WebGL case WebGLExtensionID::EXT_texture_filter_anisotropic: return gl->IsExtensionSupported(gl::GLContext::EXT_texture_filter_anisotropic); // OES_ case WebGLExtensionID::OES_texture_float_linear: return gl->IsSupported(gl::GLFeature::texture_float_linear); // WEBGL_ + case WebGLExtensionID::WEBGL_compressed_texture_astc: + return WebGLExtensionCompressedTextureASTC::IsSupported(this); case WebGLExtensionID::WEBGL_compressed_texture_atc: return gl->IsExtensionSupported(gl::GLContext::AMD_compressed_ATC_texture); case WebGLExtensionID::WEBGL_compressed_texture_etc: return gl->IsSupported(gl::GLFeature::ES3_compatibility); case WebGLExtensionID::WEBGL_compressed_texture_etc1: return gl->IsExtensionSupported(gl::GLContext::OES_compressed_ETC1_RGB8_texture); case WebGLExtensionID::WEBGL_compressed_texture_pvrtc: return gl->IsExtensionSupported(gl::GLContext::IMG_texture_compression_pvrtc); @@ -394,16 +397,19 @@ WebGLContext::EnableExtension(WebGLExten case WebGLExtensionID::OES_vertex_array_object: obj = new WebGLExtensionVertexArray(this); break; // WEBGL_ case WebGLExtensionID::WEBGL_color_buffer_float: obj = new WebGLExtensionColorBufferFloat(this); break; + case WebGLExtensionID::WEBGL_compressed_texture_astc: + obj = new WebGLExtensionCompressedTextureASTC(this); + break; case WebGLExtensionID::WEBGL_compressed_texture_atc: obj = new WebGLExtensionCompressedTextureATC(this); break; case WebGLExtensionID::WEBGL_compressed_texture_etc: obj = new WebGLExtensionCompressedTextureES3(this); break; case WebGLExtensionID::WEBGL_compressed_texture_etc1: obj = new WebGLExtensionCompressedTextureETC1(this);
new file mode 100644 --- /dev/null +++ b/dom/canvas/WebGLExtensionCompressedTextureASTC.cpp @@ -0,0 +1,95 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "WebGLExtensions.h" + +#include "GLContext.h" +#include "mozilla/dom/WebGLRenderingContextBinding.h" +#include "WebGLContext.h" + +namespace mozilla { + +WebGLExtensionCompressedTextureASTC::WebGLExtensionCompressedTextureASTC(WebGLContext* webgl) + : WebGLExtensionBase(webgl) +{ + MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported."); + + RefPtr<WebGLContext> webgl_ = webgl; // Bug 1201275 + const auto fnAdd = [&webgl_](GLenum sizedFormat, webgl::EffectiveFormat effFormat) { + auto& fua = webgl_->mFormatUsage; + + auto usage = fua->EditUsage(effFormat); + usage->isFilterable = true; + fua->AllowSizedTexFormat(sizedFormat, usage); + + webgl_->mCompressedTextureFormats.AppendElement(sizedFormat); + }; + +#define FOO(x) LOCAL_GL_ ## x, webgl::EffectiveFormat::x + + fnAdd(FOO(COMPRESSED_RGBA_ASTC_4x4_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_5x4_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_5x5_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_6x5_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_6x6_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_8x5_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_8x6_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_8x8_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_10x5_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_10x6_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_10x8_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_10x10_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_12x10_KHR)); + fnAdd(FOO(COMPRESSED_RGBA_ASTC_12x12_KHR)); + + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR)); + fnAdd(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR)); + +#undef FOO +} + +WebGLExtensionCompressedTextureASTC::~WebGLExtensionCompressedTextureASTC() +{ +} + +void +WebGLExtensionCompressedTextureASTC::GetSupportedProfiles(dom::Nullable< nsTArray<nsString> >& retval) const +{ + retval.SetNull(); + if (mIsLost) { + mContext->ErrorInvalidOperation("%s: Extension is lost.", + "drawElementsInstancedANGLE"); + return; + } + + nsTArray<nsString>& arr = retval.SetValue(); + arr.AppendElement(NS_LITERAL_STRING("ldr")); + + if (mContext->gl->IsExtensionSupported(gl::GLContext::KHR_texture_compression_astc_hdr)) { + arr.AppendElement(NS_LITERAL_STRING("hdr")); + } +} + +bool +WebGLExtensionCompressedTextureASTC::IsSupported(const WebGLContext* webgl) +{ + gl::GLContext* gl = webgl->GL(); + return gl->IsExtensionSupported(gl::GLContext::KHR_texture_compression_astc_ldr); +} + +IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionCompressedTextureASTC, WEBGL_compressed_texture_astc) + +} // namespace mozilla
--- a/dom/canvas/WebGLExtensions.h +++ b/dom/canvas/WebGLExtensions.h @@ -2,25 +2,27 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef WEBGL_EXTENSIONS_H_ #define WEBGL_EXTENSIONS_H_ #include "mozilla/AlreadyAddRefed.h" +#include "nsString.h" +#include "nsTArray.h" #include "nsWrapperCache.h" #include "WebGLObjectModel.h" #include "WebGLTypes.h" namespace mozilla { namespace dom { -template<typename T> -class Sequence; +template<typename> struct Nullable; +template<typename> class Sequence; } // namespace dom namespace webgl { class FormatUsageAuthority; } // namespace webgl class WebGLContext; class WebGLShader; @@ -55,16 +57,32 @@ protected: virtual JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) override; #define IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionType, WebGLBindingType)\ JSObject* \ WebGLExtensionType::WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) { \ return dom::WebGLBindingType##Binding::Wrap(cx, this, givenProto); \ } +//// + +class WebGLExtensionCompressedTextureASTC + : public WebGLExtensionBase +{ +public: + explicit WebGLExtensionCompressedTextureASTC(WebGLContext* webgl); + virtual ~WebGLExtensionCompressedTextureASTC(); + + void GetSupportedProfiles(dom::Nullable< nsTArray<nsString> >& retval) const; + + static bool IsSupported(const WebGLContext* webgl); + + DECL_WEBGL_EXTENSION_GOOP +}; + class WebGLExtensionCompressedTextureATC : public WebGLExtensionBase { public: explicit WebGLExtensionCompressedTextureATC(WebGLContext*); virtual ~WebGLExtensionCompressedTextureATC(); DECL_WEBGL_EXTENSION_GOOP
--- a/dom/canvas/WebGLFormats.cpp +++ b/dom/canvas/WebGLFormats.cpp @@ -108,16 +108,47 @@ InitCompressedFormatInfo() AddCompressedFormatInfo(EffectiveFormat::ATC_RGBA_INTERPOLATED_ALPHA_AMD, 128, 4, 4, CompressionFamily::ATC); // EXT_texture_compression_s3tc AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGB_S3TC_DXT1_EXT , 64, 4, 4, CompressionFamily::S3TC); AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_S3TC_DXT1_EXT, 64, 4, 4, CompressionFamily::S3TC); AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_S3TC_DXT3_EXT, 128, 4, 4, CompressionFamily::S3TC); AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_S3TC_DXT5_EXT, 128, 4, 4, CompressionFamily::S3TC); + // KHR_texture_compression_astc_ldr + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_4x4_KHR , 128, 4, 4, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_5x4_KHR , 128, 5, 4, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_5x5_KHR , 128, 5, 5, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_6x5_KHR , 128, 6, 5, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_6x6_KHR , 128, 6, 6, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_8x5_KHR , 128, 8, 5, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_8x6_KHR , 128, 8, 6, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_8x8_KHR , 128, 8, 8, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_10x5_KHR , 128, 10, 5, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_10x6_KHR , 128, 10, 6, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_10x8_KHR , 128, 10, 8, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_10x10_KHR , 128, 10, 10, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_12x10_KHR , 128, 12, 10, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_ASTC_12x12_KHR , 128, 12, 12, CompressionFamily::ASTC); + + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR , 128, 4, 4, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR , 128, 5, 4, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR , 128, 5, 5, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR , 128, 6, 5, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR , 128, 6, 6, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR , 128, 8, 5, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR , 128, 8, 6, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR , 128, 8, 8, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR , 128, 10, 5, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR , 128, 10, 6, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR , 128, 10, 8, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 128, 10, 10, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 128, 12, 10, CompressionFamily::ASTC); + AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 128, 12, 12, CompressionFamily::ASTC); + // IMG_texture_compression_pvrtc AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGB_PVRTC_4BPPV1 , 256, 8, 8, CompressionFamily::PVRTC); AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_PVRTC_4BPPV1, 256, 8, 8, CompressionFamily::PVRTC); AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGB_PVRTC_2BPPV1 , 256, 16, 8, CompressionFamily::PVRTC); AddCompressedFormatInfo(EffectiveFormat::COMPRESSED_RGBA_PVRTC_2BPPV1, 256, 16, 8, CompressionFamily::PVRTC); // OES_compressed_ETC1_RGB8_texture AddCompressedFormatInfo(EffectiveFormat::ETC1_RGB8_OES, 64, 4, 4, CompressionFamily::ETC1); @@ -287,16 +318,47 @@ InitFormatInfo() AddFormatInfo(FOO(ATC_RGBA_INTERPOLATED_ALPHA_AMD), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); // EXT_texture_compression_s3tc AddFormatInfo(FOO(COMPRESSED_RGB_S3TC_DXT1_EXT ), 0, 1,1,1,0, 0,0, UnsizedFormat::RGB , false, ComponentType::NormUInt); AddFormatInfo(FOO(COMPRESSED_RGBA_S3TC_DXT1_EXT), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); AddFormatInfo(FOO(COMPRESSED_RGBA_S3TC_DXT3_EXT), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); AddFormatInfo(FOO(COMPRESSED_RGBA_S3TC_DXT5_EXT), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + // KHR_texture_compression_astc_ldr + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_4x4_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_5x4_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_5x5_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_6x5_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_6x6_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_8x5_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_8x6_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_8x8_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_10x5_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_10x6_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_10x8_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_10x10_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_12x10_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_RGBA_ASTC_12x12_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); + + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR ), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + AddFormatInfo(FOO(COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, true , ComponentType::NormUInt); + // IMG_texture_compression_pvrtc AddFormatInfo(FOO(COMPRESSED_RGB_PVRTC_4BPPV1 ), 0, 1,1,1,0, 0,0, UnsizedFormat::RGB , false, ComponentType::NormUInt); AddFormatInfo(FOO(COMPRESSED_RGBA_PVRTC_4BPPV1), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); AddFormatInfo(FOO(COMPRESSED_RGB_PVRTC_2BPPV1 ), 0, 1,1,1,0, 0,0, UnsizedFormat::RGB , false, ComponentType::NormUInt); AddFormatInfo(FOO(COMPRESSED_RGBA_PVRTC_2BPPV1), 0, 1,1,1,1, 0,0, UnsizedFormat::RGBA, false, ComponentType::NormUInt); // OES_compressed_ETC1_RGB8_texture AddFormatInfo(FOO(ETC1_RGB8_OES), 0, 1,1,1,0, 0,0, UnsizedFormat::RGB, false, ComponentType::NormUInt);
--- a/dom/canvas/WebGLFormats.h +++ b/dom/canvas/WebGLFormats.h @@ -114,16 +114,47 @@ enum class EffectiveFormat : EffectiveFo ATC_RGBA_INTERPOLATED_ALPHA_AMD, // EXT_texture_compression_s3tc COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT, + // KHR_texture_compression_astc_ldr + COMPRESSED_RGBA_ASTC_4x4_KHR, + COMPRESSED_RGBA_ASTC_5x4_KHR, + COMPRESSED_RGBA_ASTC_5x5_KHR, + COMPRESSED_RGBA_ASTC_6x5_KHR, + COMPRESSED_RGBA_ASTC_6x6_KHR, + COMPRESSED_RGBA_ASTC_8x5_KHR, + COMPRESSED_RGBA_ASTC_8x6_KHR, + COMPRESSED_RGBA_ASTC_8x8_KHR, + COMPRESSED_RGBA_ASTC_10x5_KHR, + COMPRESSED_RGBA_ASTC_10x6_KHR, + COMPRESSED_RGBA_ASTC_10x8_KHR, + COMPRESSED_RGBA_ASTC_10x10_KHR, + COMPRESSED_RGBA_ASTC_12x10_KHR, + COMPRESSED_RGBA_ASTC_12x12_KHR, + + COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, + COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, + // IMG_texture_compression_pvrtc COMPRESSED_RGB_PVRTC_4BPPV1, COMPRESSED_RGBA_PVRTC_4BPPV1, COMPRESSED_RGB_PVRTC_2BPPV1, COMPRESSED_RGBA_PVRTC_2BPPV1, // OES_compressed_ETC1_RGB8_texture ETC1_RGB8_OES, @@ -168,21 +199,22 @@ enum class ComponentType : uint8_t { UInt, // RGBA32UI, STENCIL_INDEX8 NormInt, // RGBA8_SNORM NormUInt, // RGBA8, DEPTH_COMPONENT16 Float, // RGBA32F Special, // DEPTH24_STENCIL8 }; enum class CompressionFamily : uint8_t { - ETC1, - ES3, // ETC2 or EAC + ASTC, ATC, + ES3, // ETC2 or EAC + ETC1, + PVRTC, S3TC, - PVRTC, }; //////////////////////////////////////////////////////////////////////////////// struct CompressedFormatInfo { const EffectiveFormat effectiveFormat; const uint8_t bytesPerBlock;
--- a/dom/canvas/WebGLTextureUpload.cpp +++ b/dom/canvas/WebGLTextureUpload.cpp @@ -934,16 +934,26 @@ ValidateCompressedTexImageRestrictions(c if (level == 0) return false; return (size == 0 || size == 1 || size == 2); }; switch (format->compression->family) { + case webgl::CompressionFamily::ASTC: + if (target == LOCAL_GL_TEXTURE_3D && + !webgl->gl->IsExtensionSupported(gl::GLContext::KHR_texture_compression_astc_hdr)) + { + webgl->ErrorInvalidOperation("%s: TEXTURE_3D requires ASTC's hdr profile.", + funcName); + return false; + } + break; + case webgl::CompressionFamily::PVRTC: if (!IsPowerOfTwo(width) || !IsPowerOfTwo(height)) { webgl->ErrorInvalidValue("%s: %s requires power-of-two width and height.", funcName, format->name); return false; } break;
--- a/dom/canvas/WebGLTypes.h +++ b/dom/canvas/WebGLTypes.h @@ -152,16 +152,17 @@ enum class WebGLExtensionID : uint8_t { OES_element_index_uint, OES_standard_derivatives, OES_texture_float, OES_texture_float_linear, OES_texture_half_float, OES_texture_half_float_linear, OES_vertex_array_object, WEBGL_color_buffer_float, + WEBGL_compressed_texture_astc, WEBGL_compressed_texture_atc, WEBGL_compressed_texture_etc, WEBGL_compressed_texture_etc1, WEBGL_compressed_texture_pvrtc, WEBGL_compressed_texture_s3tc, WEBGL_debug_renderer_info, WEBGL_debug_shaders, WEBGL_depth_texture,
--- a/dom/canvas/moz.build +++ b/dom/canvas/moz.build @@ -103,16 +103,17 @@ UNIFIED_SOURCES += [ 'WebGLContextValidate.cpp', 'WebGLContextVertexArray.cpp', 'WebGLContextVertices.cpp', 'WebGLElementArrayCache.cpp', 'WebGLExtensionBase.cpp', 'WebGLExtensionBlendMinMax.cpp', 'WebGLExtensionColorBufferFloat.cpp', 'WebGLExtensionColorBufferHalfFloat.cpp', + 'WebGLExtensionCompressedTextureASTC.cpp', 'WebGLExtensionCompressedTextureATC.cpp', 'WebGLExtensionCompressedTextureES3.cpp', 'WebGLExtensionCompressedTextureETC1.cpp', 'WebGLExtensionCompressedTexturePVRTC.cpp', 'WebGLExtensionCompressedTextureS3TC.cpp', 'WebGLExtensionDebugRendererInfo.cpp', 'WebGLExtensionDebugShaders.cpp', 'WebGLExtensionDepthTexture.cpp',
--- a/gfx/gl/GLContext.cpp +++ b/gfx/gl/GLContext.cpp @@ -152,16 +152,18 @@ static const char* const sExtensionNames "GL_EXT_texture_storage", "GL_EXT_timer_query", "GL_EXT_transform_feedback", "GL_EXT_unpack_subimage", "GL_IMG_read_format", "GL_IMG_texture_compression_pvrtc", "GL_IMG_texture_npot", "GL_KHR_debug", + "GL_KHR_texture_compression_astc_hdr", + "GL_KHR_texture_compression_astc_ldr", "GL_NV_draw_instanced", "GL_NV_fence", "GL_NV_framebuffer_blit", "GL_NV_geometry_program4", "GL_NV_half_float", "GL_NV_instanced_arrays", "GL_NV_primitive_restart", "GL_NV_texture_barrier",
--- a/gfx/gl/GLContext.h +++ b/gfx/gl/GLContext.h @@ -475,16 +475,18 @@ public: EXT_texture_storage, EXT_timer_query, EXT_transform_feedback, EXT_unpack_subimage, IMG_read_format, IMG_texture_compression_pvrtc, IMG_texture_npot, KHR_debug, + KHR_texture_compression_astc_hdr, + KHR_texture_compression_astc_ldr, NV_draw_instanced, NV_fence, NV_framebuffer_blit, NV_geometry_program4, NV_half_float, NV_instanced_arrays, NV_primitive_restart, NV_texture_barrier,