destroy left-over VBOs on shutdown
authorTilman Sauerbeck <tilman@freedesktop.org>
Thu, 29 Jun 2006 18:36:51 +0000 (18:36 +0000)
committerTilman Sauerbeck <tilman@freedesktop.org>
Thu, 29 Jun 2006 18:36:51 +0000 (18:36 +0000)
src/mesa/drivers/dri/r300/r300_context.c
src/mesa/drivers/dri/r300/radeon_context.c
src/mesa/main/context.c

index d7f027dcb829e675360bdf703539b35772c28c80..4dd1e8b5014402a89144bccb90d4ea45a5528bb8 100644 (file)
@@ -385,8 +385,12 @@ static void r300FreeGartAllocations(r300ContextPtr r300)
                if (r300->rmm->u_list[i].ptr == NULL) {
                        continue;
                }
-               
-               assert(r300->rmm->u_list[i].pending);
+
+               /* check whether this buffer is still in use */
+               if (!r300->rmm->u_list[i].pending) {
+                       continue;
+               }
+
                assert(r300->rmm->u_list[i].h_pending == 0);
                
                tries = 0;
index 4172fbcf83432371ee9fef6006165369e0bad204..5de16104f0ab8fd98e83fded3ed20f73fa2d2c5c 100644 (file)
@@ -202,9 +202,13 @@ GLboolean radeonInitContext(radeonContextPtr radeon,
 void radeonCleanupContext(radeonContextPtr radeon)
 {
        /* free the Mesa context */
-       radeon->glCtx->DriverCtx = NULL;
        _mesa_destroy_context(radeon->glCtx);
 
+       /* the above call might result in calls to functions that depend on
+        * the DriverCtx.
+        */
+       radeon->glCtx->DriverCtx = NULL;
+
        if (radeon->state.scissor.pClipRects) {
                FREE(radeon->state.scissor.pClipRects);
                radeon->state.scissor.pClipRects = 0;
index 08020dbac8822b983185f51e0dd3752d7e52770c..40112ff8283c94a3bee3d02a43d3f5b18705b9ba 100644 (file)
@@ -888,6 +888,20 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
 #endif
 
 #if FEATURE_ARB_vertex_buffer_object
+   /* Free vertex buffer objects */
+   while (1) {
+      GLuint name = _mesa_HashFirstEntry(ss->BufferObjects);
+      if (name) {
+         struct gl_buffer_object *bufObj = (struct gl_buffer_object *)
+            _mesa_HashLookup(ss->BufferObjects, name);
+         ASSERT(bufObj);
+         ctx->Driver.DeleteBuffer(ctx, bufObj);
+         _mesa_HashRemove(ss->BufferObjects, name);
+      }
+      else {
+         break;
+      }
+   }
    _mesa_DeleteHashTable(ss->BufferObjects);
 #endif