diff --git a/OpenRA.Renderer.Cg/Texture.cs b/OpenRA.Renderer.Cg/Texture.cs index 696cb0bb8a..6d9f387e88 100644 --- a/OpenRA.Renderer.Cg/Texture.cs +++ b/OpenRA.Renderer.Cg/Texture.cs @@ -33,6 +33,9 @@ namespace OpenRA.Renderer.Cg GraphicsDevice.CheckGlError(); SetData(bitmap); } + + void FinalizeInner() { Gl.glDeleteTextures( 1, ref texture ); } + ~Texture() { Game.RunAfterTick( FinalizeInner ); } void PrepareTexture() { diff --git a/OpenRA.Renderer.Cg/VertexBuffer.cs b/OpenRA.Renderer.Cg/VertexBuffer.cs index 53e0bf2746..8fbc5a3d8f 100644 --- a/OpenRA.Renderer.Cg/VertexBuffer.cs +++ b/OpenRA.Renderer.Cg/VertexBuffer.cs @@ -9,13 +9,14 @@ #endregion using System; +using System.Drawing; using System.Runtime.InteropServices; using OpenRA.FileFormats.Graphics; using Tao.OpenGl; namespace OpenRA.Renderer.Cg { - public class VertexBuffer : IVertexBuffer, IDisposable + public class VertexBuffer : IVertexBuffer where T : struct { int buffer; @@ -31,6 +32,9 @@ namespace OpenRA.Renderer.Cg Gl.GL_DYNAMIC_DRAW); GraphicsDevice.CheckGlError(); } + + void FinalizeInner() { Gl.glDeleteBuffers( 1, ref buffer ); } + ~VertexBuffer() { Game.RunAfterTick( FinalizeInner ); } public void SetData(T[] data, int length) { @@ -51,17 +55,5 @@ namespace OpenRA.Renderer.Cg Gl.glTexCoordPointer(4, Gl.GL_FLOAT, Marshal.SizeOf(typeof(T)), new IntPtr(12)); GraphicsDevice.CheckGlError(); } - - bool disposed; - public void Dispose() - { - if (disposed) return; - GC.SuppressFinalize(this); - Gl.glDeleteBuffers(1, ref buffer); - GraphicsDevice.CheckGlError(); - disposed = true; - } - - //~VertexBuffer() { Dispose(); } } } diff --git a/OpenRA.Renderer.Gl/Texture.cs b/OpenRA.Renderer.Gl/Texture.cs index 8ec88db429..cb0d4f65f8 100644 --- a/OpenRA.Renderer.Gl/Texture.cs +++ b/OpenRA.Renderer.Gl/Texture.cs @@ -40,6 +40,9 @@ namespace OpenRA.Renderer.Glsl SetData(bitmap); } + void FinalizeInner() { UpdateMemoryUsage(0); Gl.glDeleteTextures(1, ref texture); } + ~Texture() { Game.RunAfterTick(FinalizeInner); } + void PrepareTexture() { GraphicsDevice.CheckGlError(); diff --git a/OpenRA.Renderer.Gl/VertexBuffer.cs b/OpenRA.Renderer.Gl/VertexBuffer.cs index 2dda205674..0aa49dcae2 100644 --- a/OpenRA.Renderer.Gl/VertexBuffer.cs +++ b/OpenRA.Renderer.Gl/VertexBuffer.cs @@ -15,7 +15,7 @@ using Tao.OpenGl; namespace OpenRA.Renderer.Glsl { - public class VertexBuffer : IVertexBuffer, IDisposable + public class VertexBuffer : IVertexBuffer where T : struct { int buffer; @@ -52,16 +52,7 @@ namespace OpenRA.Renderer.Glsl GraphicsDevice.CheckGlError(); } - bool disposed; - public void Dispose() - { - if (disposed) return; - GC.SuppressFinalize(this); - Gl.glDeleteBuffers(1, ref buffer); - GraphicsDevice.CheckGlError(); - disposed = true; - } - - //~VertexBuffer() { Dispose(); } + void FinalizeInner() { Gl.glDeleteBuffers( 1, ref buffer ); } + ~VertexBuffer() { Game.RunAfterTick( FinalizeInner ); } } }