webgl: Refactor WebGLProgram::link

This makes it more correct, since we don't blindly send the Link
command. It's not observable though.
This commit is contained in:
Emilio Cobos Álvarez 2016-04-19 13:10:09 +02:00
parent c807cab300
commit f470ad0d88
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C

View file

@ -23,6 +23,7 @@ pub struct WebGLProgram {
webgl_object: WebGLObject,
id: u32,
is_deleted: Cell<bool>,
linked: Cell<bool>,
fragment_shader: MutNullableHeap<JS<WebGLShader>>,
vertex_shader: MutNullableHeap<JS<WebGLShader>>,
#[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();