mesa: pass context parameter to gl_renderbuffer::Delete()
authorBrian Paul <brianp@vmware.com>
Fri, 30 Nov 2012 17:04:48 +0000 (10:04 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 30 Nov 2012 19:08:06 +0000 (12:08 -0700)
We sometimes need a rendering context when deleting renderbuffers.
Pass it explicitly instead of trying to grab a current context
(which might be NULL).  The next patch will make use of this.

Note: this is a candidate for the stable branches.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
15 files changed:
src/mesa/drivers/dri/intel/intel_fbo.c
src/mesa/drivers/dri/nouveau/nouveau_fbo.c
src/mesa/drivers/dri/radeon/radeon_fbo.c
src/mesa/drivers/dri/swrast/swrast.c
src/mesa/drivers/osmesa/osmesa.c
src/mesa/drivers/windows/gdi/wmesa.c
src/mesa/drivers/x11/xm_buffer.c
src/mesa/main/fbobject.c
src/mesa/main/mtypes.h
src/mesa/main/renderbuffer.c
src/mesa/main/renderbuffer.h
src/mesa/main/shared.c
src/mesa/state_tracker/st_cb_fbo.c
src/mesa/swrast/s_renderbuffer.c
src/mesa/swrast/s_texrender.c

index 96f6c32d2ef7b74148a63e719568f6ea2bfa0ca2..6a665218e0602b149950e0abc33b07ff414fc34b 100644 (file)
@@ -87,7 +87,7 @@ intel_new_framebuffer(struct gl_context * ctx, GLuint name)
 
 /** Called by gl_renderbuffer::Delete() */
 static void
-intel_delete_renderbuffer(struct gl_renderbuffer *rb)
+intel_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
    struct intel_renderbuffer *irb = intel_renderbuffer(rb);
 
@@ -95,7 +95,7 @@ intel_delete_renderbuffer(struct gl_renderbuffer *rb)
 
    intel_miptree_release(&irb->mt);
 
-   _mesa_delete_renderbuffer(rb);
+   _mesa_delete_renderbuffer(ctx, rb);
 }
 
 /**
index c3e23412df75d8a8b430fe5317dd4746650d0bae..c47bce8ccef391546f0286e5bea001e1f1217385 100644 (file)
@@ -102,12 +102,12 @@ nouveau_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
 }
 
 static void
-nouveau_renderbuffer_del(struct gl_renderbuffer *rb)
+nouveau_renderbuffer_del(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
        struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface;
 
        nouveau_surface_ref(NULL, s);
-       _mesa_delete_renderbuffer(rb);
+       _mesa_delete_renderbuffer(ctx, rb);
 }
 
 static struct gl_renderbuffer *
index 291f2b781884a9d6525a9b1089ace169000d6d6b..9ab74c46704da472d1c692545fedcba8c30703fa 100644 (file)
@@ -54,7 +54,7 @@ radeon_new_framebuffer(struct gl_context *ctx, GLuint name)
 }
 
 static void
-radeon_delete_renderbuffer(struct gl_renderbuffer *rb)
+radeon_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
   struct radeon_renderbuffer *rrb = radeon_renderbuffer(rb);
 
@@ -67,7 +67,7 @@ radeon_delete_renderbuffer(struct gl_renderbuffer *rb)
   if (rrb && rrb->bo) {
     radeon_bo_unref(rrb->bo);
   }
-  _mesa_delete_renderbuffer(rb);
+  _mesa_delete_renderbuffer(ctx, rb);
 }
 
 #if defined(RADEON_R100)
index 3a47cdb5808438d5cfcc67d70809815367eab088..2474ed88fb0c9ed2acf7a624bfaca5062e2d6120 100644 (file)
@@ -251,14 +251,14 @@ choose_pixel_format(const struct gl_config *v)
 }
 
 static void
-swrast_delete_renderbuffer(struct gl_renderbuffer *rb)
+swrast_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
     struct dri_swrast_renderbuffer *xrb = dri_swrast_renderbuffer(rb);
 
     TRACE;
 
     free(xrb->Base.Buffer);
-    _mesa_delete_renderbuffer(rb);
+    _mesa_delete_renderbuffer(ctx, rb);
 }
 
 /* see bytes_per_line in libGL */
index e02b2f3ca5961dab0acf7c20e137d9721d1c37a6..c206d64350908d9daa5f3e5b47a4ad3c26393c27 100644 (file)
@@ -386,9 +386,9 @@ compute_row_addresses( OSMesaContext osmesa )
  * Don't use _mesa_delete_renderbuffer since we can't free rb->Buffer.
  */
 static void
-osmesa_delete_renderbuffer(struct gl_renderbuffer *rb)
+osmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
-   free(rb);
+   _mesa_delete_renderbuffer(ctx, rb);
 }
 
 
index 9f6f750d02790b5bb39004914616c9adfa591ccf..50347cf77b992ba4e4da536418fc52a4c14720c8 100644 (file)
@@ -426,9 +426,9 @@ static void clear(struct gl_context *ctx, GLbitfield mask)
 
 
 static void
-wmesa_delete_renderbuffer(struct gl_renderbuffer *rb)
+wmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
-    free(rb);
+    _mesa_delete_renderbuffer(ctx, rb);
 }
 
 
index 1820d76bd46f11621775c3ca7a8cf16db96d168b..dc9a3bed9c223d97250503655ac2da1d0e72634b 100644 (file)
@@ -235,7 +235,7 @@ alloc_back_buffer(XMesaBuffer b, GLuint width, GLuint height)
 
 
 static void
