Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorLukas Steiblys <imbusy@imbusy.org>2010-02-15 22:09:59 +0300
committerLukas Steiblys <imbusy@imbusy.org>2010-02-15 22:09:59 +0300
commit866ecdebe709636bd5bbba94236595b7b57b8cc9 (patch)
tree0184494f359bb7212fc5980962654d7164e5dd67 /source
parentc5bcbad779a4709db914851560b66bcd94f3fcc0 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index c36d20fa5e5..34de3078c07 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -88,7 +88,7 @@ GPUBufferPool *GPU_buffer_pool_new()
void GPU_buffer_pool_free(GPUBufferPool *pool)
{
- int i;
+ int i, index;
DEBUG_VBO("GPU_buffer_pool_free\n");
@@ -101,13 +101,18 @@ void GPU_buffer_pool_free(GPUBufferPool *pool)
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 );
- }
- else {
- MEM_freeN( pool->buffers[(pool->start+i)%MAX_FREE_GPU_BUFFERS]->pointer );
+ 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");
}
- MEM_freeN(pool->buffers[(pool->start+i)%MAX_FREE_GPU_BUFFERS]);
}
MEM_freeN(pool);
}
@@ -120,9 +125,12 @@ void GPU_buffer_pool_remove( int index, GPUBufferPool *pool )
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,15 +146,20 @@ void GPU_buffer_pool_delete_last( GPUBufferPool *pool )
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] );
- }
- else {
- MEM_freeN( pool->buffers[last]->pointer );
- 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");
}
pool->size--;
}
@@ -234,15 +247,15 @@ void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool )
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;
}