diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2018-06-20 10:19:38 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-20 10:19:38 -0400 |
commit | 8f84f893a7444cb28405774613f4eb4c82a0d076 (patch) | |
tree | 5e9cfc147054d9e8ed4379727ee3e776af4ff425 /components/script/dom/webgl_extensions | |
parent | 132bf17e871c09180d6df425478b55950e3d3324 (diff) | |
parent | fc3dd7cefc70be746c6daea3dc74c83c89a07cee (diff) | |
download | servo-8f84f893a7444cb28405774613f4eb4c82a0d076.tar.gz servo-8f84f893a7444cb28405774613f4eb4c82a0d076.zip |
Auto merge of #21072 - servo:webgl, r=emilio
Implement checks for vertex attribs enabled as arrays without a bound buffer
<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21072)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/webgl_extensions')
-rw-r--r-- | components/script/dom/webgl_extensions/ext/oesvertexarrayobject.rs | 24 |
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(); } } } |