diff options
-rw-r--r-- | components/script/dom/webglbuffer.rs | 20 | ||||
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 20 |
2 files changed, 16 insertions, 24 deletions
diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs index 4bb7959f8dd..5f00c7f45cc 100644 --- a/components/script/dom/webglbuffer.rs +++ b/components/script/dom/webglbuffer.rs @@ -7,6 +7,7 @@ use canvas_traits::webgl::{WebGLBufferId, WebGLCommand, WebGLError, WebGLMsgSend use canvas_traits::webgl::webgl_channel; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::WebGLBufferBinding; +use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants; use dom::bindings::reflector::reflect_dom_object; use dom::bindings::root::DomRoot; use dom::webglobject::WebGLObject; @@ -86,18 +87,25 @@ impl WebGLBuffer { Ok(()) } - pub fn buffer_data(&self, target: u32, data: &[u8], usage: u32) -> WebGLResult<()> { + pub fn buffer_data<T>(&self, target: u32, data: T, usage: u32) -> WebGLResult<()> + where + T: Into<Vec<u8>>, + { + match usage { + WebGLRenderingContextConstants::STREAM_DRAW | + WebGLRenderingContextConstants::STATIC_DRAW | + WebGLRenderingContextConstants::DYNAMIC_DRAW => (), + _ => return Err(WebGLError::InvalidEnum), + } + if let Some(previous_target) = self.target.get() { if target != previous_target { return Err(WebGLError::InvalidOperation); } } + let data = data.into(); self.capacity.set(data.len()); - self.renderer.send(WebGLCommand::BufferData( - target, - data.to_vec().into(), - usage, - )).unwrap(); + self.renderer.send(WebGLCommand::BufferData(target, data.into(), usage)).unwrap(); Ok(()) } diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 4fc569ca331..e40134e0310 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -1704,15 +1704,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { None => return Ok(self.webgl_error(InvalidValue)), }; - match usage { - constants::STREAM_DRAW | - constants::STATIC_DRAW | - constants::DYNAMIC_DRAW => (), - _ => return Ok(self.webgl_error(InvalidEnum)), - } - - handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, &data_vec, usage)); - + handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, data_vec, usage)); Ok(()) } @@ -1733,18 +1725,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { return Ok(self.webgl_error(InvalidValue)); } - match usage { - constants::STREAM_DRAW | - constants::STATIC_DRAW | - constants::DYNAMIC_DRAW => (), - _ => return Ok(self.webgl_error(InvalidEnum)), - } - // FIXME: Allocating a buffer based on user-requested size is // not great, but we don't have a fallible allocation to try. let data = vec![0u8; size as usize]; - handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, &data, usage)); - + handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, data, usage)); Ok(()) } |