fix VBO clean-up in vbo_exec_vtx_destroy()
authorBrian <brian.paul@tungstengraphics.com>
Mon, 20 Aug 2007 17:05:35 +0000 (11:05 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 20 Aug 2007 17:05:35 +0000 (11:05 -0600)
src/mesa/vbo/vbo_exec_api.c

index 24e2eba4720bbe50932c3c2627ad58f0eef1ce9e..b7f4d8a3075ffd82b3b6fe31f97533b87e74f2e6 100644 (file)
@@ -673,7 +673,8 @@ void vbo_exec_vtx_init( struct vbo_exec_context *exec )
    GLuint i;
 
    /* Allocate a buffer object.  Will just reuse this object
-    * continuously.
+    * continuously, unless vbo_use_buffer_objects() is called to enable
+    * use of real VBOs.
     */
    exec->vtx.bufferobj = ctx->Array.NullBufferObj;
    exec->vtx.buffer_map = ALIGN_MALLOC(VBO_VERT_BUFFER_SIZE * sizeof(GLfloat), 64);
@@ -702,9 +703,17 @@ void vbo_exec_vtx_init( struct vbo_exec_context *exec )
 
 void vbo_exec_vtx_destroy( struct vbo_exec_context *exec )
 {
-   if (exec->vtx.buffer_map) {
-      ALIGN_FREE(exec->vtx.buffer_map);
-      exec->vtx.buffer_map = NULL;
+   GLcontext *ctx = exec->ctx;
+   if (exec->vtx.bufferobj->Name) {
+      ctx->Driver.UnmapBuffer(ctx, GL_ARRAY_BUFFER_ARB, exec->vtx.bufferobj);
+      ctx->Driver.DeleteBuffer(ctx, exec->vtx.bufferobj);
+      exec->vtx.bufferobj = NULL;
+   }
+   else {
+      if (exec->vtx.buffer_map) {
+         ALIGN_FREE(exec->vtx.buffer_map);
+         exec->vtx.buffer_map = NULL;
+      }
    }
 }