aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webgl_extensions/ext
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2018-06-20 15:10:32 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2018-06-20 15:59:06 +0200
commitfc3dd7cefc70be746c6daea3dc74c83c89a07cee (patch)
treed1d1350ad7e43f0a3e2d3618538b7af61bd88160 /components/script/dom/webgl_extensions/ext
parent440e855c335cce5f6523044ac53f54ac727d92e7 (diff)
downloadservo-fc3dd7cefc70be746c6daea3dc74c83c89a07cee.tar.gz
servo-fc3dd7cefc70be746c6daea3dc74c83c89a07cee.zip
Implement checks for vertex attribs enabled as arrays without a bound buffer
Diffstat (limited to 'components/script/dom/webgl_extensions/ext')
-rw-r--r--components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs24
1 files changed, 12 insertions, 12 deletions
diff --git a/components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs b/components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs
index f80cd7385e7..a6e8739862e 100644
--- a/components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs
+++ b/components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs
@@ -13,7 +13,6 @@ use dom_struct::dom_struct;
use js::conversions::ToJSValConvertible;
use js::jsapi::JSContext;
use js::jsval::{JSVal, NullValue};
-use std::iter;
use super::{WebGLExtension, WebGLExtensions, WebGLExtensionSpec};
#[dom_struct]
@@ -70,9 +69,10 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
}
// Remove VAO references from buffers
- let buffers = vao.bound_attrib_buffers();
- for buffer in buffers {
- buffer.remove_vao_reference(vao.id());
+ for (_, &(_, ref buffer)) in vao.bound_attrib_buffers().borrow().iter() {
+ if let Some(ref buffer) = *buffer {
+ buffer.remove_vao_reference(vao.id());
+ }
}
if let Some(buffer) = vao.bound_buffer_element_array() {
buffer.remove_vao_reference(vao.id());
@@ -94,11 +94,12 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
fn BindVertexArrayOES(&self, vao: Option<&WebGLVertexArrayObjectOES>) {
if let Some(bound_vao) = self.bound_vao.get() {
// Store buffers attached to attrib pointers
- let buffers = self.ctx.borrow_bound_attrib_buffers();
- bound_vao.set_bound_attrib_buffers(buffers.iter().map(|(key, buffer)| {
- (*buffer).add_vao_reference(bound_vao.id());
- (*key, &**buffer)
- }));
+ bound_vao.bound_attrib_buffers().set_from(&self.ctx.bound_attrib_buffers());
+ for (_, (_, ref buffer)) in bound_vao.bound_attrib_buffers().borrow().iter() {
+ if let Some(ref buffer) = *buffer {
+ buffer.add_vao_reference(bound_vao.id());
+ }
+ }
// Store element array buffer
let element_array = self.ctx.bound_buffer_element_array();
bound_vao.set_bound_buffer_element_array(element_array.as_ref().map(|buffer| {
@@ -118,14 +119,13 @@ impl OESVertexArrayObjectMethods for OESVertexArrayObject {
self.bound_vao.set(Some(&vao));
// Restore WebGLRenderingContext current bindings
- let buffers = vao.borrow_bound_attrib_buffers();
- self.ctx.set_bound_attrib_buffers(buffers.iter().map(|(k, v)| (*k, &**v)));
+ self.ctx.bound_attrib_buffers().set_from(&vao.bound_attrib_buffers());
let element_array = vao.bound_buffer_element_array();
self.ctx.set_bound_buffer_element_array(element_array.as_ref().map(|buffer| &**buffer));
} else {
self.ctx.send_command(WebGLCommand::BindVertexArray(None));
self.bound_vao.set(None);
- self.ctx.set_bound_attrib_buffers(iter::empty());
+ self.ctx.bound_attrib_buffers().clear();
}
}
}