[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26938] trunk/blender/source/blender/gpu/ intern/gpu_buffers.c: added some more error checking for buffer allocation and fixed it up a bit .

Lukas Steiblys imbusy at imbusy.org
Mon Feb 15 20:09:59 CET 2010


Revision: 26938
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26938
Author:   imbusy
Date:     2010-02-15 20:09:59 +0100 (Mon, 15 Feb 2010)

Log Message:
-----------
added some more error checking for buffer allocation and fixed it up a bit. Hopefully this won't introduce new bugs and fix old ones.

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c

Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2010-02-15 18:43:54 UTC (rev 26937)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2010-02-15 19:09:59 UTC (rev 26938)
@@ -88,7 +88,7 @@
 
 void GPU_buffer_pool_free(GPUBufferPool *pool)
 {
-	int i;
+	int i, index;
 
 	DEBUG_VBO("GPU_buffer_pool_free\n");
 
@@ -101,13 +101,18 @@
 		pool->start += MAX_FREE_GPU_BUFFERS;
 
 	for( i = 0; i < pool->size; i++ ) {
-		if( useVBOs ) {
-			glDeleteBuffersARB( 1, &pool->buffers[(pool->start+i)%MAX_FREE_GPU_BUFFERS]->id );
+		index = (pool->start+i)%MAX_FREE_GPU_BUFFERS;
+		if( pool->buffers[index] != 0 ) {
+			if( useVBOs ) {
+				glDeleteBuffersARB( 1, &pool->buffers[index]->id );
+			}
+			else {
+				MEM_freeN( pool->buffers[index]->pointer );
+			}
+			MEM_freeN(pool->buffers[index]);
+		} else {
+			DEBUG_VBO("Why are we accessing a null buffer?\n");
 		}
-		else {
-			MEM_freeN( pool->buffers[(pool->start+i)%MAX_FREE_GPU_BUFFERS]->pointer );
-		}
-		MEM_freeN(pool->buffers[(pool->start+i)%MAX_FREE_GPU_BUFFERS]);
 	}
 	MEM_freeN(pool);
 }
@@ -120,9 +125,12 @@
 
 	while( pool->start < 0 )
 		pool->start += MAX_FREE_GPU_BUFFERS;
-	for( i = index; i < pool->size-1; i++ ) {
+	for( i = index; i < pool->size; i++ ) {
 		pool->buffers[(pool->start+i)%MAX_FREE_GPU_BUFFERS] = pool->buffers[(pool->start+i+1)%MAX_FREE_GPU_BUFFERS];
 	}
+	if( pool->size < MAX_FREE_GPU_BUFFERS )
+		pool->buffers[(pool->start+pool->size)%MAX_FREE_GPU_BUFFERS] = 0;
+
 	pool->size--;
 }
 
@@ -138,16 +146,21 @@
 	last = pool->start+pool->size-1;
 	while( last < 0 )
 		last += MAX_FREE_GPU_BUFFERS;
-	last = (last+MAX_FREE_GPU_BUFFERS)%MAX_FREE_GPU_BUFFERS;
+	last = last%MAX_FREE_GPU_BUFFERS;
 
-	if( useVBOs ) {
-		glDeleteBuffersARB(1,&pool->buffers[last]->id);
-		MEM_freeN( pool->buffers[last] );
+	if( pool->buffers[last] != 0 ) {
+		if( useVBOs ) {
+			glDeleteBuffersARB(1,&pool->buffers[last]->id);
+			MEM_freeN( pool->buffers[last] );
+		}
+		else {
+			MEM_freeN( pool->buffers[last]->pointer );
+			MEM_freeN( pool->buffers[last] );
+		}
+		pool->buffers[last] = 0;
+	} else {
+		DEBUG_VBO("Why are we accessing a null buffer?\n");
 	}
-	else {
-		MEM_freeN( pool->buffers[last]->pointer );
-		MEM_freeN( pool->buffers[last] );
-	}
 	pool->size--;
 }
 
@@ -234,15 +247,15 @@
 
 	while( pool->start < 0 )
 		pool->start += MAX_FREE_GPU_BUFFERS;
-	place = (pool->start-1 + MAX_FREE_GPU_BUFFERS)%MAX_FREE_GPU_BUFFERS;
 
 	/* free the last used buffer in the queue if no more space */
 	if( pool->size == MAX_FREE_GPU_BUFFERS ) {
 		GPU_buffer_pool_delete_last( pool );
 	}
 
+	place = (pool->start + pool->size)%MAX_FREE_GPU_BUFFERS;
+
 	pool->size++;
-	pool->start = place;
 	pool->buffers[place] = buffer;
 }
 





More information about the Bf-blender-cvs mailing list