diff options
author | Connor Brewster <brewsterc@my.caspercollege.edu> | 2016-03-26 18:23:16 -0600 |
---|---|---|
committer | Connor Brewster <brewsterc@my.caspercollege.edu> | 2016-04-02 12:31:47 -0600 |
commit | 3fd7634f545871603577d83a08950ab6f7026f1c (patch) | |
tree | f3175b69fc6b945e362547688bd5799c28d19c74 /components/script/dom/webglprogram.rs | |
parent | d0f692b2c51bc5c3e7509f850258781f50bdc7b3 (diff) | |
download | servo-3fd7634f545871603577d83a08950ab6f7026f1c.tar.gz servo-3fd7634f545871603577d83a08950ab6f7026f1c.zip |
webgl: finish, flush, detachShader, generateMipmap, Uniform1i
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 { |