diff options
Diffstat (limited to 'components/script/dom/webglprogram.rs')
-rw-r--r-- | components/script/dom/webglprogram.rs | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index 338a1e8d46b..378039b03eb 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -94,7 +94,10 @@ impl WebGLProgram { let shader_slot = match shader.gl_type() { constants::FRAGMENT_SHADER => &self.fragment_shader, constants::VERTEX_SHADER => &self.vertex_shader, - _ => return Err(WebGLError::InvalidOperation), + _ => { + error!("detachShader: Unexpected shader type"); + return Err(WebGLError::InvalidValue); + } }; // TODO(emilio): Differentiate between same shader already assigned and other previous @@ -110,6 +113,32 @@ impl WebGLProgram { Ok(()) } + /// glDetachShader + pub fn detach_shader(&self, shader: &WebGLShader) -> WebGLResult<()> { + let shader_slot = match shader.gl_type() { + constants::FRAGMENT_SHADER => &self.fragment_shader, + constants::VERTEX_SHADER => &self.vertex_shader, + _ => { + error!("detachShader: Unexpected shader type"); + return Err(WebGLError::InvalidValue); + } + }; + + match shader_slot.get() { + Some(ref attached_shader) if attached_shader.id() != shader.id() => + return Err(WebGLError::InvalidOperation), + None => + return Err(WebGLError::InvalidOperation), + _ => {} + } + + shader_slot.set(None); + + self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DetachShader(self.id, shader.id()))).unwrap(); + + Ok(()) + } + /// glBindAttribLocation pub fn bind_attrib_location(&self, index: u32, name: DOMString) -> WebGLResult<()> { if name.len() > MAX_UNIFORM_AND_ATTRIBUTE_LEN { |