[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