diff options
Diffstat (limited to 'dom/canvas/WebGLExtensions.cpp')
-rw-r--r-- | dom/canvas/WebGLExtensions.cpp | 158 |
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 |