From f470ad0d884f50247f4846a8271e67616ffc7354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 19 Apr 2016 13:10:09 +0200 Subject: [PATCH] webgl: Refactor WebGLProgram::link This makes it more correct, since we don't blindly send the Link command. It's not observable though. --- components/script/dom/webglprogram.rs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index d288e9422c4..28cac1ed11b 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -23,6 +23,7 @@ pub struct WebGLProgram { webgl_object: WebGLObject, id: u32, is_deleted: Cell, + linked: Cell, fragment_shader: MutNullableHeap>, vertex_shader: MutNullableHeap>, #[ignore_heap_size_of = "Defined in ipc-channel"] @@ -35,6 +36,7 @@ impl WebGLProgram { webgl_object: WebGLObject::new_inherited(), id: id, is_deleted: Cell::new(false), + linked: Cell::new(false), fragment_shader: Default::default(), vertex_shader: Default::default(), renderer: renderer, @@ -71,19 +73,27 @@ impl WebGLProgram { /// glLinkProgram pub fn link(&self) { + self.linked.set(false); + + match self.fragment_shader.get() { + Some(ref shader) if shader.successfully_compiled() => {}, + _ => return, + } + + match self.vertex_shader.get() { + Some(ref shader) if shader.successfully_compiled() => {}, + _ => return, + } + + self.linked.set(true); + self.renderer.send(CanvasMsg::WebGL(WebGLCommand::LinkProgram(self.id))).unwrap(); } /// glUseProgram pub fn use_program(&self) -> WebGLResult<()> { - match self.fragment_shader.get() { - Some(ref shader) if shader.successfully_compiled() => {}, - _ => return Err(WebGLError::InvalidOperation), - } - - match self.vertex_shader.get() { - Some(ref shader) if shader.successfully_compiled() => {}, - _ => return Err(WebGLError::InvalidOperation), + if !self.linked.get() { + return Err(WebGLError::InvalidOperation); } self.renderer.send(CanvasMsg::WebGL(WebGLCommand::UseProgram(self.id))).unwrap();