From 8b404b63af1526fd618923c0e8e6d4a550833254 Mon Sep 17 00:00:00 2001 From: Guillaume Abadie Date: Sat, 14 Jun 2014 09:07:53 -0700 Subject: [PATCH] Bug 973815 - Implements WebGL draft extension EXT_blend_minmax - r=jgilbert,bzbarsky --- content/canvas/src/WebGL2Context.cpp | 2 +- content/canvas/src/WebGLContextExtensions.cpp | 10 +++++-- content/canvas/src/WebGLContextValidate.cpp | 3 +- .../canvas/src/WebGLExtensionBlendMinMax.cpp | 28 +++++++++++++++++++ content/canvas/src/WebGLExtensions.h | 12 ++++++++ content/canvas/src/WebGLTypes.h | 1 + content/canvas/src/moz.build | 1 + dom/bindings/Bindings.conf | 5 ++++ dom/webidl/WebGLRenderingContext.webidl | 6 ++++ 9 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 content/canvas/src/WebGLExtensionBlendMinMax.cpp diff --git a/content/canvas/src/WebGL2Context.cpp b/content/canvas/src/WebGL2Context.cpp index c27ab6497db7..d68bbf01b72e 100644 --- a/content/canvas/src/WebGL2Context.cpp +++ b/content/canvas/src/WebGL2Context.cpp @@ -64,6 +64,7 @@ WebGLContext::InitWebGL2() const WebGLExtensionID sExtensionNativelySupportedArr[] = { WebGLExtensionID::ANGLE_instanced_arrays, + WebGLExtensionID::EXT_blend_minmax, WebGLExtensionID::OES_element_index_uint, WebGLExtensionID::OES_standard_derivatives, WebGLExtensionID::OES_texture_float, @@ -73,7 +74,6 @@ WebGLContext::InitWebGL2() WebGLExtensionID::WEBGL_draw_buffers }; const GLFeature sFeatureRequiredArr[] = { - GLFeature::blend_minmax, GLFeature::instanced_non_arrays, GLFeature::transform_feedback }; diff --git a/content/canvas/src/WebGLContextExtensions.cpp b/content/canvas/src/WebGLContextExtensions.cpp index 76f0e3bfcc71..9577d550a77a 100644 --- a/content/canvas/src/WebGLContextExtensions.cpp +++ b/content/canvas/src/WebGLContextExtensions.cpp @@ -31,6 +31,7 @@ WebGLContext::GetExtensionString(WebGLExtensionID ext) sExtensionNamesEnumeratedArray[WebGLExtensionID::x] = #x; WEBGL_EXTENSION_IDENTIFIER(ANGLE_instanced_arrays) + WEBGL_EXTENSION_IDENTIFIER(EXT_blend_minmax) WEBGL_EXTENSION_IDENTIFIER(EXT_color_buffer_half_float) WEBGL_EXTENSION_IDENTIFIER(EXT_frag_depth) WEBGL_EXTENSION_IDENTIFIER(EXT_sRGB) @@ -162,16 +163,16 @@ bool WebGLContext::IsExtensionSupported(WebGLExtensionID ext) const // For warnings-as-errors. break; } -// Uncomment this switch for any new extensions -#if 0 + if (Preferences::GetBool("webgl.enable-draft-extensions", false) || IsWebGL2()) { switch (ext) { + case WebGLExtensionID::EXT_blend_minmax: + return WebGLExtensionBlendMinMax::IsSupported(this); default: // For warnings-as-errors. break; } } -#endif return false; } @@ -330,6 +331,9 @@ WebGLContext::EnableExtension(WebGLExtensionID ext) case WebGLExtensionID::EXT_frag_depth: obj = new WebGLExtensionFragDepth(this); break; + case WebGLExtensionID::EXT_blend_minmax: + obj = new WebGLExtensionBlendMinMax(this); + break; default: MOZ_ASSERT(false, "should not get there."); } diff --git a/content/canvas/src/WebGLContextValidate.cpp b/content/canvas/src/WebGLContextValidate.cpp index b041a05507bd..8b16ed8cc8d2 100644 --- a/content/canvas/src/WebGLContextValidate.cpp +++ b/content/canvas/src/WebGLContextValidate.cpp @@ -328,8 +328,7 @@ bool WebGLContext::ValidateBlendEquationEnum(GLenum mode, const char *info) return true; case LOCAL_GL_MIN: case LOCAL_GL_MAX: - if (IsWebGL2()) { - // http://www.opengl.org/registry/specs/EXT/blend_minmax.txt + if (IsExtensionEnabled(WebGLExtensionID::EXT_blend_minmax)) { return true; } break; diff --git a/content/canvas/src/WebGLExtensionBlendMinMax.cpp b/content/canvas/src/WebGLExtensionBlendMinMax.cpp new file mode 100644 index 000000000000..a8697b8aecd8 --- /dev/null +++ b/content/canvas/src/WebGLExtensionBlendMinMax.cpp @@ -0,0 +1,28 @@ +/* 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 "WebGLContext.h" +#include "WebGLExtensions.h" + +#include "GLContext.h" + +#include "mozilla/dom/WebGLRenderingContextBinding.h" + +using namespace mozilla; + +WebGLExtensionBlendMinMax::WebGLExtensionBlendMinMax(WebGLContext* context) + : WebGLExtensionBase(context) +{ +} + +WebGLExtensionBlendMinMax::~WebGLExtensionBlendMinMax() +{ +} + +bool WebGLExtensionBlendMinMax::IsSupported(const WebGLContext* context) +{ + return context->GL()->IsSupported(gl::GLFeature::blend_minmax); +} + +IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionBlendMinMax) diff --git a/content/canvas/src/WebGLExtensions.h b/content/canvas/src/WebGLExtensions.h index f3cf53461114..0dd847293bdd 100644 --- a/content/canvas/src/WebGLExtensions.h +++ b/content/canvas/src/WebGLExtensions.h @@ -309,6 +309,18 @@ public: DECL_WEBGL_EXTENSION_GOOP }; +class WebGLExtensionBlendMinMax + : public WebGLExtensionBase +{ +public: + WebGLExtensionBlendMinMax(WebGLContext*); + virtual ~WebGLExtensionBlendMinMax(); + + static bool IsSupported(const WebGLContext*); + + DECL_WEBGL_EXTENSION_GOOP +}; + } // namespace mozilla #endif // WEBGLEXTENSIONS_H_ diff --git a/content/canvas/src/WebGLTypes.h b/content/canvas/src/WebGLTypes.h index 257a0a82dd10..e4bf6a0ae034 100644 --- a/content/canvas/src/WebGLTypes.h +++ b/content/canvas/src/WebGLTypes.h @@ -146,6 +146,7 @@ MOZ_END_ENUM_CLASS(WebGLTexImageFunc) // Please keep extensions in alphabetic order. MOZ_BEGIN_ENUM_CLASS(WebGLExtensionID, uint8_t) ANGLE_instanced_arrays, + EXT_blend_minmax, EXT_color_buffer_half_float, EXT_frag_depth, EXT_sRGB, diff --git a/content/canvas/src/moz.build b/content/canvas/src/moz.build index dff36a4ddbc5..968fcc1289d1 100644 --- a/content/canvas/src/moz.build +++ b/content/canvas/src/moz.build @@ -45,6 +45,7 @@ if CONFIG['MOZ_WEBGL']: 'WebGLContextVertices.cpp', 'WebGLElementArrayCache.cpp', 'WebGLExtensionBase.cpp', + 'WebGLExtensionBlendMinMax.cpp', 'WebGLExtensionColorBufferFloat.cpp', 'WebGLExtensionColorBufferHalfFloat.cpp', 'WebGLExtensionCompressedTextureATC.cpp', diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index 30a594f337de..1b71956fa442 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -1489,6 +1489,11 @@ DOMInterfaces = { 'headerFile': 'WebGLExtensions.h' }, +'WebGLExtensionBlendMinMax': { + 'nativeType': 'mozilla::WebGLExtensionBlendMinMax', + 'headerFile': 'WebGLExtensions.h' +}, + 'WebGLFramebuffer': { 'nativeType': 'mozilla::WebGLFramebuffer', 'headerFile': 'WebGLFramebuffer.h' diff --git a/dom/webidl/WebGLRenderingContext.webidl b/dom/webidl/WebGLRenderingContext.webidl index 9107402f4e0e..1ca4ccd2bb4d 100644 --- a/dom/webidl/WebGLRenderingContext.webidl +++ b/dom/webidl/WebGLRenderingContext.webidl @@ -959,3 +959,9 @@ interface WebGLExtensionInstancedArrays { void drawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei primcount); void vertexAttribDivisorANGLE(GLuint index, GLuint divisor); }; + +[NoInterfaceObject] +interface WebGLExtensionBlendMinMax { + const GLenum MIN_EXT = 0x8007; + const GLenum MAX_EXT = 0x8008; +};