[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26997] trunk/blender/source/blender/gpu: another attempt at fixing the VBO buffer deletion bugs
Lukas Steiblys
imbusy at imbusy.org
Wed Feb 17 19:48:02 CET 2010
Revision: 26997
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26997
Author: imbusy
Date: 2010-02-17 19:48:02 +0100 (Wed, 17 Feb 2010)
Log Message:
-----------
another attempt at fixing the VBO buffer deletion bugs
Modified Paths:
--------------
trunk/blender/source/blender/gpu/gpu_buffers.h
trunk/blender/source/blender/gpu/intern/gpu_buffers.c
Modified: trunk/blender/source/blender/gpu/gpu_buffers.h
===================================================================
--- trunk/blender/source/blender/gpu/gpu_buffers.h 2010-02-17 17:22:39 UTC (rev 26996)
+++ trunk/blender/source/blender/gpu/gpu_buffers.h 2010-02-17 18:48:02 UTC (rev 26997)
@@ -42,6 +42,12 @@
#define DEBUG_VBO(X)
#endif
+#ifdef _DEBUG
+#define ERROR_VBO(X) printf(X)
+#else
+#define ERROR_VBO(X)
+#endif
+
struct DerivedMesh;
struct GHash;
@@ -64,10 +70,6 @@
typedef struct GPUBufferPool
{
int size; /* number of allocated buffers stored */
- int start; /* for a queue like structure */
- /* when running out of space for storing buffers,
- the last one used will be thrown away */
-
GPUBuffer* buffers[MAX_FREE_GPU_BUFFERS];
} GPUBufferPool;
Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c 2010-02-17 17:22:39 UTC (rev 26996)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c 2010-02-17 18:48:02 UTC (rev 26997)
@@ -88,7 +88,7 @@
void GPU_buffer_pool_free(GPUBufferPool *pool)
{
- int i, index;
+ int i;
DEBUG_VBO("GPU_buffer_pool_free\n");
@@ -97,21 +97,17 @@
if( pool == 0 )
return;
- while( pool->start < 0 )
- pool->start += MAX_FREE_GPU_BUFFERS;
-
for( i = 0; i < pool->size; i++ ) {
- index = (pool->start+i)%MAX_FREE_GPU_BUFFERS;
- if( pool->buffers[index] != 0 ) {
+ if( pool->buffers[i] != 0 ) {
if( useVBOs ) {
- glDeleteBuffersARB( 1, &pool->buffers[index]->id );
+ glDeleteBuffersARB( 1, &pool->buffers[i]->id );
}
else {
- MEM_freeN( pool->buffers[index]->pointer );
+ MEM_freeN( pool->buffers[i]->pointer );
}
- MEM_freeN(pool->buffers[index]);
+ MEM_freeN(pool->buffers[i]);
} else {
- DEBUG_VBO("Why are we accessing a null buffer?\n");
+ ERROR_VBO("Why are we accessing a null buffer in GPU_buffer_pool_free?\n");
}
}
MEM_freeN(pool);
@@ -121,15 +117,17 @@
{
int i;
+ if( index >= pool->size || index < 0 ) {
+ ERROR_VBO("Wrong index, out of bounds in call to GPU_buffer_pool_remove");
+ return;
+ }
DEBUG_VBO("GPU_buffer_pool_remove\n");
- while( pool->start < 0 )
- pool->start += MAX_FREE_GPU_BUFFERS;
- 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];
+ for( i = index; i < pool->size-1; i++ ) {
+ pool->buffers[i] = pool->buffers[i+1];
}
- if( pool->size < MAX_FREE_GPU_BUFFERS )
- pool->buffers[(pool->start+pool->size)%MAX_FREE_GPU_BUFFERS] = 0;
+ if( pool->size > 0 )
+ pool->buffers[pool->size-1] = 0;
pool->size--;
}
@@ -140,13 +138,10 @@
DEBUG_VBO("GPU_buffer_pool_delete_last\n");
- if( pool->size == 0 )
+ if( pool->size <= 0 )
return;
- last = pool->start+pool->size-1;
- while( last < 0 )
- last += MAX_FREE_GPU_BUFFERS;
- last = last%MAX_FREE_GPU_BUFFERS;
+ last = pool->size-1;
if( pool->buffers[last] != 0 ) {
if( useVBOs ) {
@@ -180,14 +175,10 @@
pool = globalPool;
}
- while( pool->start < 0 )
- pool->start += MAX_FREE_GPU_BUFFERS;
-
for( i = 0; i < pool->size; i++ ) {
- int actuali = (pool->start+i)%MAX_FREE_GPU_BUFFERS;
- cursize = pool->buffers[actuali]->size;
+ cursize = pool->buffers[i]->size;
if( cursize == size ) {
- allocated = pool->buffers[actuali];
+ allocated = pool->buffers[i];
GPU_buffer_pool_remove(i,pool);
DEBUG_VBO("free buffer of exact size found\n");
return allocated;
@@ -195,7 +186,7 @@
/* smaller buffers won't fit data and buffers at least twice as big are a waste of memory */
else if( cursize > size && size > cursize/2 ) {
/* is it closer to the required size than the last appropriate buffer found. try to save memory */
- if( bestfit == -1 || pool->buffers[(pool->start+bestfit)%MAX_FREE_GPU_BUFFERS]->size > cursize ) {
+ if( bestfit == -1 || pool->buffers[bestfit]->size > cursize ) {
bestfit = i;
}
}
@@ -223,10 +214,10 @@
}
}
else {
- sprintf(buffer,"free buffer found. Wasted %d bytes\n", pool->buffers[(pool->start+bestfit)%MAX_FREE_GPU_BUFFERS]->size-size);
+ sprintf(buffer,"free buffer found. Wasted %d bytes\n", pool->buffers[bestfit]->size-size);
DEBUG_VBO(buffer);
- allocated = pool->buffers[(pool->start+bestfit)%MAX_FREE_GPU_BUFFERS];
+ allocated = pool->buffers[bestfit];
GPU_buffer_pool_remove(bestfit,pool);
}
return allocated;
@@ -234,8 +225,7 @@
void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool )
{
- int place;
-
+ int i;
DEBUG_VBO("GPU_buffer_free\n");
if( buffer == 0 )
@@ -245,18 +235,16 @@
if( pool == 0 )
globalPool = GPU_buffer_pool_new();
- while( pool->start < 0 )
- pool->start += 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;
-
+ for( i =pool->size; i > 0; i-- ) {
+ pool->buffers[i] = pool->buffers[i-1];
+ }
+ pool->buffers[0] = buffer;
pool->size++;
- pool->buffers[place] = buffer;
}
GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
More information about the Bf-blender-cvs
mailing list