intel: Unmap buffers if needed at DeleteBuffer time.
authorEric Anholt <eric@anholt.net>
Wed, 6 May 2009 20:58:57 +0000 (13:58 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 7 May 2009 03:44:34 +0000 (20:44 -0700)
This fixes a crash in glean's pbo test, which tripped over the assert when a
context was destroyed while a buffer was still mapped (Mesa doesn't call
UnmapBuffer in that case).  Regression in
c6bde8873fbda6d8467600b7491d8543c75b0509

src/mesa/drivers/dri/intel/intel_buffer_objects.c

index c849e4869e5f55482ef05c3b5f101acab888f271..f6b0d769c6b66b1a5676a31f0c4957a0b7e16c91 100644 (file)
@@ -35,6 +35,9 @@
 #include "intel_batchbuffer.h"
 #include "intel_regions.h"
 
+static GLboolean
+intel_bufferobj_unmap(GLcontext * ctx,
+                      GLenum target, struct gl_buffer_object *obj);
 
 /** Allocates a new dri_bo to store the data for the buffer object. */
 static void
@@ -100,7 +103,13 @@ intel_bufferobj_free(GLcontext * ctx, struct gl_buffer_object *obj)
    struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
 
    assert(intel_obj);
-   assert(!obj->Pointer); /* Mesa should have unmapped it */
+
+   /* Buffer objects are automatically unmapped when deleting according
+    * to the spec, but Mesa doesn't do UnmapBuffer for us at context destroy
+    * (though it does if you call glDeleteBuffers)
+    */
+   if (obj->Pointer)
+      intel_bufferobj_unmap(ctx, 0, obj);
 
    if (intel_obj->region) {
       intel_bufferobj_release_region(intel, intel_obj);