fix leaky textures & vbos

This commit is contained in:
Chris Forbes
2011-05-05 19:16:45 +12:00
parent 75588b050e
commit a52d7fb496
4 changed files with 14 additions and 25 deletions

View File

@@ -33,6 +33,9 @@ namespace OpenRA.Renderer.Cg
GraphicsDevice.CheckGlError(); GraphicsDevice.CheckGlError();
SetData(bitmap); SetData(bitmap);
} }
void FinalizeInner() { Gl.glDeleteTextures( 1, ref texture ); }
~Texture() { Game.RunAfterTick( FinalizeInner ); }
void PrepareTexture() void PrepareTexture()
{ {

View File

@@ -9,13 +9,14 @@
#endregion #endregion
using System; using System;
using System.Drawing;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using OpenRA.FileFormats.Graphics; using OpenRA.FileFormats.Graphics;
using Tao.OpenGl; using Tao.OpenGl;
namespace OpenRA.Renderer.Cg namespace OpenRA.Renderer.Cg
{ {
public class VertexBuffer<T> : IVertexBuffer<T>, IDisposable public class VertexBuffer<T> : IVertexBuffer<T>
where T : struct where T : struct
{ {
int buffer; int buffer;
@@ -31,6 +32,9 @@ namespace OpenRA.Renderer.Cg
Gl.GL_DYNAMIC_DRAW); Gl.GL_DYNAMIC_DRAW);
GraphicsDevice.CheckGlError(); GraphicsDevice.CheckGlError();
} }
void FinalizeInner() { Gl.glDeleteBuffers( 1, ref buffer ); }
~VertexBuffer() { Game.RunAfterTick( FinalizeInner ); }
public void SetData(T[] data, int length) 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)); Gl.glTexCoordPointer(4, Gl.GL_FLOAT, Marshal.SizeOf(typeof(T)), new IntPtr(12));
GraphicsDevice.CheckGlError(); GraphicsDevice.CheckGlError();
} }
bool disposed;
public void Dispose()
{
if (disposed) return;
GC.SuppressFinalize(this);
Gl.glDeleteBuffers(1, ref buffer);
GraphicsDevice.CheckGlError();
disposed = true;
}
//~VertexBuffer() { Dispose(); }
} }
} }

View File

@@ -40,6 +40,9 @@ namespace OpenRA.Renderer.Glsl
SetData(bitmap); SetData(bitmap);
} }
void FinalizeInner() { UpdateMemoryUsage(0); Gl.glDeleteTextures(1, ref texture); }
~Texture() { Game.RunAfterTick(FinalizeInner); }
void PrepareTexture() void PrepareTexture()
{ {
GraphicsDevice.CheckGlError(); GraphicsDevice.CheckGlError();

View File

@@ -15,7 +15,7 @@ using Tao.OpenGl;
namespace OpenRA.Renderer.Glsl namespace OpenRA.Renderer.Glsl
{ {
public class VertexBuffer<T> : IVertexBuffer<T>, IDisposable public class VertexBuffer<T> : IVertexBuffer<T>
where T : struct where T : struct
{ {
int buffer; int buffer;
@@ -52,16 +52,7 @@ namespace OpenRA.Renderer.Glsl
GraphicsDevice.CheckGlError(); GraphicsDevice.CheckGlError();
} }
bool disposed; void FinalizeInner() { Gl.glDeleteBuffers( 1, ref buffer ); }
public void Dispose() ~VertexBuffer() { Game.RunAfterTick( FinalizeInner ); }
{
if (disposed) return;
GC.SuppressFinalize(this);
Gl.glDeleteBuffers(1, ref buffer);
GraphicsDevice.CheckGlError();
disposed = true;
}
//~VertexBuffer() { Dispose(); }
} }
} }