diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2018-03-20 10:11:46 +0100 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2018-07-08 10:44:45 +0200 |
commit | 4e6eea221a19b3e5a4b70f5954b3347bb6db02d1 (patch) | |
tree | f0dbfec03665f8fd2ea9330bfe459ee3e6bf99d2 /components/script/dom/webgl_extensions/extensions.rs | |
parent | 0aefffc5bfb45a1ebfe86597231d44e73b3f8e5d (diff) | |
download | servo-4e6eea221a19b3e5a4b70f5954b3347bb6db02d1.tar.gz servo-4e6eea221a19b3e5a4b70f5954b3347bb6db02d1.zip |
Implement instanced WebGL drawing calls (part of #20791)
Diffstat (limited to 'components/script/dom/webgl_extensions/extensions.rs')
-rw-r--r-- | components/script/dom/webgl_extensions/extensions.rs | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/components/script/dom/webgl_extensions/extensions.rs b/components/script/dom/webgl_extensions/extensions.rs index c5413ea1eb2..b3812f51cf5 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::ANGLEInstancedArraysBinding::ANGLEInstancedArraysConstants; use dom::bindings::codegen::Bindings::EXTTextureFilterAnisotropicBinding::EXTTextureFilterAnisotropicConstants; use dom::bindings::codegen::Bindings::OESStandardDerivativesBinding::OESStandardDerivativesConstants; use dom::bindings::codegen::Bindings::OESTextureHalfFloatBinding::OESTextureHalfFloatConstants; @@ -54,6 +55,13 @@ const DEFAULT_DISABLED_GET_TEX_PARAMETER_NAMES_WEBGL1: [GLenum; 1] = [ EXTTextureFilterAnisotropicConstants::TEXTURE_MAX_ANISOTROPY_EXT, ]; +// Param names that are implemented for glGetVertexAttrib 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/ANGLE_instanced_arrays/ +const DEFAULT_DISABLED_GET_VERTEX_ATTRIB_NAMES_WEBGL1: [GLenum; 1] = [ + ANGLEInstancedArraysConstants::VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE, +]; + /// WebGL features that are enabled/disabled by WebGL Extensions. #[derive(JSTraceable, MallocSizeOf)] struct WebGLExtensionFeatures { @@ -68,6 +76,8 @@ struct WebGLExtensionFeatures { disabled_get_parameter_names: FnvHashSet<GLenum>, /// WebGL GetTexParameter() names enabled by extensions. disabled_get_tex_parameter_names: FnvHashSet<GLenum>, + /// WebGL GetAttribVertex() names enabled by extensions. + disabled_get_vertex_attrib_names: FnvHashSet<GLenum>, /// WebGL OES_element_index_uint extension. element_index_uint_enabled: bool, /// WebGL EXT_blend_minmax extension. @@ -80,6 +90,7 @@ impl WebGLExtensionFeatures { disabled_tex_types, disabled_get_parameter_names, disabled_get_tex_parameter_names, + disabled_get_vertex_attrib_names, element_index_uint_enabled, blend_minmax_enabled, ) = match webgl_version { @@ -88,12 +99,20 @@ impl WebGLExtensionFeatures { 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(), + DEFAULT_DISABLED_GET_VERTEX_ATTRIB_NAMES_WEBGL1.iter().cloned().collect(), false, false, ) }, WebGLVersion::WebGL2 => { - (Default::default(), Default::default(), Default::default(), true, true) + ( + Default::default(), + Default::default(), + Default::default(), + Default::default(), + true, + true, + ) } }; Self { @@ -105,6 +124,7 @@ impl WebGLExtensionFeatures { hint_targets: Default::default(), disabled_get_parameter_names, disabled_get_tex_parameter_names, + disabled_get_vertex_attrib_names, element_index_uint_enabled, blend_minmax_enabled, } @@ -269,7 +289,16 @@ impl WebGLExtensions { !self.features.borrow().disabled_get_tex_parameter_names.contains(&name) } + pub fn enable_get_vertex_attrib_name(&self, name: GLenum) { + self.features.borrow_mut().disabled_get_vertex_attrib_names.remove(&name); + } + + pub fn is_get_vertex_attrib_name_enabled(&self, name: GLenum) -> bool { + !self.features.borrow().disabled_get_vertex_attrib_names.contains(&name) + } + fn register_all_extensions(&self) { + self.register::<ext::angleinstancedarrays::ANGLEInstancedArrays>(); self.register::<ext::extblendminmax::EXTBlendMinmax>(); self.register::<ext::extshadertexturelod::EXTShaderTextureLod>(); self.register::<ext::exttexturefilteranisotropic::EXTTextureFilterAnisotropic>(); |