-xmesa_delete_renderbuffer(struct gl_renderbuffer *rb)
+xmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
    /* XXX Note: the ximage or Pixmap attached to this renderbuffer
     * should probably get freed here, but that's currently done in
index 2e2fc2ca3149963419f116c51334150e4bdc6b55..9eec61de695be81bce3040c74575d084324ffa21 100644 (file)
@@ -78,7 +78,7 @@ static struct gl_framebuffer IncompleteFramebuffer;
 
 
 static void
-delete_dummy_renderbuffer(struct gl_renderbuffer *rb)
+delete_dummy_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
    /* no op */
 }
index f34b3421b0746f9f7f6126fd9bc639f9253e3149..5bfae69c83c191dc0ac7d8c1bf29defdb7a76e82 100644 (file)
@@ -2605,7 +2605,7 @@ struct gl_renderbuffer
    gl_format Format;      /**< The actual renderbuffer memory format */
 
    /** Delete this renderbuffer */
-   void (*Delete)(struct gl_renderbuffer *rb);
+   void (*Delete)(struct gl_context *ctx, struct gl_renderbuffer *rb);
 
    /** Allocate new storage for this renderbuffer */
    GLboolean (*AllocStorage)(struct gl_context *ctx,
index 26f53d1009d366e6c3341f7ccc393a5573c5a78a..2f284432994b20f5b191eb1c9cd7eacc10af9374 100644 (file)
@@ -80,7 +80,7 @@ _mesa_new_renderbuffer(struct gl_context *ctx, GLuint name)
  * free the object in the end.
  */
 void
-_mesa_delete_renderbuffer(struct gl_renderbuffer *rb)
+_mesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
    _glthread_DESTROY_MUTEX(rb->Mutex);
    free(rb);
@@ -159,7 +159,11 @@ _mesa_reference_renderbuffer_(struct gl_renderbuffer **ptr,
       _glthread_UNLOCK_MUTEX(oldRb->Mutex);
 
       if (deleteFlag) {
-         oldRb->Delete(oldRb);
+         GET_CURRENT_CONTEXT(ctx);
+         if (ctx)
+            oldRb->Delete(ctx, oldRb);
+         else
+            _mesa_problem(NULL, "Unable to delete renderbuffer, no context");
       }
 
       *ptr = NULL;
index 0934d85df04d293bab73cff861d3b55b41bf6ba0..5495ae15052a891ad380e0437e179f71ddd7bf76 100644 (file)
@@ -40,7 +40,7 @@ extern struct gl_renderbuffer *
 _mesa_new_renderbuffer(struct gl_context *ctx, GLuint name);
 
 extern void
-_mesa_delete_renderbuffer(struct gl_renderbuffer *rb);
+_mesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb);
 
 extern void
 _mesa_add_renderbuffer(struct gl_framebuffer *fb,
index ba82628f3eb88d7846a572ee3f92b8b4578221b7..eaf9f8de1b197c054c5307915c5919e504916daf 100644 (file)
@@ -253,10 +253,11 @@ delete_framebuffer_cb(GLuint id, void *data, void *userData)
 static void
 delete_renderbuffer_cb(GLuint id, void *data, void *userData)
 {
+   struct gl_context *ctx = (struct gl_context *) userData;
    struct gl_renderbuffer *rb = (struct gl_renderbuffer *) data;
    rb->RefCount = 0;  /* see comment for FBOs above */
    if (rb->Delete)
-      rb->Delete(rb);
+      rb->Delete(ctx, rb);
 }
 
 
index adee00bd2fc0e2cf5ca30996462e0032276fbddf..05a1dc67c18f8dcffb112f39b8b96d8fa332994b 100644 (file)
@@ -225,14 +225,14 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
  * gl_renderbuffer::Delete()
  */
 static void
-st_renderbuffer_delete(struct gl_renderbuffer *rb)
+st_renderbuffer_delete(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
    struct st_renderbuffer *strb = st_renderbuffer(rb);
    ASSERT(strb);
    pipe_surface_reference(&strb->surface, NULL);
    pipe_resource_reference(&strb->texture, NULL);
    free(strb->data);
-   _mesa_delete_renderbuffer(rb);
+   _mesa_delete_renderbuffer(ctx, rb);
 }
 
 
index b1fb57823f4e4426c6492033d5530eae692633f4..282b2c482b1e8f0ea08429e6f2ec5d9938dc689c 100644 (file)
@@ -164,13 +164,13 @@ soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
  * Called via gl_renderbuffer::Delete()
  */
 static void
-soft_renderbuffer_delete(struct gl_renderbuffer *rb)
+soft_renderbuffer_delete(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
    struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
 
    free(srb->Buffer);
    srb->Buffer = NULL;
-   _mesa_delete_renderbuffer(rb);
+   _mesa_delete_renderbuffer(ctx, rb);
 }
 
 
index 140e4b50f719dac3c0f0796df152787acefd2a4e..7b25a7b7d81b1d4edd6bf0794f15c98de9c6ae93 100644 (file)
@@ -16,7 +16,7 @@
 
 
 static void
-delete_texture_wrapper(struct gl_renderbuffer *rb)
+delete_texture_wrapper(struct gl_context *ctx, struct gl_renderbuffer *rb)
 {
    ASSERT(rb->RefCount == 0);
    free(rb);