r?jrmuizel - Implement EXT_color_buffer_float. draft
authorJeff Gilbert <jdashg@gmail.com>
Wed, 04 May 2016 16:39:02 -0700
changeset 363550 229efebf4373b96dde35487d1e2331efdcf0396b
parent 363549 be27946d26c937b18ef19689982f7d10fe5d2e5f
child 520069 35bbb5e6e0be10212c06f7eba8592b4e9e3d0752
push id17237
push userjgilbert@mozilla.com
push dateThu, 05 May 2016 01:04:54 +0000
bugs100644
milestone49.0a1
r?jrmuizel - Implement EXT_color_buffer_float. From a08577ac23b09bda05f8f1da2a9f31c6896d66fa Mon Sep 17 00:00:00 2001 --- dom/canvas/WebGLContextExtensions.cpp | 17 +++++++- dom/canvas/WebGLExtensionEXTColorBufferFloat.cpp | 51 ++++++++++++++++++++++++ dom/canvas/WebGLExtensions.h | 12 ++++++ dom/canvas/WebGLProgram.cpp | 1 + dom/canvas/WebGLTypes.h | 1 + dom/canvas/moz.build | 1 + gfx/gl/GLContext.h | 1 + gfx/gl/GLContextFeatures.cpp | 10 +++++ 8 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 dom/canvas/WebGLExtensionEXTColorBufferFloat.cpp MozReview-Commit-ID: CdycrvAZfEA
dom/canvas/WebGLContextExtensions.cpp
dom/canvas/WebGLExtensionEXTColorBufferFloat.cpp
dom/canvas/WebGLExtensions.h
dom/canvas/WebGLProgram.cpp
dom/canvas/WebGLTypes.h
dom/canvas/moz.build
gfx/gl/GLContext.h
gfx/gl/GLContextFeatures.cpp
--- a/dom/canvas/WebGLContextExtensions.cpp
+++ b/dom/canvas/WebGLContextExtensions.cpp
@@ -27,16 +27,17 @@ WebGLContext::GetExtensionString(WebGLEx
     if (!initialized) {
         initialized = true;
 
 #define WEBGL_EXTENSION_IDENTIFIER(x) \
         sExtensionNamesEnumeratedArray[WebGLExtensionID::x] = #x;
 
         WEBGL_EXTENSION_IDENTIFIER(ANGLE_instanced_arrays)
         WEBGL_EXTENSION_IDENTIFIER(EXT_blend_minmax)
+        WEBGL_EXTENSION_IDENTIFIER(EXT_color_buffer_float)
         WEBGL_EXTENSION_IDENTIFIER(EXT_color_buffer_half_float)
         WEBGL_EXTENSION_IDENTIFIER(EXT_frag_depth)
         WEBGL_EXTENSION_IDENTIFIER(EXT_shader_texture_lod)
         WEBGL_EXTENSION_IDENTIFIER(EXT_sRGB)
         WEBGL_EXTENSION_IDENTIFIER(EXT_texture_filter_anisotropic)
         WEBGL_EXTENSION_IDENTIFIER(EXT_disjoint_timer_query)
         WEBGL_EXTENSION_IDENTIFIER(OES_element_index_uint)
         WEBGL_EXTENSION_IDENTIFIER(OES_standard_derivatives)
@@ -146,17 +147,28 @@ WebGLContext::IsExtensionSupported(WebGL
         // We always support this extension.
         return true;
 
     default:
         // For warnings-as-errors.
         break;
     }
 
-    if (!IsWebGL2()) {
+    if (IsWebGL2()) {
+        // WebGL2-only extensions
+        switch (ext) {
+        // EXT_
+        case WebGLExtensionID::EXT_color_buffer_float:
+            return WebGLExtensionEXTColorBufferFloat::IsSupported(this);
+
+        default:
+            // For warnings-as-errors.
+            break;
+        }
+    } else {
         // WebGL1-only extensions
         switch (ext) {
         // ANGLE_
         case WebGLExtensionID::ANGLE_instanced_arrays:
             return WebGLExtensionInstancedArrays::IsSupported(this);
 
         // EXT_
         case WebGLExtensionID::EXT_blend_minmax:
@@ -326,16 +338,19 @@ WebGLContext::EnableExtension(WebGLExten
     case WebGLExtensionID::ANGLE_instanced_arrays:
         obj = new WebGLExtensionInstancedArrays(this);
         break;
 
     // EXT_
     case WebGLExtensionID::EXT_blend_minmax:
         obj = new WebGLExtensionBlendMinMax(this);
         break;
+    case WebGLExtensionID::EXT_color_buffer_float:
+        obj = new WebGLExtensionEXTColorBufferFloat(this);
+        break;
     case WebGLExtensionID::EXT_color_buffer_half_float:
         obj = new WebGLExtensionColorBufferHalfFloat(this);
         break;
     case WebGLExtensionID::EXT_disjoint_timer_query:
         obj = new WebGLExtensionDisjointTimerQuery(this);
         break;
     case WebGLExtensionID::EXT_frag_depth:
         obj = new WebGLExtensionFragDepth(this);
new file mode 100644
--- /dev/null
+++ b/dom/canvas/WebGLExtensionEXTColorBufferFloat.cpp
@@ -0,0 +1,51 @@
+/* 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/WebGL2RenderingContextBinding.h"
+#include "WebGLContext.h"
+#include "WebGLFormats.h"
+
+namespace mozilla {
+
+WebGLExtensionEXTColorBufferFloat::WebGLExtensionEXTColorBufferFloat(WebGLContext* webgl)
+    : WebGLExtensionBase(webgl)
+{
+    MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
+
+    auto& fua = webgl->mFormatUsage;
+
+    auto fnUpdateUsage = [&fua](GLenum sizedFormat, webgl::EffectiveFormat effFormat) {
+        auto usage = fua->EditUsage(effFormat);
+        usage->isRenderable = true;
+        fua->AllowRBFormat(sizedFormat, usage);
+    };
+
+#define FOO(x) fnUpdateUsage(LOCAL_GL_ ## x, webgl::EffectiveFormat::x)
+
+    FOO(R16F);
+    FOO(RG16F);
+    FOO(RGBA16F);
+
+    FOO(R32F);
+    FOO(RG32F);
+    FOO(RGBA32F);
+
+    FOO(R11F_G11F_B10F);
+
+#undef FOO
+}
+
+/*static*/ bool
+WebGLExtensionEXTColorBufferFloat::IsSupported(const WebGLContext* webgl)
+{
+    const gl::GLContext* gl = webgl->GL();
+    return gl->IsSupported(gl::GLFeature::EXT_color_buffer_float);
+}
+
+IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionEXTColorBufferFloat, EXT_color_buffer_float)
+
+} // namespace mozilla
--- a/dom/canvas/WebGLExtensions.h
+++ b/dom/canvas/WebGLExtensions.h
@@ -148,16 +148,28 @@ class WebGLExtensionElementIndexUint
 {
 public:
     explicit WebGLExtensionElementIndexUint(WebGLContext*);
     virtual ~WebGLExtensionElementIndexUint();
 
     DECL_WEBGL_EXTENSION_GOOP
 };
 
+class WebGLExtensionEXTColorBufferFloat
+    : public WebGLExtensionBase
+{
+public:
+    explicit WebGLExtensionEXTColorBufferFloat(WebGLContext*);
+    virtual ~WebGLExtensionEXTColorBufferFloat() { }
+
+    static bool IsSupported(const WebGLContext*);
+
+    DECL_WEBGL_EXTENSION_GOOP
+};
+
 class WebGLExtensionFragDepth
     : public WebGLExtensionBase
 {
 public:
     explicit WebGLExtensionFragDepth(WebGLContext*);
     virtual ~WebGLExtensionFragDepth();
 
     static bool IsSupported(const WebGLContext* context);
--- a/dom/canvas/WebGLProgram.cpp
+++ b/dom/canvas/WebGLProgram.cpp
@@ -5,16 +5,17 @@
 
 #include "WebGLProgram.h"
 
 #include "GLContext.h"
 #include "mozilla/CheckedInt.h"
 #include "mozilla/dom/WebGL2RenderingContextBinding.h"
 #include "mozilla/dom/WebGLRenderingContextBinding.h"
 #include "mozilla/RefPtr.h"
+#include "nsPrintfCString.h"
 #include "WebGLActiveInfo.h"
 #include "WebGLContext.h"
 #include "WebGLShader.h"
 #include "WebGLUniformLocation.h"
 #include "WebGLValidateStrings.h"
 
 namespace mozilla {
 
--- a/dom/canvas/WebGLTypes.h
+++ b/dom/canvas/WebGLTypes.h
@@ -134,16 +134,17 @@ enum class WebGLTexDimensions : uint8_t 
     Tex2D,
     Tex3D
 };
 
 // Please keep extensions in alphabetic order.
 enum class WebGLExtensionID : uint8_t {
     ANGLE_instanced_arrays,
     EXT_blend_minmax,
+    EXT_color_buffer_float,
     EXT_color_buffer_half_float,
     EXT_frag_depth,
     EXT_sRGB,
     EXT_shader_texture_lod,
     EXT_texture_filter_anisotropic,
     EXT_disjoint_timer_query,
     OES_element_index_uint,
     OES_standard_derivatives,
--- a/dom/canvas/moz.build
+++ b/dom/canvas/moz.build
@@ -106,16 +106,17 @@ UNIFIED_SOURCES += [
     'WebGLExtensionCompressedTexturePVRTC.cpp',
     'WebGLExtensionCompressedTextureS3TC.cpp',
     'WebGLExtensionDebugRendererInfo.cpp',
     'WebGLExtensionDebugShaders.cpp',
     'WebGLExtensionDepthTexture.cpp',
     'WebGLExtensionDisjointTimerQuery.cpp',
     'WebGLExtensionDrawBuffers.cpp',
     'WebGLExtensionElementIndexUint.cpp',
+    'WebGLExtensionEXTColorBufferFloat.cpp',
     'WebGLExtensionFragDepth.cpp',
     'WebGLExtensionInstancedArrays.cpp',
     'WebGLExtensionLoseContext.cpp',
     'WebGLExtensionShaderTextureLod.cpp',
     'WebGLExtensionSRGB.cpp',
     'WebGLExtensionStandardDerivatives.cpp',
     'WebGLExtensionTextureFilterAnisotropic.cpp',
     'WebGLExtensionTextureFloat.cpp',
--- a/gfx/gl/GLContext.h
+++ b/gfx/gl/GLContext.h
@@ -90,16 +90,17 @@ enum class GLFeature {
     copy_buffer,
     depth_texture,
     draw_buffers,
     draw_instanced,
     draw_range_elements,
     element_index_uint,
     ES2_compatibility,
     ES3_compatibility,
+    EXT_color_buffer_float,
     frag_color_float,
     frag_depth,
     framebuffer_blit,
     framebuffer_multisample,
     framebuffer_object,
     framebuffer_object_EXT_OES,
     get_integer_indexed,
     get_integer64_indexed,
--- a/gfx/gl/GLContextFeatures.cpp
+++ b/gfx/gl/GLContextFeatures.cpp
@@ -182,16 +182,26 @@ static const FeatureInfo sFeatureInfoArr
         kGLCoreVersionForES3Compat,
         GLESVersion::ES3, // OpenGL ES version
         GLContext::ARB_ES3_compatibility, // no suffix on ARB extension
         {
             GLContext::Extensions_End
         }
     },
     {
+        "EXT_color_buffer_float",
+        GLVersion::GL3,
+        GLESVersion::NONE,
+        GLContext::Extension_None,
+        {
+            GLContext::EXT_color_buffer_float,
+            GLContext::Extensions_End
+        }
+    },
+    {
         // Removes clamping for float color outputs from frag shaders.
         "frag_color_float",
         GLVersion::GL3,
         GLESVersion::ES3,
         GLContext::Extension_None,
         {
             GLContext::ARB_color_buffer_float,
             GLContext::EXT_color_buffer_float,