aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webgl_extensions
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/webgl_extensions')
-rw-r--r--components/script/dom/webgl_extensions/ext/extcolorbufferhalffloat.rs49
-rw-r--r--components/script/dom/webgl_extensions/ext/mod.rs2
-rw-r--r--components/script/dom/webgl_extensions/ext/oestexturefloat.rs5
-rw-r--r--components/script/dom/webgl_extensions/ext/oestexturehalffloat.rs5
-rw-r--r--components/script/dom/webgl_extensions/ext/webglcolorbufferfloat.rs49
-rw-r--r--components/script/dom/webgl_extensions/extensions.rs25
6 files changed, 126 insertions, 9 deletions
diff --git a/components/script/dom/webgl_extensions/ext/extcolorbufferhalffloat.rs b/components/script/dom/webgl_extensions/ext/extcolorbufferhalffloat.rs
new file mode 100644
index 00000000000..d43880c5998
--- /dev/null
+++ b/components/script/dom/webgl_extensions/ext/extcolorbufferhalffloat.rs
@@ -0,0 +1,49 @@
+/* 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/. */
+
+use canvas_traits::webgl::WebGLVersion;
+use dom::bindings::codegen::Bindings::EXTColorBufferHalfFloatBinding;
+use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
+use dom::bindings::root::DomRoot;
+use dom::webgl_extensions::ext::oestexturehalffloat::OESTextureHalfFloat;
+use dom::webglrenderingcontext::WebGLRenderingContext;
+use dom_struct::dom_struct;
+use super::{WebGLExtension, WebGLExtensions, WebGLExtensionSpec};
+
+#[dom_struct]
+pub struct EXTColorBufferHalfFloat {
+ reflector_: Reflector,
+}
+
+impl EXTColorBufferHalfFloat {
+ fn new_inherited() -> EXTColorBufferHalfFloat {
+ Self {
+ reflector_: Reflector::new(),
+ }
+ }
+}
+
+impl WebGLExtension for EXTColorBufferHalfFloat {
+ type Extension = EXTColorBufferHalfFloat;
+ fn new(ctx: &WebGLRenderingContext) -> DomRoot<EXTColorBufferHalfFloat> {
+ reflect_dom_object(Box::new(EXTColorBufferHalfFloat::new_inherited()),
+ &*ctx.global(),
+ EXTColorBufferHalfFloatBinding::Wrap)
+ }
+
+ fn spec() -> WebGLExtensionSpec {
+ WebGLExtensionSpec::Specific(WebGLVersion::WebGL1)
+ }
+
+ fn is_supported(ext: &WebGLExtensions) -> bool {
+ OESTextureHalfFloat::is_supported(ext)
+ }
+
+ fn enable(_ext: &WebGLExtensions) {
+ }
+
+ fn name() -> &'static str {
+ "EXT_color_buffer_half_float"
+ }
+}
diff --git a/components/script/dom/webgl_extensions/ext/mod.rs b/components/script/dom/webgl_extensions/ext/mod.rs
index 62f75cb048a..d1a82c24756 100644
--- a/components/script/dom/webgl_extensions/ext/mod.rs
+++ b/components/script/dom/webgl_extensions/ext/mod.rs
@@ -7,6 +7,7 @@ use super::{ext_constants, WebGLExtension, WebGLExtensions, WebGLExtensionSpec};
pub mod angleinstancedarrays;
pub mod extblendminmax;
+pub mod extcolorbufferhalffloat;
pub mod extshadertexturelod;
pub mod exttexturefilteranisotropic;
pub mod oeselementindexuint;
@@ -16,3 +17,4 @@ pub mod oestexturefloatlinear;
pub mod oestexturehalffloat;
pub mod oestexturehalffloatlinear;
pub mod oesvertexarrayobject;
+pub mod webglcolorbufferfloat;
diff --git a/components/script/dom/webgl_extensions/ext/oestexturefloat.rs b/components/script/dom/webgl_extensions/ext/oestexturefloat.rs
index 13170f19538..643f250900f 100644
--- a/components/script/dom/webgl_extensions/ext/oestexturefloat.rs
+++ b/components/script/dom/webgl_extensions/ext/oestexturefloat.rs
@@ -46,11 +46,8 @@ impl WebGLExtension for OESTextureFloat {
}
fn enable(ext: &WebGLExtensions) {
- // Enable FLOAT text data type
ext.enable_tex_type(webgl::FLOAT);
- let needs_replace = !ext.supports_gl_extension("GL_OES_texture_float");
- if needs_replace {
- // Special internal formats must be used to avoid clamped float values
+ if !ext.supports_gl_extension("GL_OES_texture_float") {
ext.add_effective_tex_internal_format(webgl::RGBA, webgl::FLOAT, gl::RGBA32F);
ext.add_effective_tex_internal_format(webgl::RGB, webgl::FLOAT, gl::RGB32F);
ext.add_effective_tex_internal_format(
diff --git a/components/script/dom/webgl_extensions/ext/oestexturehalffloat.rs b/components/script/dom/webgl_extensions/ext/oestexturehalffloat.rs
index 67c9521750f..15204a67836 100644
--- a/components/script/dom/webgl_extensions/ext/oestexturehalffloat.rs
+++ b/components/script/dom/webgl_extensions/ext/oestexturehalffloat.rs
@@ -47,12 +47,9 @@ impl WebGLExtension for OESTextureHalfFloat {
}
fn enable(ext: &WebGLExtensions) {
- // Enable FLOAT text data type
let hf = OESTextureHalfFloatConstants::HALF_FLOAT_OES;
ext.enable_tex_type(hf);
- let needs_replace = !ext.supports_gl_extension("GL_OES_texture_float");
- if needs_replace {
- // Special internal formats must be used to avoid clamped float values
+ if !ext.supports_gl_extension("GL_OES_texture_half_float") {
ext.add_effective_tex_internal_format(webgl::RGBA, hf, gl::RGBA16F);
ext.add_effective_tex_internal_format(webgl::RGB, hf, gl::RGB16F);
ext.add_effective_tex_internal_format(webgl::LUMINANCE, hf, gl::LUMINANCE16F_ARB);
diff --git a/components/script/dom/webgl_extensions/ext/webglcolorbufferfloat.rs b/components/script/dom/webgl_extensions/ext/webglcolorbufferfloat.rs
new file mode 100644
index 00000000000..bc754f1bb5a
--- /dev/null
+++ b/components/script/dom/webgl_extensions/ext/webglcolorbufferfloat.rs
@@ -0,0 +1,49 @@
+/* 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/. */
+
+use canvas_traits::webgl::WebGLVersion;
+use dom::bindings::codegen::Bindings::WEBGLColorBufferFloatBinding;
+use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
+use dom::bindings::root::DomRoot;
+use dom::webgl_extensions::ext::oestexturefloat::OESTextureFloat;
+use dom::webglrenderingcontext::WebGLRenderingContext;
+use dom_struct::dom_struct;
+use super::{WebGLExtension, WebGLExtensions, WebGLExtensionSpec};
+
+#[dom_struct]
+pub struct WEBGLColorBufferFloat {
+ reflector_: Reflector,
+}
+
+impl WEBGLColorBufferFloat {
+ fn new_inherited() -> WEBGLColorBufferFloat {
+ Self {
+ reflector_: Reflector::new(),
+ }
+ }
+}
+
+impl WebGLExtension for WEBGLColorBufferFloat {
+ type Extension = WEBGLColorBufferFloat;
+ fn new(ctx: &WebGLRenderingContext) -> DomRoot<WEBGLColorBufferFloat> {
+ reflect_dom_object(Box::new(WEBGLColorBufferFloat::new_inherited()),
+ &*ctx.global(),
+ WEBGLColorBufferFloatBinding::Wrap)
+ }
+
+ fn spec() -> WebGLExtensionSpec {
+ WebGLExtensionSpec::Specific(WebGLVersion::WebGL1)
+ }
+
+ fn is_supported(ext: &WebGLExtensions) -> bool {
+ OESTextureFloat::is_supported(ext)
+ }
+
+ fn enable(_ext: &WebGLExtensions) {
+ }
+
+ fn name() -> &'static str {
+ "WEBGL_color_buffer_float"
+ }
+}
diff --git a/components/script/dom/webgl_extensions/extensions.rs b/components/script/dom/webgl_extensions/extensions.rs
index 5833cccba71..560d699cedd 100644
--- a/components/script/dom/webgl_extensions/extensions.rs
+++ b/components/script/dom/webgl_extensions/extensions.rs
@@ -11,9 +11,13 @@ use dom::bindings::codegen::Bindings::OESTextureHalfFloatBinding::OESTextureHalf
use dom::bindings::codegen::Bindings::OESVertexArrayObjectBinding::OESVertexArrayObjectConstants;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
use dom::bindings::trace::JSTraceable;
+use dom::extcolorbufferhalffloat::EXTColorBufferHalfFloat;
+use dom::oestexturefloat::OESTextureFloat;
+use dom::oestexturehalffloat::OESTextureHalfFloat;
+use dom::webglcolorbufferfloat::WEBGLColorBufferFloat;
use dom::webglrenderingcontext::WebGLRenderingContext;
use fnv::{FnvHashMap, FnvHashSet};
-use gleam::gl::GLenum;
+use gleam::gl::{self, GLenum};
use js::jsapi::JSObject;
use malloc_size_of::MallocSizeOf;
use std::collections::HashMap;
@@ -333,6 +337,7 @@ impl WebGLExtensions {
fn register_all_extensions(&self) {
self.register::<ext::angleinstancedarrays::ANGLEInstancedArrays>();
self.register::<ext::extblendminmax::EXTBlendMinmax>();
+ self.register::<ext::extcolorbufferhalffloat::EXTColorBufferHalfFloat>();
self.register::<ext::extshadertexturelod::EXTShaderTextureLod>();
self.register::<ext::exttexturefilteranisotropic::EXTTextureFilterAnisotropic>();
self.register::<ext::oeselementindexuint::OESElementIndexUint>();
@@ -342,6 +347,7 @@ impl WebGLExtensions {
self.register::<ext::oestexturehalffloat::OESTextureHalfFloat>();
self.register::<ext::oestexturehalffloatlinear::OESTextureHalfFloatLinear>();
self.register::<ext::oesvertexarrayobject::OESVertexArrayObject>();
+ self.register::<ext::webglcolorbufferfloat::WEBGLColorBufferFloat>();
}
pub fn enable_element_index_uint(&self) {
@@ -359,6 +365,23 @@ impl WebGLExtensions {
pub fn is_blend_minmax_enabled(&self) -> bool {
self.features.borrow().blend_minmax_enabled
}
+
+ pub fn is_float_buffer_renderable(&self) -> bool {
+ self.is_enabled::<WEBGLColorBufferFloat>() || self.is_enabled::<OESTextureFloat>()
+ }
+
+ pub fn is_half_float_buffer_renderable(&self) -> bool {
+ self.is_enabled::<EXTColorBufferHalfFloat>() || self.is_enabled::<OESTextureHalfFloat>()
+ }
+
+ pub fn effective_type(&self, type_: u32) -> u32 {
+ if type_ == OESTextureHalfFloatConstants::HALF_FLOAT_OES {
+ if !self.supports_gl_extension("GL_OES_texture_half_float") {
+ return gl::HALF_FLOAT;
+ }
+ }
+ type_
+ }
}
// Helper structs