Bug 973815 - Implements WebGL draft extension EXT_blend_minmax - r=jgilbert,bzbarsky

This commit is contained in:
Guillaume Abadie 2014-06-14 09:07:53 -07:00
Родитель 2f2dae3d06
Коммит 8b404b63af
9 изменённых файлов: 62 добавлений и 6 удалений

Просмотреть файл

@ -64,6 +64,7 @@ WebGLContext::InitWebGL2()
const WebGLExtensionID sExtensionNativelySupportedArr[] = { const WebGLExtensionID sExtensionNativelySupportedArr[] = {
WebGLExtensionID::ANGLE_instanced_arrays, WebGLExtensionID::ANGLE_instanced_arrays,
WebGLExtensionID::EXT_blend_minmax,
WebGLExtensionID::OES_element_index_uint, WebGLExtensionID::OES_element_index_uint,
WebGLExtensionID::OES_standard_derivatives, WebGLExtensionID::OES_standard_derivatives,
WebGLExtensionID::OES_texture_float, WebGLExtensionID::OES_texture_float,
@ -73,7 +74,6 @@ WebGLContext::InitWebGL2()
WebGLExtensionID::WEBGL_draw_buffers WebGLExtensionID::WEBGL_draw_buffers
}; };
const GLFeature sFeatureRequiredArr[] = { const GLFeature sFeatureRequiredArr[] = {
GLFeature::blend_minmax,
GLFeature::instanced_non_arrays, GLFeature::instanced_non_arrays,
GLFeature::transform_feedback GLFeature::transform_feedback
}; };

Просмотреть файл

@ -31,6 +31,7 @@ WebGLContext::GetExtensionString(WebGLExtensionID ext)
sExtensionNamesEnumeratedArray[WebGLExtensionID::x] = #x; sExtensionNamesEnumeratedArray[WebGLExtensionID::x] = #x;
WEBGL_EXTENSION_IDENTIFIER(ANGLE_instanced_arrays) WEBGL_EXTENSION_IDENTIFIER(ANGLE_instanced_arrays)
WEBGL_EXTENSION_IDENTIFIER(EXT_blend_minmax)
WEBGL_EXTENSION_IDENTIFIER(EXT_color_buffer_half_float) WEBGL_EXTENSION_IDENTIFIER(EXT_color_buffer_half_float)
WEBGL_EXTENSION_IDENTIFIER(EXT_frag_depth) WEBGL_EXTENSION_IDENTIFIER(EXT_frag_depth)
WEBGL_EXTENSION_IDENTIFIER(EXT_sRGB) WEBGL_EXTENSION_IDENTIFIER(EXT_sRGB)
@ -162,16 +163,16 @@ bool WebGLContext::IsExtensionSupported(WebGLExtensionID ext) const
// For warnings-as-errors. // For warnings-as-errors.
break; break;
} }
// Uncomment this switch for any new extensions
#if 0
if (Preferences::GetBool("webgl.enable-draft-extensions", false) || IsWebGL2()) { if (Preferences::GetBool("webgl.enable-draft-extensions", false) || IsWebGL2()) {
switch (ext) { switch (ext) {
case WebGLExtensionID::EXT_blend_minmax:
return WebGLExtensionBlendMinMax::IsSupported(this);
default: default:
// For warnings-as-errors. // For warnings-as-errors.
break; break;
} }
} }
#endif
return false; return false;
} }
@ -330,6 +331,9 @@ WebGLContext::EnableExtension(WebGLExtensionID ext)
case WebGLExtensionID::EXT_frag_depth: case WebGLExtensionID::EXT_frag_depth:
obj = new WebGLExtensionFragDepth(this); obj = new WebGLExtensionFragDepth(this);
break; break;
case WebGLExtensionID::EXT_blend_minmax:
obj = new WebGLExtensionBlendMinMax(this);
break;
default: default:
MOZ_ASSERT(false, "should not get there."); MOZ_ASSERT(false, "should not get there.");
} }

