From 32a56eab859fc825ad97ad513674629880824241 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 31 Mar 2020 17:14:28 -0700 Subject: [PATCH] Stop leaking textures and framebuffers in the OpenGL backend. Closes #264. Possibly addresses #286. --- gl/src/lib.rs | 13 ++++++++++++- renderer/src/gpu/renderer.rs | 7 +++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/gl/src/lib.rs b/gl/src/lib.rs index 65171a44..c20b0b79 100644 --- a/gl/src/lib.rs +++ b/gl/src/lib.rs @@ -456,12 +456,15 @@ impl Device for GLDevice { } #[inline] - fn destroy_framebuffer(&self, framebuffer: Self::Framebuffer) -> Self::Texture { + fn destroy_framebuffer(&self, mut framebuffer: Self::Framebuffer) -> Self::Texture { let texture = GLTexture { gl_texture: framebuffer.texture.gl_texture, size: framebuffer.texture.size, format: framebuffer.texture.format, }; + unsafe { + gl::DeleteFramebuffers(1, &mut framebuffer.gl_framebuffer); ck(); + } mem::forget(framebuffer); texture } @@ -991,6 +994,14 @@ pub struct GLTexture { pub format: TextureFormat, } +impl Drop for GLTexture { + fn drop(&mut self) { + unsafe { + gl::DeleteTextures(1, &mut self.gl_texture); ck(); + } + } +} + pub struct GLTimerQuery { gl_query: GLuint, } diff --git a/renderer/src/gpu/renderer.rs b/renderer/src/gpu/renderer.rs index 9cd11cb3..48c7e1bd 100644 --- a/renderer/src/gpu/renderer.rs +++ b/renderer/src/gpu/renderer.rs @@ -1140,11 +1140,10 @@ impl TextureCache where D: Device { fn create_texture(&mut self, device: &mut D, format: TextureFormat, size: Vector2I) -> D::Texture { for index in 0..self.textures.len() { - if device.texture_size(&self.textures[index]) != size || - device.texture_format(&self.textures[index]) != format { - continue; + if device.texture_size(&self.textures[index]) == size && + device.texture_format(&self.textures[index]) == format { + return self.textures.remove(index); } - return self.textures.remove(index); } device.create_texture(format, size)