aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webglprogram.rs
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2018-07-09 10:13:57 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2018-07-09 15:27:49 +0200
commitfc0e403fb0791d29cdb3d66b9460675807f5c695 (patch)
tree2110b9b13798260a10493a2d43802f40216bc4cf /components/script/dom/webglprogram.rs
parent41e105733c594a5660efa018cbb61a5ed67cb82d (diff)
downloadservo-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.rs21
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(())