aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webglprogram.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/webglprogram.rs')
-rw-r--r--components/script/dom/webglprogram.rs31
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 {