diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2018-07-19 11:01:37 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2018-07-19 11:34:04 +0200 |
commit | b64232d77bdf709e70504fcd449ddbd982efb2b2 (patch) | |
tree | 9aad20148c387486a847a6bd2a073ee5831e933e /components/script/dom/webglprogram.rs | |
parent | 8fabc6660aeff778b9ddfb96e2cc6ff5a0e03244 (diff) | |
download | servo-b64232d77bdf709e70504fcd449ddbd982efb2b2.tar.gz servo-b64232d77bdf709e70504fcd449ddbd982efb2b2.zip |
Invalidate all WebGLUniformLocation values on program relink
Diffstat (limited to 'components/script/dom/webglprogram.rs')
-rw-r--r-- | components/script/dom/webglprogram.rs | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index 940d5d051e8..20a8eb1957b 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -28,6 +28,7 @@ pub struct WebGLProgram { is_deleted: Cell<bool>, link_called: Cell<bool>, linked: Cell<bool>, + link_generation: Cell<u64>, fragment_shader: MutNullableDom<WebGLShader>, vertex_shader: MutNullableDom<WebGLShader>, #[ignore_malloc_size_of = "Defined in ipc-channel"] @@ -37,15 +38,14 @@ pub struct WebGLProgram { } impl WebGLProgram { - fn new_inherited(renderer: WebGLMsgSender, - id: WebGLProgramId) - -> WebGLProgram { - WebGLProgram { + fn new_inherited(renderer: WebGLMsgSender, id: WebGLProgramId) -> Self { + Self { webgl_object: WebGLObject::new_inherited(), id: id, is_deleted: Cell::new(false), link_called: Cell::new(false), linked: Cell::new(false), + link_generation: Default::default(), fragment_shader: Default::default(), vertex_shader: Default::default(), renderer: renderer, @@ -109,6 +109,7 @@ impl WebGLProgram { return Err(WebGLError::InvalidOperation); } self.linked.set(false); + self.link_generation.set(self.link_generation.get().checked_add(1).unwrap()); *self.active_attribs.borrow_mut() = Box::new([]); *self.active_uniforms.borrow_mut() = Box::new([]); @@ -355,7 +356,14 @@ impl WebGLProgram { .unwrap(); let location = receiver.recv().unwrap(); - Ok(Some(WebGLUniformLocation::new(self.global().as_window(), location, self.id, size, type_))) + Ok(Some(WebGLUniformLocation::new( + self.global().as_window(), + location, + self.id, + self.link_generation.get(), + size, + type_, + ))) } /// glGetProgramInfoLog @@ -389,6 +397,10 @@ impl WebGLProgram { (None, None) => vec![] }) } + + pub fn link_generation(&self) -> u64 { + self.link_generation.get() + } } impl Drop for WebGLProgram { |