diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2018-05-25 14:58:50 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2018-06-06 12:24:47 +0200 |
commit | f1288cc6e0a52d377619f0ec9634eefd29ba15dc (patch) | |
tree | de9787bb29bf8adb2b759774bab0064c27cf44b2 /components/script/dom/webgl_extensions | |
parent | eb1dfd07756f690dfbebae2e53447bc747c5763a (diff) | |
download | servo-f1288cc6e0a52d377619f0ec9634eefd29ba15dc.tar.gz servo-f1288cc6e0a52d377619f0ec9634eefd29ba15dc.zip |
Implement EXT_texture_filter_anisotropic
Diffstat (limited to 'components/script/dom/webgl_extensions')
3 files changed, 91 insertions, 7 deletions
diff --git a/components/script/dom/webgl_extensions/ext/exttexturefilteranisotropic.rs b/components/script/dom/webgl_extensions/ext/exttexturefilteranisotropic.rs new file mode 100644 index 00000000000..203f4da6251 --- /dev/null +++ b/components/script/dom/webgl_extensions/ext/exttexturefilteranisotropic.rs @@ -0,0 +1,54 @@ +/* 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::EXTTextureFilterAnisotropicBinding; +use dom::bindings::codegen::Bindings::EXTTextureFilterAnisotropicBinding::EXTTextureFilterAnisotropicConstants; +use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object}; +use dom::bindings::root::DomRoot; +use dom::webglrenderingcontext::WebGLRenderingContext; +use dom_struct::dom_struct; +use super::{WebGLExtension, WebGLExtensions, WebGLExtensionSpec}; + +#[dom_struct] +pub struct EXTTextureFilterAnisotropic { + reflector_: Reflector, +} + +impl EXTTextureFilterAnisotropic { + fn new_inherited() -> EXTTextureFilterAnisotropic { + Self { + reflector_: Reflector::new(), + } + } +} + +impl WebGLExtension for EXTTextureFilterAnisotropic { + type Extension = EXTTextureFilterAnisotropic; + + fn new(ctx: &WebGLRenderingContext) -> DomRoot<Self> { + reflect_dom_object( + Box::new(Self::new_inherited()), + &*ctx.global(), + EXTTextureFilterAnisotropicBinding::Wrap, + ) + } + + fn spec() -> WebGLExtensionSpec { + WebGLExtensionSpec::Specific(WebGLVersion::WebGL1) + } + + fn is_supported(ext: &WebGLExtensions) -> bool { + ext.supports_gl_extension("GL_EXT_texture_filter_anisotropic") + } + + fn enable(ext: &WebGLExtensions) { + ext.enable_get_tex_parameter_name(EXTTextureFilterAnisotropicConstants::TEXTURE_MAX_ANISOTROPY_EXT); + ext.enable_get_parameter_name(EXTTextureFilterAnisotropicConstants::MAX_TEXTURE_MAX_ANISOTROPY_EXT); + } + + fn name() -> &'static str { + "EXT_texture_filter_anisotropic" + } +} diff --git a/components/script/dom/webgl_extensions/ext/mod.rs b/components/script/dom/webgl_extensions/ext/mod.rs index b4b58fd10e1..e0c7b1f189a 100644 --- a/components/script/dom/webgl_extensions/ext/mod.rs +++ b/components/script/dom/webgl_extensions/ext/mod.rs @@ -6,6 +6,7 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderi use super::{ext_constants, WebGLExtension, WebGLExtensions, WebGLExtensionSpec}; pub mod extshadertexturelod; +pub mod exttexturefilteranisotropic; pub mod oeselementindexuint; pub mod oesstandardderivatives; pub mod oestexturefloat; diff --git a/components/script/dom/webgl_extensions/extensions.rs b/components/script/dom/webgl_extensions/extensions.rs index 92a34bac23e..33081e4bfe1 100644 --- a/components/script/dom/webgl_extensions/extensions.rs +++ b/components/script/dom/webgl_extensions/extensions.rs @@ -4,6 +4,7 @@ use canvas_traits::webgl::{WebGLError, WebGLVersion}; use dom::bindings::cell::DomRefCell; +use dom::bindings::codegen::Bindings::EXTTextureFilterAnisotropicBinding::EXTTextureFilterAnisotropicConstants; use dom::bindings::codegen::Bindings::OESStandardDerivativesBinding::OESStandardDerivativesConstants; use dom::bindings::codegen::Bindings::OESTextureHalfFloatBinding::OESTextureHalfFloatConstants; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; @@ -41,8 +42,16 @@ const DEFAULT_NOT_FILTERABLE_TEX_TYPES: [GLenum; 2] = [ // Param names that are implemented for glGetParameter in a WebGL 1.0 context // but must trigger a InvalidEnum error until the related WebGL Extensions are enabled. // Example: https://www.khronos.org/registry/webgl/extensions/OES_standard_derivatives/ -const DEFAULT_DISABLED_GET_PARAMETER_NAMES_WEBGL1: [GLenum; 1] = [ - OESStandardDerivativesConstants::FRAGMENT_SHADER_DERIVATIVE_HINT_OES +const DEFAULT_DISABLED_GET_PARAMETER_NAMES_WEBGL1: [GLenum; 2] = [ + EXTTextureFilterAnisotropicConstants::MAX_TEXTURE_MAX_ANISOTROPY_EXT, + OESStandardDerivativesConstants::FRAGMENT_SHADER_DERIVATIVE_HINT_OES, +]; + +// Param names that are implemented for glGetTexParameter in a WebGL 1.0 context +// but must trigger a InvalidEnum error until the related WebGL Extensions are enabled. +// Example: https://www.khronos.org/registry/webgl/extensions/OES_standard_derivatives/ +const DEFAULT_DISABLED_GET_TEX_PARAMETER_NAMES_WEBGL1: [GLenum; 1] = [ + EXTTextureFilterAnisotropicConstants::TEXTURE_MAX_ANISOTROPY_EXT, ]; /// WebGL features that are enabled/disabled by WebGL Extensions. @@ -57,20 +66,30 @@ struct WebGLExtensionFeatures { hint_targets: FnvHashSet<GLenum>, /// WebGL GetParameter() names enabled by extensions. disabled_get_parameter_names: FnvHashSet<GLenum>, + /// WebGL GetTexParameter() names enabled by extensions. + disabled_get_tex_parameter_names: FnvHashSet<GLenum>, /// WebGL OES_element_index_uint extension. element_index_uint_enabled: bool, } impl WebGLExtensionFeatures { fn new(webgl_version: WebGLVersion) -> Self { - let (disabled_tex_types, disabled_get_parameter_names, element_index_uint_enabled) = match webgl_version { + let ( + disabled_tex_types, + disabled_get_parameter_names, + disabled_get_tex_parameter_names, + element_index_uint_enabled, + ) = match webgl_version { WebGLVersion::WebGL1 => { - (DEFAULT_DISABLED_TEX_TYPES_WEBGL1.iter().cloned().collect(), - DEFAULT_DISABLED_GET_PARAMETER_NAMES_WEBGL1.iter().cloned().collect(), - false) + ( + DEFAULT_DISABLED_TEX_TYPES_WEBGL1.iter().cloned().collect(), + DEFAULT_DISABLED_GET_PARAMETER_NAMES_WEBGL1.iter().cloned().collect(), + DEFAULT_DISABLED_GET_TEX_PARAMETER_NAMES_WEBGL1.iter().cloned().collect(), + false, + ) }, WebGLVersion::WebGL2 => { - (Default::default(), Default::default(), true) + (Default::default(), Default::default(), Default::default(), true) } }; Self { @@ -81,6 +100,7 @@ impl WebGLExtensionFeatures { query_parameter_handlers: Default::default(), hint_targets: Default::default(), disabled_get_parameter_names, + disabled_get_tex_parameter_names, element_index_uint_enabled, } } @@ -236,7 +256,16 @@ impl WebGLExtensions { !self.features.borrow().disabled_get_parameter_names.contains(&name) } + pub fn enable_get_tex_parameter_name(&self, name: GLenum) { + self.features.borrow_mut().disabled_get_tex_parameter_names.remove(&name); + } + + pub fn is_get_tex_parameter_name_enabled(&self, name: GLenum) -> bool { + !self.features.borrow().disabled_get_tex_parameter_names.contains(&name) + } + fn register_all_extensions(&self) { + self.register::<ext::exttexturefilteranisotropic::EXTTextureFilterAnisotropic>(); self.register::<ext::oeselementindexuint::OESElementIndexUint>(); self.register::<ext::oesstandardderivatives::OESStandardDerivatives>(); self.register::<ext::oestexturefloat::OESTextureFloat>(); |