Bladeren bron

completed buffer leak detection

ncannasse 10 jaren geleden
bovenliggende
commit
4e07deb107
3 gewijzigde bestanden met toevoegingen van 59 en 15 verwijderingen
  1. 1 0
      h3d/Buffer.hx
  2. 27 0
      h3d/impl/ManagedBuffer.hx
  3. 31 15
      h3d/impl/MemoryManager.hx

+ 1 - 0
h3d/Buffer.hx

@@ -32,6 +32,7 @@ class Buffer {
 	public var id : Int;
 	#if debug
 	var allocPos : h3d.impl.AllocPos;
+	var allocNext : Buffer;
 	#end
 
 	public var buffer(default,null) : h3d.impl.ManagedBuffer;

+ 27 - 0
h3d/impl/ManagedBuffer.hx

@@ -23,6 +23,9 @@ class ManagedBuffer {
 	var vbuf : Driver.VertexBuffer;
 	var freeList : FreeCell;
 	var next : ManagedBuffer;
+	#if debug
+	var allocHead : Buffer;
+	#end
 
 	public function new( stride, size, ?flags : Array<Buffer.BufferFlag> ) {
 		this.flags = new haxe.EnumFlags();
@@ -55,6 +58,10 @@ class ManagedBuffer {
 			b.position = p;
 			b.buffer = this;
 		};
+		#if debug
+		@:privateAccess b.allocNext = allocHead;
+		allocHead = b;
+		#end
 		return b;
 	}
 
@@ -101,6 +108,10 @@ class ManagedBuffer {
 			b.position = p;
 			b.buffer = this;
 		};
+		#if debug
+		@:privateAccess b.allocNext = allocHead;
+		allocHead = b;
+		#end
 		return true;
 	}
 
@@ -136,6 +147,22 @@ class ManagedBuffer {
 		}
 		if( nvert != 0 )
 			throw "assert";
+		#if debug
+		@:privateAccess {
+			var cur = allocHead, prev : Buffer = null;
+			while( cur != null ) {
+				if( cur == b ) {
+					if( prev == null )
+						allocHead = b.allocNext;
+					else
+						prev.allocNext = b.allocNext;
+					break;
+				}
+				prev = cur;
+				cur = cur.allocNext;
+			}
+		}
+		#end
 		if( freeList.count == size && !flags.has(Managed) )
 			dispose();
 	}

+ 31 - 15
h3d/impl/MemoryManager.hx

@@ -63,7 +63,7 @@ class MemoryManager {
 		Clean empty (unused) buffers
 	**/
 	public function cleanManagedBuffers() {
-		for( i in 0...buffers.length ) {
+		for( i in 1...buffers.length ) {
 			var b = buffers[i], prev : ManagedBuffer = null;
 			while( b != null ) {
 				if( b.freeList.count == b.size ) {
@@ -105,6 +105,19 @@ class MemoryManager {
 		m.vbuf = null;
 		usedMemory -= m.size * m.stride * 4;
 		bufferCount--;
+		#if debug
+		if( !m.flags.has(Managed) ) {
+			var c = buffers[0], prev : ManagedBuffer = null;
+			while( c != null ) {
+				if( c == m ) {
+					if( prev == null ) buffers[0] = m.next else prev.next = m.next;
+					break;
+				}
+				prev = c;
+				c = c.next;
+			}
+		}
+		#end
 	}
 
 	@:allow(h3d.Buffer)
@@ -133,6 +146,10 @@ class MemoryManager {
 
 		if( !b.flags.has(Managed) ) {
 			var m = new ManagedBuffer(stride, b.vertices);
+			#if debug
+			m.next = buffers[0];
+			buffers[0] = m;
+			#end
 			if( !m.allocBuffer(b) ) throw "assert";
 			return;
 		}
@@ -315,13 +332,24 @@ class MemoryManager {
 		};
 	}
 
+	@:access(h3d.Buffer)
 	public function allocStats() : Array<{ file : String, line : Int, count : Int, tex : Bool, size : Int }> {
 		#if !debug
 		return [];
 		#else
 		var h = new Map();
 		var all = [];
-		/*
+		for( t in textures ) {
+			var key = "$"+t.allocPos.fileName + ":" + t.allocPos.lineNumber;
+			var inf = h.get(key);
+			if( inf == null ) {
+				inf = { file : t.allocPos.fileName, line : t.allocPos.lineNumber, count : 0, size : 0, tex : true };
+				h.set(key, inf);
+				all.push(inf);
+			}
+			inf.count++;
+			inf.size += t.width * t.height * bpp(t);
+		}
 		for( buf in buffers ) {
 			var buf = buf;
 			while( buf != null ) {
@@ -335,24 +363,12 @@ class MemoryManager {
 						all.push(inf);
 					}
 					inf.count++;
-					inf.size += b.nvert * b.b.stride * 4;
+					inf.size += b.vertices * b.buffer.stride * 4;
 					b = b.allocNext;
 				}
 				buf = buf.next;
 			}
 		}
-		*/
-		for( t in textures ) {
-			var key = "$"+t.allocPos.fileName + ":" + t.allocPos.lineNumber;
-			var inf = h.get(key);
-			if( inf == null ) {
-				inf = { file : t.allocPos.fileName, line : t.allocPos.lineNumber, count : 0, size : 0, tex : true };
-				h.set(key, inf);
-				all.push(inf);
-			}
-			inf.count++;
-			inf.size += t.width * t.height * bpp(t);
-		}
 		all.sort(function(a, b) return a.size == b.size ? a.line - b.line : b.size - a.size);
 		return all;
 		#end