1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include "WebGLExtensions.h"
7 
8 #include "GLContext.h"
9 #include "mozilla/dom/WebGLRenderingContextBinding.h"
10 #include "mozilla/StaticPrefs_webgl.h"
11 #include "WebGLContext.h"
12 
13 namespace mozilla {
14 
WebGLExtensionBlendMinMax(WebGLContext * webgl)15 WebGLExtensionBlendMinMax::WebGLExtensionBlendMinMax(WebGLContext* webgl)
16     : WebGLExtensionBase(webgl) {
17   MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
18 }
19 
IsSupported(const WebGLContext * webgl)20 bool WebGLExtensionBlendMinMax::IsSupported(const WebGLContext* webgl) {
21   if (webgl->IsWebGL2()) return false;
22 
23   return webgl->GL()->IsSupported(gl::GLFeature::blend_minmax);
24 }
25 
26 // -
27 
WebGLExtensionExplicitPresent(WebGLContext * const webgl)28 WebGLExtensionExplicitPresent::WebGLExtensionExplicitPresent(
29     WebGLContext* const webgl)
30     : WebGLExtensionBase(webgl) {
31   MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
32 }
33 
IsSupported(const WebGLContext * const webgl)34 bool WebGLExtensionExplicitPresent::IsSupported(
35     const WebGLContext* const webgl) {
36   return StaticPrefs::webgl_enable_draft_extensions();
37 }
38 
39 // -
40 
WebGLExtensionFloatBlend(WebGLContext * const webgl)41 WebGLExtensionFloatBlend::WebGLExtensionFloatBlend(WebGLContext* const webgl)
42     : WebGLExtensionBase(webgl) {
43   MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
44 }
45 
IsSupported(const WebGLContext * const webgl)46 bool WebGLExtensionFloatBlend::IsSupported(const WebGLContext* const webgl) {
47   if (!WebGLExtensionColorBufferFloat::IsSupported(webgl) &&
48       !WebGLExtensionEXTColorBufferFloat::IsSupported(webgl))
49     return false;
50 
51   const auto& gl = webgl->gl;
52   if (!gl->IsGLES() && gl->Version() >= 300) return true;
53   if (gl->IsGLES() && gl->Version() >= 320) return true;
54   return gl->IsExtensionSupported(gl::GLContext::EXT_float_blend);
55 }
56 
57 // -
58 
WebGLExtensionFBORenderMipmap(WebGLContext * const webgl)59 WebGLExtensionFBORenderMipmap::WebGLExtensionFBORenderMipmap(
60     WebGLContext* const webgl)
61     : WebGLExtensionBase(webgl) {
62   MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
63 }
64 
IsSupported(const WebGLContext * const webgl)65 bool WebGLExtensionFBORenderMipmap::IsSupported(
66     const WebGLContext* const webgl) {
67   if (webgl->IsWebGL2()) return false;
68 
69   const auto& gl = webgl->gl;
70   if (!gl->IsGLES()) return true;
71   if (gl->Version() >= 300) return true;
72   return gl->IsExtensionSupported(gl::GLContext::OES_fbo_render_mipmap);
73 }
74 
75 // -
76 
WebGLExtensionMultiview(WebGLContext * const webgl)77 WebGLExtensionMultiview::WebGLExtensionMultiview(WebGLContext* const webgl)
78     : WebGLExtensionBase(webgl) {
79   MOZ_ASSERT(IsSupported(webgl), "Don't construct extension if unsupported.");
80 }
81 
IsSupported(const WebGLContext * const webgl)82 bool WebGLExtensionMultiview::IsSupported(const WebGLContext* const webgl) {
83   if (!webgl->IsWebGL2()) return false;
84 
85   const auto& gl = webgl->gl;
86   return gl->IsSupported(gl::GLFeature::multiview);
87 }
88 
89 }  // namespace mozilla
90