From 95a0d0584ff9e628da01d497cef8184822188d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 1 Nov 2015 13:29:46 +0100 Subject: [PATCH] webgl: Add destructors for texture, program, shader, buffer and framebuffer This allows to cleanup resources earlier if they stop being used. Right now all resources were cleaned up when the context was destroyed, this is a slightly better approach. We ignore the possible failure of the send() call, since we don't keep track of these resources from the `WebGLRenderingContext` structure, so a texture could be destroyed after the context and give us problems. --- components/script/dom/webglbuffer.rs | 8 +++++++- components/script/dom/webglframebuffer.rs | 8 +++++++- components/script/dom/webglprogram.rs | 8 +++++++- components/script/dom/webglrenderbuffer.rs | 2 +- components/script/dom/webglshader.rs | 8 +++++++- components/script/dom/webgltexture.rs | 8 +++++++- 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs index 05f8d7263bb..17f13f33380 100644 --- a/components/script/dom/webglbuffer.rs +++ b/components/script/dom/webglbuffer.rs @@ -71,7 +71,13 @@ impl WebGLBuffer { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteBuffer(self.id))).unwrap(); + let _ = self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteBuffer(self.id))); } } } + +impl Drop for WebGLBuffer { + fn drop(&mut self) { + self.delete(); + } +} diff --git a/components/script/dom/webglframebuffer.rs b/components/script/dom/webglframebuffer.rs index a3a9781fbfb..6239312f9a9 100644 --- a/components/script/dom/webglframebuffer.rs +++ b/components/script/dom/webglframebuffer.rs @@ -60,7 +60,13 @@ impl WebGLFramebuffer { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteFramebuffer(self.id))).unwrap(); + let _ = self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteFramebuffer(self.id))); } } } + +impl Drop for WebGLFramebuffer { + fn drop(&mut self) { + self.delete(); + } +} diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs index 997f48c96b4..5e51172cb68 100644 --- a/components/script/dom/webglprogram.rs +++ b/components/script/dom/webglprogram.rs @@ -58,7 +58,7 @@ impl WebGLProgram { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteProgram(self.id))).unwrap(); + let _ = self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteProgram(self.id))); } } @@ -125,3 +125,9 @@ impl WebGLProgram { Ok(receiver.recv().unwrap()) } } + +impl Drop for WebGLProgram { + fn drop(&mut self) { + self.delete(); + } +} diff --git a/components/script/dom/webglrenderbuffer.rs b/components/script/dom/webglrenderbuffer.rs index b01bcce896a..6a534da53e6 100644 --- a/components/script/dom/webglrenderbuffer.rs +++ b/components/script/dom/webglrenderbuffer.rs @@ -59,7 +59,7 @@ impl WebGLRenderbuffer { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteRenderbuffer(self.id))).unwrap(); + let _ = self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteRenderbuffer(self.id))); } } } diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs index e33b27d3839..65dc958033f 100644 --- a/components/script/dom/webglshader.rs +++ b/components/script/dom/webglshader.rs @@ -121,7 +121,7 @@ impl WebGLShader { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteShader(self.id))).unwrap() + let _ = self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteShader(self.id))); } } @@ -152,3 +152,9 @@ impl WebGLShader { *self.source.borrow_mut() = Some(source); } } + +impl Drop for WebGLShader { + fn drop(&mut self) { + self.delete(); + } +} diff --git a/components/script/dom/webgltexture.rs b/components/script/dom/webgltexture.rs index fb8ee4033fd..d5f7ad8258e 100644 --- a/components/script/dom/webgltexture.rs +++ b/components/script/dom/webgltexture.rs @@ -78,7 +78,7 @@ impl WebGLTexture { pub fn delete(&self) { if !self.is_deleted.get() { self.is_deleted.set(true); - self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteTexture(self.id))).unwrap(); + let _ = self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DeleteTexture(self.id))); } } @@ -145,3 +145,9 @@ impl WebGLTexture { } } } + +impl Drop for WebGLTexture { + fn drop(&mut self) { + self.delete(); + } +}