aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webglprogram.rs
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2018-07-19 11:01:37 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2018-07-19 11:34:04 +0200
commitb64232d77bdf709e70504fcd449ddbd982efb2b2 (patch)
tree9aad20148c387486a847a6bd2a073ee5831e933e /components/script/dom/webglprogram.rs
parent8fabc6660aeff778b9ddfb96e2cc6ff5a0e03244 (diff)
downloadservo-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.rs22
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 {