diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2018-07-09 10:13:57 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2018-07-09 15:27:49 +0200 |
commit | fc0e403fb0791d29cdb3d66b9460675807f5c695 (patch) | |
tree | 2110b9b13798260a10493a2d43802f40216bc4cf /components/script/dom/webglprogram.rs | |
parent | 41e105733c594a5660efa018cbb61a5ed67cb82d (diff) | |
download | servo-fc0e403fb0791d29cdb3d66b9460675807f5c695.tar.gz servo-fc0e403fb0791d29cdb3d66b9460675807f5c695.zip |
Implement attribute aliasing check (fixes #21136)
Diffstat (limited to 'components/script/dom/webglprogram.rs')
-rw-r--r-- | components/script/dom/webglprogram.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index 4c52ed75928..d5902e1afff 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -18,6 +18,7 @@ use dom::webglrenderingcontext::MAX_UNIFORM_AND_ATTRIBUTE_LEN; use dom::webglshader::WebGLShader; use dom::window::Window; use dom_struct::dom_struct; +use fnv::FnvHashSet; use std::cell::{Cell, Ref}; #[dom_struct] @@ -121,6 +122,26 @@ impl WebGLProgram { let (sender, receiver) = webgl_channel().unwrap(); self.renderer.send(WebGLCommand::LinkProgram(self.id, sender)).unwrap(); let link_info = receiver.recv().unwrap(); + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#6.31 + let mut used_locs = FnvHashSet::default(); + for active_attrib in &*link_info.active_attribs { + if active_attrib.location == -1 { + continue; + } + let columns = match active_attrib.type_ { + constants::FLOAT_MAT2 => 2, + constants::FLOAT_MAT3 => 3, + constants::FLOAT_MAT4 => 4, + _ => 1, + }; + for column in 0..columns { + if !used_locs.insert(active_attrib.location as u32 + column) { + return Ok(()); + } + } + } + self.linked.set(link_info.linked); *self.active_attribs.borrow_mut() = link_info.active_attribs; Ok(()) |