Просмотреть файл

@ -328,8 +328,7 @@ bool WebGLContext::ValidateBlendEquationEnum(GLenum mode, const char *info)
return true; return true;
case LOCAL_GL_MIN: case LOCAL_GL_MIN:
case LOCAL_GL_MAX: case LOCAL_GL_MAX:
if (IsWebGL2()) { if (IsExtensionEnabled(WebGLExtensionID::EXT_blend_minmax)) {
// http://www.opengl.org/registry/specs/EXT/blend_minmax.txt
return true; return true;
} }
break; break;

Просмотреть файл

@ -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)

Просмотреть файл

@ -309,6 +309,18 @@ public:
DECL_WEBGL_EXTENSION_GOOP DECL_WEBGL_EXTENSION_GOOP
}; };
class WebGLExtensionBlendMinMax
: public WebGLExtensionBase
{
public:
WebGLExtensionBlendMinMax(WebGLContext*);
virtual ~WebGLExtensionBlendMinMax();
static bool IsSupported(const WebGLContext*);
DECL_WEBGL_EXTENSION_GOOP
};
} // namespace mozilla } // namespace mozilla
#endif // WEBGLEXTENSIONS_H_ #endif // WEBGLEXTENSIONS_H_

Просмотреть файл

@ -146,6 +146,7 @@ MOZ_END_ENUM_CLASS(WebGLTexImageFunc)
// Please keep extensions in alphabetic order. // Please keep extensions in alphabetic order.
MOZ_BEGIN_ENUM_CLASS(WebGLExtensionID, uint8_t) MOZ_BEGIN_ENUM_CLASS(WebGLExtensionID, uint8_t)
ANGLE_instanced_arrays, ANGLE_instanced_arrays,
EXT_blend_minmax,
EXT_color_buffer_half_float, EXT_color_buffer_half_float,
EXT_frag_depth, EXT_frag_depth,
EXT_sRGB, EXT_sRGB,

Просмотреть файл

@ -45,6 +45,7 @@ if CONFIG['MOZ_WEBGL']:
'WebGLContextVertices.cpp', 'WebGLContextVertices.cpp',
'WebGLElementArrayCache.cpp', 'WebGLElementArrayCache.cpp',
'WebGLExtensionBase.cpp', 'WebGLExtensionBase.cpp',
'WebGLExtensionBlendMinMax.cpp',
'WebGLExtensionColorBufferFloat.cpp', 'WebGLExtensionColorBufferFloat.cpp',
'WebGLExtensionColorBufferHalfFloat.cpp', 'WebGLExtensionColorBufferHalfFloat.cpp',
'WebGLExtensionCompressedTextureATC.cpp', 'WebGLExtensionCompressedTextureATC.cpp',

Просмотреть файл

@ -1489,6 +1489,11 @@ DOMInterfaces = {
'headerFile': 'WebGLExtensions.h' 'headerFile': 'WebGLExtensions.h'
}, },
'WebGLExtensionBlendMinMax': {
'nativeType': 'mozilla::WebGLExtensionBlendMinMax',
'headerFile': 'WebGLExtensions.h'
},
'WebGLFramebuffer': { 'WebGLFramebuffer': {
'nativeType': 'mozilla::WebGLFramebuffer', 'nativeType': 'mozilla::WebGLFramebuffer',
'headerFile': 'WebGLFramebuffer.h' 'headerFile': 'WebGLFramebuffer.h'

Просмотреть файл

@ -959,3 +959,9 @@ interface WebGLExtensionInstancedArrays {
void drawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei primcount); void drawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, GLintptr offset, GLsizei primcount);
void vertexAttribDivisorANGLE(GLuint index, GLuint divisor); void vertexAttribDivisorANGLE(GLuint index, GLuint divisor);
}; };
[NoInterfaceObject]
interface WebGLExtensionBlendMinMax {
const GLenum MIN_EXT = 0x8007;
const GLenum MAX_EXT = 0x8008;
};