summaryrefslogtreecommitdiffstats
path: root/dom/canvas/WebGLExtensions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/canvas/WebGLExtensions.cpp')
-rw-r--r--dom/canvas/WebGLExtensions.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/dom/canvas/WebGLExtensions.cpp b/dom/canvas/WebGLExtensions.cpp
new file mode 100644
index 0000000000..0528f4f8b0
--- /dev/null
+++ b/dom/canvas/WebGLExtensions.cpp
@@ -0,0 +1,158 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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 "mozilla/StaticPrefs_webgl.h"
+#include "WebGLContext.h"
+
+namespace mozilla {
+
+WebGLExtensionBlendMinMax::WebGLExtensionBlendMinMax(WebGLContext* webgl)
+ : WebGLExtensionBase(webgl) {
+ MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
+}
+
+bool WebGLExtensionBlendMinMax::IsSupported(const WebGLContext* webgl) {
+ if (webgl->IsWebGL2()) return false;
+
+ return webgl->GL()->IsSupported(gl::GLFeature::blend_minmax);
+}
+
+// -
+
+WebGLExtensionExplicitPresent::WebGLExtensionExplicitPresent(
+ WebGLContext* const webgl)
+ : WebGLExtensionBase(webgl) {
+ if (!IsSupported(webgl)) {
+ NS_WARNING(
+ "Constructing WebGLExtensionExplicitPresent but IsSupported() is "
+ "false!");
+ // This was previously an assert, but it seems like we get races against
+ // StaticPrefs changes/initialization?
+ }
+}
+
+bool WebGLExtensionExplicitPresent::IsSupported(
+ const WebGLContext* const webgl) {
+ return StaticPrefs::webgl_enable_draft_extensions();
+}
+
+// -
+
+WebGLExtensionFloatBlend::WebGLExtensionFloatBlend(WebGLContext* const webgl)
+ : WebGLExtensionBase(webgl) {
+ MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
+}
+
+bool WebGLExtensionFloatBlend::IsSupported(const WebGLContext* const webgl) {
+ if (!WebGLExtensionColorBufferFloat::IsSupported(webgl) &&
+ !WebGLExtensionEXTColorBufferFloat::IsSupported(webgl))
+ return false;
+
+ const auto& gl = webgl->gl;
+ if (!gl->IsGLES() && gl->Version() >= 300) return true;
+ if (gl->IsGLES() && gl->Version() >= 320) return true;
+ return gl->IsExtensionSupported(gl::GLContext::EXT_float_blend);
+}
+
+// -
+
+WebGLExtensionFBORenderMipmap::WebGLExtensionFBORenderMipmap(
+ WebGLContext* const webgl)
+ : WebGLExtensionBase(webgl) {
+ MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
+}
+
+bool WebGLExtensionFBORenderMipmap::IsSupported(
+ const WebGLContext* const webgl) {
+ if (webgl->IsWebGL2()) return false;
+
+ const auto& gl = webgl->gl;
+ if (!gl->IsGLES()) return true;
+ if (gl->Version() >= 300) return true;
+ return gl->IsExtensionSupported(gl::GLContext::OES_fbo_render_mipmap);
+}
+
+// -
+
+WebGLExtensionMultiview::WebGLExtensionMultiview(WebGLContext* const webgl)
+ : WebGLExtensionBase(webgl) {
+ MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
+}
+
+bool WebGLExtensionMultiview::IsSupported(const WebGLContext* const webgl) {
+ if (!webgl->IsWebGL2()) return false;
+
+ const auto& gl = webgl->gl;
+ return gl->IsSupported(gl::GLFeature::multiview);
+}
+
+// -
+
+bool WebGLExtensionTextureNorm16::IsSupported(const WebGLContext* const webgl) {
+ if (!StaticPrefs::webgl_enable_draft_extensions()) return false;
+ if (!webgl->IsWebGL2()) return false;
+
+ const auto& gl = webgl->gl;
+
+ // ANGLE's support is broken in our checkout.
+ if (gl->IsANGLE()) return false;
+
+ return gl->IsSupported(gl::GLFeature::texture_norm16);
+}
+
+WebGLExtensionTextureNorm16::WebGLExtensionTextureNorm16(WebGLContext* webgl)
+ : WebGLExtensionBase(webgl) {
+ if (!IsSupported(webgl)) {
+ NS_WARNING(
+ "Constructing WebGLExtensionTextureNorm16 but IsSupported() is "
+ "false!");
+ // This was previously an assert, but it seems like we get races against
+ // StaticPrefs changes/initialization?
+ }
+
+ auto& fua = *webgl->mFormatUsage;
+
+ const auto fnAdd = [&](webgl::EffectiveFormat effFormat,
+ const bool renderable, const webgl::PackingInfo& pi) {
+ auto& usage = *fua.EditUsage(effFormat);
+ const auto& format = *usage.format;
+
+ const auto dui =
+ webgl::DriverUnpackInfo{format.sizedFormat, pi.format, pi.type};
+ fua.AddTexUnpack(&usage, pi, dui);
+
+ fua.AllowSizedTexFormat(format.sizedFormat, &usage);
+ fua.AllowUnsizedTexFormat(pi, &usage);
+
+ if (renderable) {
+ usage.SetRenderable();
+ fua.AllowRBFormat(format.sizedFormat, &usage);
+ }
+ };
+
+ fnAdd(webgl::EffectiveFormat::R16, true,
+ {LOCAL_GL_RED, LOCAL_GL_UNSIGNED_SHORT});
+ fnAdd(webgl::EffectiveFormat::RG16, true,
+ {LOCAL_GL_RG, LOCAL_GL_UNSIGNED_SHORT});
+ fnAdd(webgl::EffectiveFormat::RGB16, false,
+ {LOCAL_GL_RGB, LOCAL_GL_UNSIGNED_SHORT});
+ fnAdd(webgl::EffectiveFormat::RGBA16, true,
+ {LOCAL_GL_RGBA, LOCAL_GL_UNSIGNED_SHORT});
+
+ fnAdd(webgl::EffectiveFormat::R16_SNORM, false,
+ {LOCAL_GL_RED, LOCAL_GL_SHORT});
+ fnAdd(webgl::EffectiveFormat::RG16_SNORM, false,
+ {LOCAL_GL_RG, LOCAL_GL_SHORT});
+ fnAdd(webgl::EffectiveFormat::RGB16_SNORM, false,
+ {LOCAL_GL_RGB, LOCAL_GL_SHORT});
+ fnAdd(webgl::EffectiveFormat::RGBA16_SNORM, false,
+ {LOCAL_GL_RGBA, LOCAL_GL_SHORT});
+}
+
+} // namespace mozilla