1 /* -*- Mode: C++; tab-width: 4; 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/. */
6 #include "WebGLContext.h"
7 #include "ClientWebGLExtensions.h"
9 #include "mozilla/dom/BindingDeclarations.h"
10 #include "mozilla/dom/ToJSValue.h"
11 #include "mozilla/EnumeratedRange.h"
12 #include "mozilla/StaticPrefs_webgl.h"
14 #include "WebGLContextUtils.h"
15 #include "WebGLExtensions.h"
19 const char* GetExtensionName(const WebGLExtensionID ext
) {
20 static EnumeratedArray
<WebGLExtensionID
, WebGLExtensionID::Max
, const char*>
21 sExtensionNamesEnumeratedArray
;
22 static bool initialized
= false;
27 #define WEBGL_EXTENSION_IDENTIFIER(x) \
28 sExtensionNamesEnumeratedArray[WebGLExtensionID::x] = #x;
30 WEBGL_EXTENSION_IDENTIFIER(ANGLE_instanced_arrays
)
31 WEBGL_EXTENSION_IDENTIFIER(EXT_blend_minmax
)
32 WEBGL_EXTENSION_IDENTIFIER(EXT_color_buffer_float
)
33 WEBGL_EXTENSION_IDENTIFIER(EXT_color_buffer_half_float
)
34 WEBGL_EXTENSION_IDENTIFIER(EXT_disjoint_timer_query
)
35 WEBGL_EXTENSION_IDENTIFIER(EXT_float_blend
)
36 WEBGL_EXTENSION_IDENTIFIER(EXT_frag_depth
)
37 WEBGL_EXTENSION_IDENTIFIER(EXT_shader_texture_lod
)
38 WEBGL_EXTENSION_IDENTIFIER(EXT_sRGB
)
39 WEBGL_EXTENSION_IDENTIFIER(EXT_texture_compression_bptc
)
40 WEBGL_EXTENSION_IDENTIFIER(EXT_texture_compression_rgtc
)
41 WEBGL_EXTENSION_IDENTIFIER(EXT_texture_filter_anisotropic
)
42 WEBGL_EXTENSION_IDENTIFIER(EXT_texture_norm16
)
43 WEBGL_EXTENSION_IDENTIFIER(MOZ_debug
)
44 WEBGL_EXTENSION_IDENTIFIER(OES_draw_buffers_indexed
)
45 WEBGL_EXTENSION_IDENTIFIER(OES_element_index_uint
)
46 WEBGL_EXTENSION_IDENTIFIER(OES_fbo_render_mipmap
)
47 WEBGL_EXTENSION_IDENTIFIER(OES_standard_derivatives
)
48 WEBGL_EXTENSION_IDENTIFIER(OES_texture_float
)
49 WEBGL_EXTENSION_IDENTIFIER(OES_texture_float_linear
)
50 WEBGL_EXTENSION_IDENTIFIER(OES_texture_half_float
)
51 WEBGL_EXTENSION_IDENTIFIER(OES_texture_half_float_linear
)
52 WEBGL_EXTENSION_IDENTIFIER(OES_vertex_array_object
)
53 WEBGL_EXTENSION_IDENTIFIER(OVR_multiview2
)
54 WEBGL_EXTENSION_IDENTIFIER(WEBGL_color_buffer_float
)
55 WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_astc
)
56 WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_etc
)
57 WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_etc1
)
58 WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_pvrtc
)
59 WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_s3tc
)
60 WEBGL_EXTENSION_IDENTIFIER(WEBGL_compressed_texture_s3tc_srgb
)
61 WEBGL_EXTENSION_IDENTIFIER(WEBGL_debug_renderer_info
)
62 WEBGL_EXTENSION_IDENTIFIER(WEBGL_debug_shaders
)
63 WEBGL_EXTENSION_IDENTIFIER(WEBGL_depth_texture
)
64 WEBGL_EXTENSION_IDENTIFIER(WEBGL_draw_buffers
)
65 WEBGL_EXTENSION_IDENTIFIER(WEBGL_explicit_present
)
66 WEBGL_EXTENSION_IDENTIFIER(WEBGL_lose_context
)
67 WEBGL_EXTENSION_IDENTIFIER(WEBGL_provoking_vertex
)
69 #undef WEBGL_EXTENSION_IDENTIFIER
72 return sExtensionNamesEnumeratedArray
[ext
];
75 // ----------------------------
78 void ClientWebGLContext::GetExtension(JSContext
* cx
, const nsAString
& wideName
,
79 JS::MutableHandle
<JSObject
*> retval
,
80 dom::CallerType callerType
,
83 const FuncScope
funcScope(*this, "getExtension");
84 if (IsContextLost()) return;
86 const auto name
= NS_ConvertUTF16toUTF8(wideName
);
88 auto ext
= WebGLExtensionID::Max
;
90 // step 1: figure what extension is wanted
91 for (const auto extension
: MakeEnumeratedRange(WebGLExtensionID::Max
)) {
92 const auto& curName
= GetExtensionName(extension
);
93 if (name
.Equals(curName
, nsCaseInsensitiveCStringComparator
)) {
99 if (ext
== WebGLExtensionID::Max
) return;
101 RefPtr
<ClientWebGLExtensionBase
> extObj
;
102 if (ext
== WebGLExtensionID::WEBGL_lose_context
) {
103 extObj
= mExtLoseContext
;
105 extObj
= GetExtension(ext
, callerType
);
109 // Ugh, this would be easier returning `any` than `object`.
110 JS::Rooted
<JS::Value
> v(cx
);
111 MOZ_ALWAYS_TRUE(dom::ToJSValue(cx
, extObj
, &v
));
113 retval
.set(&v
.toObject());
117 RefPtr
<ClientWebGLExtensionBase
> ClientWebGLContext::GetExtension(
118 const WebGLExtensionID ext
, const dom::CallerType callerType
) {
119 if (ext
== WebGLExtensionID::WEBGL_lose_context
) {
121 return mExtLoseContext
;
124 if (!mNotLost
) return nullptr;
126 if (!IsSupported(ext
, callerType
)) return nullptr;
128 auto& extSlot
= mNotLost
->extensions
[UnderlyingValue(ext
)];
129 if (MOZ_UNLIKELY(!extSlot
)) {
130 extSlot
= [&]() -> RefPtr
<ClientWebGLExtensionBase
> {
133 case WebGLExtensionID::ANGLE_instanced_arrays
:
134 return new ClientWebGLExtensionInstancedArrays(*this);
137 case WebGLExtensionID::EXT_blend_minmax
:
138 return new ClientWebGLExtensionBlendMinMax(*this);
139 case WebGLExtensionID::EXT_color_buffer_float
:
140 return new ClientWebGLExtensionEXTColorBufferFloat(*this);
141 case WebGLExtensionID::EXT_color_buffer_half_float
:
142 return new ClientWebGLExtensionColorBufferHalfFloat(*this);
143 case WebGLExtensionID::EXT_disjoint_timer_query
:
144 return new ClientWebGLExtensionDisjointTimerQuery(*this);
145 case WebGLExtensionID::EXT_float_blend
:
146 return new ClientWebGLExtensionFloatBlend(*this);
147 case WebGLExtensionID::EXT_frag_depth
:
148 return new ClientWebGLExtensionFragDepth(*this);
149 case WebGLExtensionID::EXT_shader_texture_lod
:
150 return new ClientWebGLExtensionShaderTextureLod(*this);
151 case WebGLExtensionID::EXT_sRGB
:
152 return new ClientWebGLExtensionSRGB(*this);
153 case WebGLExtensionID::EXT_texture_compression_bptc
:
154 return new ClientWebGLExtensionCompressedTextureBPTC(*this);
155 case WebGLExtensionID::EXT_texture_compression_rgtc
:
156 return new ClientWebGLExtensionCompressedTextureRGTC(*this);
157 case WebGLExtensionID::EXT_texture_filter_anisotropic
:
158 return new ClientWebGLExtensionTextureFilterAnisotropic(*this);
159 case WebGLExtensionID::EXT_texture_norm16
:
160 return new ClientWebGLExtensionTextureNorm16(*this);
163 case WebGLExtensionID::MOZ_debug
:
164 return new ClientWebGLExtensionMOZDebug(*this);
167 case WebGLExtensionID::OES_draw_buffers_indexed
:
168 return new ClientWebGLExtensionDrawBuffersIndexed(*this);
169 case WebGLExtensionID::OES_element_index_uint
:
170 return new ClientWebGLExtensionElementIndexUint(*this);
171 case WebGLExtensionID::OES_fbo_render_mipmap
:
172 return new ClientWebGLExtensionFBORenderMipmap(*this);
173 case WebGLExtensionID::OES_standard_derivatives
:
174 return new ClientWebGLExtensionStandardDerivatives(*this);
175 case WebGLExtensionID::OES_texture_float
:
176 return new ClientWebGLExtensionTextureFloat(*this);
177 case WebGLExtensionID::OES_texture_float_linear
:
178 return new ClientWebGLExtensionTextureFloatLinear(*this);
179 case WebGLExtensionID::OES_texture_half_float
:
180 return new ClientWebGLExtensionTextureHalfFloat(*this);
181 case WebGLExtensionID::OES_texture_half_float_linear
:
182 return new ClientWebGLExtensionTextureHalfFloatLinear(*this);
183 case WebGLExtensionID::OES_vertex_array_object
:
184 return new ClientWebGLExtensionVertexArray(*this);
187 case WebGLExtensionID::OVR_multiview2
:
188 return new ClientWebGLExtensionMultiview(*this);
191 case WebGLExtensionID::WEBGL_color_buffer_float
:
192 return new ClientWebGLExtensionColorBufferFloat(*this);
193 case WebGLExtensionID::WEBGL_compressed_texture_astc
:
194 return new ClientWebGLExtensionCompressedTextureASTC(*this);
195 case WebGLExtensionID::WEBGL_compressed_texture_etc
:
196 return new ClientWebGLExtensionCompressedTextureES3(*this);
197 case WebGLExtensionID::WEBGL_compressed_texture_etc1
:
198 return new ClientWebGLExtensionCompressedTextureETC1(*this);
199 case WebGLExtensionID::WEBGL_compressed_texture_pvrtc
:
200 return new ClientWebGLExtensionCompressedTexturePVRTC(*this);
201 case WebGLExtensionID::WEBGL_compressed_texture_s3tc
:
202 return new ClientWebGLExtensionCompressedTextureS3TC(*this);
203 case WebGLExtensionID::WEBGL_compressed_texture_s3tc_srgb
:
204 return new ClientWebGLExtensionCompressedTextureS3TC_SRGB(*this);
205 case WebGLExtensionID::WEBGL_debug_renderer_info
: {
206 if (callerType
!= dom::CallerType::System
) {
208 "WEBGL_debug_renderer_info is deprecated in Firefox and will "
209 "be removed. Please use RENDERER.");
211 return new ClientWebGLExtensionDebugRendererInfo(*this);
213 case WebGLExtensionID::WEBGL_debug_shaders
:
214 return new ClientWebGLExtensionDebugShaders(*this);
215 case WebGLExtensionID::WEBGL_depth_texture
:
216 return new ClientWebGLExtensionDepthTexture(*this);
217 case WebGLExtensionID::WEBGL_draw_buffers
:
218 return new ClientWebGLExtensionDrawBuffers(*this);
219 case WebGLExtensionID::WEBGL_explicit_present
:
220 return new ClientWebGLExtensionExplicitPresent(*this);
221 case WebGLExtensionID::WEBGL_provoking_vertex
:
222 return new ClientWebGLExtensionProvokingVertex(*this);
224 case WebGLExtensionID::WEBGL_lose_context
:
225 case WebGLExtensionID::Max
:
228 MOZ_CRASH("illegal extension enum");
231 RequestExtension(ext
);
237 // ----------------------------
240 bool WebGLContext::IsExtensionSupported(WebGLExtensionID ext
) const {
242 case WebGLExtensionID::MOZ_debug
:
243 case WebGLExtensionID::WEBGL_debug_renderer_info
:
244 case WebGLExtensionID::WEBGL_debug_shaders
:
245 case WebGLExtensionID::WEBGL_lose_context
:
249 // In alphabetical order
251 case WebGLExtensionID::ANGLE_instanced_arrays
:
252 return WebGLExtensionInstancedArrays::IsSupported(this);
255 case WebGLExtensionID::EXT_blend_minmax
:
256 return WebGLExtensionBlendMinMax::IsSupported(this);
258 case WebGLExtensionID::EXT_color_buffer_float
:
259 return WebGLExtensionEXTColorBufferFloat::IsSupported(this);
261 case WebGLExtensionID::EXT_color_buffer_half_float
:
262 return WebGLExtensionColorBufferHalfFloat::IsSupported(this);
264 case WebGLExtensionID::EXT_disjoint_timer_query
:
265 return WebGLExtensionDisjointTimerQuery::IsSupported(this);
267 case WebGLExtensionID::EXT_float_blend
:
268 return WebGLExtensionFloatBlend::IsSupported(this);
270 case WebGLExtensionID::EXT_frag_depth
:
271 return WebGLExtensionFragDepth::IsSupported(this);
273 case WebGLExtensionID::EXT_shader_texture_lod
:
274 return WebGLExtensionShaderTextureLod::IsSupported(this);
276 case WebGLExtensionID::EXT_sRGB
:
277 return WebGLExtensionSRGB::IsSupported(this);
279 case WebGLExtensionID::EXT_texture_compression_bptc
:
280 return WebGLExtensionCompressedTextureBPTC::IsSupported(this);
282 case WebGLExtensionID::EXT_texture_compression_rgtc
:
283 return WebGLExtensionCompressedTextureRGTC::IsSupported(this);
285 case WebGLExtensionID::EXT_texture_filter_anisotropic
:
286 return gl
->IsExtensionSupported(
287 gl::GLContext::EXT_texture_filter_anisotropic
);
289 case WebGLExtensionID::EXT_texture_norm16
:
290 return WebGLExtensionTextureNorm16::IsSupported(this);
293 case WebGLExtensionID::OES_draw_buffers_indexed
:
294 if (!IsWebGL2()) return false;
295 return gl
->IsSupported(gl::GLFeature::draw_buffers_indexed
) &&
296 gl
->IsSupported(gl::GLFeature::get_integer_indexed
);
298 case WebGLExtensionID::OES_element_index_uint
:
299 if (IsWebGL2()) return false;
300 return gl
->IsSupported(gl::GLFeature::element_index_uint
);
302 case WebGLExtensionID::OES_fbo_render_mipmap
:
303 return WebGLExtensionFBORenderMipmap::IsSupported(this);
305 case WebGLExtensionID::OES_standard_derivatives
:
306 if (IsWebGL2()) return false;
307 return gl
->IsSupported(gl::GLFeature::standard_derivatives
);
309 case WebGLExtensionID::OES_texture_float
:
310 return WebGLExtensionTextureFloat::IsSupported(this);
312 case WebGLExtensionID::OES_texture_float_linear
:
313 return gl
->IsSupported(gl::GLFeature::texture_float_linear
);
315 case WebGLExtensionID::OES_texture_half_float
:
316 return WebGLExtensionTextureHalfFloat::IsSupported(this);
318 case WebGLExtensionID::OES_texture_half_float_linear
:
319 if (IsWebGL2()) return false;
320 return gl
->IsSupported(gl::GLFeature::texture_half_float_linear
);
322 case WebGLExtensionID::OES_vertex_array_object
:
323 return !IsWebGL2(); // Always supported in webgl1.
326 case WebGLExtensionID::OVR_multiview2
:
327 return WebGLExtensionMultiview::IsSupported(this);
330 case WebGLExtensionID::WEBGL_color_buffer_float
:
331 return WebGLExtensionColorBufferFloat::IsSupported(this);
333 case WebGLExtensionID::WEBGL_compressed_texture_astc
:
334 return WebGLExtensionCompressedTextureASTC::IsSupported(this);
336 case WebGLExtensionID::WEBGL_compressed_texture_etc
:
337 return gl
->IsSupported(gl::GLFeature::ES3_compatibility
) &&
340 case WebGLExtensionID::WEBGL_compressed_texture_etc1
:
341 return gl
->IsExtensionSupported(
342 gl::GLContext::OES_compressed_ETC1_RGB8_texture
) &&
345 case WebGLExtensionID::WEBGL_compressed_texture_pvrtc
:
346 return gl
->IsExtensionSupported(
347 gl::GLContext::IMG_texture_compression_pvrtc
);
349 case WebGLExtensionID::WEBGL_compressed_texture_s3tc
:
350 return WebGLExtensionCompressedTextureS3TC::IsSupported(this);
352 case WebGLExtensionID::WEBGL_compressed_texture_s3tc_srgb
:
353 return WebGLExtensionCompressedTextureS3TC_SRGB::IsSupported(this);
355 case WebGLExtensionID::WEBGL_depth_texture
:
356 return WebGLExtensionDepthTexture::IsSupported(this);
358 case WebGLExtensionID::WEBGL_draw_buffers
:
359 return WebGLExtensionDrawBuffers::IsSupported(this);
361 case WebGLExtensionID::WEBGL_explicit_present
:
362 return WebGLExtensionExplicitPresent::IsSupported(this);
364 case WebGLExtensionID::WEBGL_provoking_vertex
:
365 if (!gl
->IsSupported(gl::GLFeature::provoking_vertex
)) return false;
367 // > Implementations SHOULD only expose this extension when
368 // > FIRST_VERTEX_CONVENTION is more efficient than the default behavior
369 // > of LAST_VERTEX_CONVENTION.
370 if (gl
->IsANGLE()) return true; // Better on D3D.
372 // Better on Metal, so probably Mac in general.
375 return false; // Probably not better for Win+GL, Linux, or Android.
377 case WebGLExtensionID::Max
:
384 bool WebGLContext::IsExtensionExplicit(const WebGLExtensionID ext
) const {
385 return mExtensions
[ext
] && mExtensions
[ext
]->IsExplicit();
388 void WebGLContext::WarnIfImplicit(const WebGLExtensionID ext
) const {
389 const auto& extension
= mExtensions
[ext
];
390 if (!extension
|| extension
->IsExplicit()) return;
393 "Using format enabled by implicitly enabled extension: %s. "
394 "For maximal portability enable it explicitly.",
395 GetExtensionName(ext
));
398 void WebGLContext::RequestExtension(const WebGLExtensionID ext
,
399 const bool explicitly
) {
400 const auto& limits
= Limits();
401 if (!limits
.supportedExtensions
[ext
]) return;
403 auto& slot
= mExtensions
[ext
];
406 case WebGLExtensionID::ANGLE_instanced_arrays
:
407 slot
.reset(new WebGLExtensionInstancedArrays(this));
411 case WebGLExtensionID::EXT_blend_minmax
:
412 slot
.reset(new WebGLExtensionBlendMinMax(this));
414 case WebGLExtensionID::EXT_color_buffer_float
:
415 slot
.reset(new WebGLExtensionEXTColorBufferFloat(this));
417 case WebGLExtensionID::EXT_color_buffer_half_float
:
418 slot
.reset(new WebGLExtensionColorBufferHalfFloat(this));
420 case WebGLExtensionID::EXT_disjoint_timer_query
:
421 slot
.reset(new WebGLExtensionDisjointTimerQuery(this));
423 case WebGLExtensionID::EXT_float_blend
:
424 slot
.reset(new WebGLExtensionFloatBlend(this));
426 case WebGLExtensionID::EXT_frag_depth
:
427 slot
.reset(new WebGLExtensionFragDepth(this));
429 case WebGLExtensionID::EXT_shader_texture_lod
:
430 slot
.reset(new WebGLExtensionShaderTextureLod(this));
432 case WebGLExtensionID::EXT_sRGB
:
433 slot
.reset(new WebGLExtensionSRGB(this));
435 case WebGLExtensionID::EXT_texture_compression_bptc
:
436 slot
.reset(new WebGLExtensionCompressedTextureBPTC(this));
438 case WebGLExtensionID::EXT_texture_compression_rgtc
:
439 slot
.reset(new WebGLExtensionCompressedTextureRGTC(this));
441 case WebGLExtensionID::EXT_texture_filter_anisotropic
:
442 slot
.reset(new WebGLExtensionTextureFilterAnisotropic(this));
444 case WebGLExtensionID::EXT_texture_norm16
:
445 slot
.reset(new WebGLExtensionTextureNorm16(this));
449 case WebGLExtensionID::MOZ_debug
:
450 slot
.reset(new WebGLExtensionMOZDebug(this));
454 case WebGLExtensionID::OES_draw_buffers_indexed
:
455 slot
.reset(new WebGLExtensionDrawBuffersIndexed(this));
457 case WebGLExtensionID::OES_element_index_uint
:
458 slot
.reset(new WebGLExtensionElementIndexUint(this));
460 case WebGLExtensionID::OES_fbo_render_mipmap
:
461 slot
.reset(new WebGLExtensionFBORenderMipmap(this));
463 case WebGLExtensionID::OES_standard_derivatives
:
464 slot
.reset(new WebGLExtensionStandardDerivatives(this));
466 case WebGLExtensionID::OES_texture_float
:
467 slot
.reset(new WebGLExtensionTextureFloat(this));
469 case WebGLExtensionID::OES_texture_float_linear
:
470 slot
.reset(new WebGLExtensionTextureFloatLinear(this));
472 case WebGLExtensionID::OES_texture_half_float
:
473 slot
.reset(new WebGLExtensionTextureHalfFloat(this));
475 case WebGLExtensionID::OES_texture_half_float_linear
:
476 slot
.reset(new WebGLExtensionTextureHalfFloatLinear(this));
478 case WebGLExtensionID::OES_vertex_array_object
:
479 slot
.reset(new WebGLExtensionVertexArray(this));
483 case WebGLExtensionID::OVR_multiview2
:
484 slot
.reset(new WebGLExtensionMultiview(this));
488 case WebGLExtensionID::WEBGL_color_buffer_float
:
489 slot
.reset(new WebGLExtensionColorBufferFloat(this));
491 case WebGLExtensionID::WEBGL_compressed_texture_astc
:
492 slot
.reset(new WebGLExtensionCompressedTextureASTC(this));
494 case WebGLExtensionID::WEBGL_compressed_texture_etc
:
495 slot
.reset(new WebGLExtensionCompressedTextureES3(this));
497 case WebGLExtensionID::WEBGL_compressed_texture_etc1
:
498 slot
.reset(new WebGLExtensionCompressedTextureETC1(this));
500 case WebGLExtensionID::WEBGL_compressed_texture_pvrtc
:
501 slot
.reset(new WebGLExtensionCompressedTexturePVRTC(this));
503 case WebGLExtensionID::WEBGL_compressed_texture_s3tc
:
504 slot
.reset(new WebGLExtensionCompressedTextureS3TC(this));
506 case WebGLExtensionID::WEBGL_compressed_texture_s3tc_srgb
:
507 slot
.reset(new WebGLExtensionCompressedTextureS3TC_SRGB(this));
509 case WebGLExtensionID::WEBGL_debug_renderer_info
:
510 slot
.reset(new WebGLExtensionDebugRendererInfo(this));
512 case WebGLExtensionID::WEBGL_debug_shaders
:
513 slot
.reset(new WebGLExtensionDebugShaders(this));
515 case WebGLExtensionID::WEBGL_depth_texture
:
516 slot
.reset(new WebGLExtensionDepthTexture(this));
518 case WebGLExtensionID::WEBGL_draw_buffers
:
519 slot
.reset(new WebGLExtensionDrawBuffers(this));
521 case WebGLExtensionID::WEBGL_explicit_present
:
522 slot
.reset(new WebGLExtensionExplicitPresent(this));
524 case WebGLExtensionID::WEBGL_lose_context
:
525 slot
.reset(new WebGLExtensionLoseContext(this));
527 case WebGLExtensionID::WEBGL_provoking_vertex
:
528 slot
.reset(new WebGLExtensionProvokingVertex(this));
531 case WebGLExtensionID::Max
:
535 const auto& obj
= slot
;
537 if (explicitly
&& !obj
->IsExplicit()) {
541 // Also enable implied extensions.
543 case WebGLExtensionID::EXT_color_buffer_float
:
544 RequestExtension(WebGLExtensionID::EXT_float_blend
, false);
547 case WebGLExtensionID::OES_texture_float
:
548 RequestExtension(WebGLExtensionID::EXT_float_blend
, false);
549 RequestExtension(WebGLExtensionID::WEBGL_color_buffer_float
, false);
552 case WebGLExtensionID::OES_texture_half_float
:
553 RequestExtension(WebGLExtensionID::EXT_color_buffer_half_float
, false);
556 case WebGLExtensionID::WEBGL_color_buffer_float
:
557 RequestExtension(WebGLExtensionID::EXT_float_blend
, false);
565 } // namespace mozilla