mesa: pass context parameter to gl_renderbuffer::Delete()

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>
This commit is contained in:
Brian Paul
2012-11-30 10:04:48 -07:00
parent ca3ed3e024
commit c73245882c
15 changed files with 29 additions and 24 deletions

View File

@@ -87,7 +87,7 @@ intel_new_framebuffer(struct gl_context * ctx, GLuint name)
/** Called by gl_renderbuffer::Delete() */ /** Called by gl_renderbuffer::Delete() */
static void 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); struct intel_renderbuffer *irb = intel_renderbuffer(rb);
@@ -95,7 +95,7 @@ intel_delete_renderbuffer(struct gl_renderbuffer *rb)
intel_miptree_release(&irb->mt); intel_miptree_release(&irb->mt);
_mesa_delete_renderbuffer(rb); _mesa_delete_renderbuffer(ctx, rb);
} }
/** /**

View File

@@ -102,12 +102,12 @@ nouveau_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
} }
static void 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; struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface;
nouveau_surface_ref(NULL, s); nouveau_surface_ref(NULL, s);
_mesa_delete_renderbuffer(rb); _mesa_delete_renderbuffer(ctx, rb);
} }
static struct gl_renderbuffer * static struct gl_renderbuffer *

View File

@@ -54,7 +54,7 @@ radeon_new_framebuffer(struct gl_context *ctx, GLuint name)
} }
static void 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); struct radeon_renderbuffer *rrb = radeon_renderbuffer(rb);
@@ -67,7 +67,7 @@ radeon_delete_renderbuffer(struct gl_renderbuffer *rb)
if (rrb && rrb->bo) { if (rrb && rrb->bo) {
radeon_bo_unref(rrb->bo); radeon_bo_unref(rrb->bo);
} }
_mesa_delete_renderbuffer(rb); _mesa_delete_renderbuffer(ctx, rb);
} }
#if defined(RADEON_R100) #if defined(RADEON_R100)

View File

@@ -251,14 +251,14 @@ choose_pixel_format(const struct gl_config *v)
} }
static void 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); struct dri_swrast_renderbuffer *xrb = dri_swrast_renderbuffer(rb);
TRACE; TRACE;
free(xrb->Base.Buffer); free(xrb->Base.Buffer);
_mesa_delete_renderbuffer(rb); _mesa_delete_renderbuffer(ctx, rb);
} }
/* see bytes_per_line in libGL */ /* see bytes_per_line in libGL */

View File

@@ -386,9 +386,9 @@ compute_row_addresses( OSMesaContext osmesa )
* Don't use _mesa_delete_renderbuffer since we can't free rb->Buffer. * Don't use _mesa_delete_renderbuffer since we can't free rb->Buffer.
*/ */
static void 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);
} }

View File

@@ -426,9 +426,9 @@ static void clear(struct gl_context *ctx, GLbitfield mask)
static void 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);
} }

View File

@@ -235,7 +235,7 @@ alloc_back_buffer(XMesaBuffer b, GLuint width, GLuint height)
static void 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 /* XXX Note: the ximage or Pixmap attached to this renderbuffer
* should probably get freed here, but that's currently done in * should probably get freed here, but that's currently done in

View File

@@ -78,7 +78,7 @@ static struct gl_framebuffer IncompleteFramebuffer;
static void static void
delete_dummy_renderbuffer(struct gl_renderbuffer *rb) delete_dummy_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
{ {
/* no op */ /* no op */
} }

View File

@@ -2605,7 +2605,7 @@ struct gl_renderbuffer
gl_format Format; /**< The actual renderbuffer memory format */ gl_format Format; /**< The actual renderbuffer memory format */
/** Delete this renderbuffer */ /** 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 */ /** Allocate new storage for this renderbuffer */
GLboolean (*AllocStorage)(struct gl_context *ctx, GLboolean (*AllocStorage)(struct gl_context *ctx,

View File

@@ -80,7 +80,7 @@ _mesa_new_renderbuffer(struct gl_context *ctx, GLuint name)
* free the object in the end. * free the object in the end.
*/ */
void void
_mesa_delete_renderbuffer(struct gl_renderbuffer *rb) _mesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
{ {
_glthread_DESTROY_MUTEX(rb->Mutex); _glthread_DESTROY_MUTEX(rb->Mutex);
free(rb); free(rb);
@@ -159,7 +159,11 @@ _mesa_reference_renderbuffer_(struct gl_renderbuffer **ptr,
_glthread_UNLOCK_MUTEX(oldRb->Mutex); _glthread_UNLOCK_MUTEX(oldRb->Mutex);
if (deleteFlag) { 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; *ptr = NULL;

View File

@@ -40,7 +40,7 @@ extern struct gl_renderbuffer *
_mesa_new_renderbuffer(struct gl_context *ctx, GLuint name); _mesa_new_renderbuffer(struct gl_context *ctx, GLuint name);
extern void extern void
_mesa_delete_renderbuffer(struct gl_renderbuffer *rb); _mesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb);
extern void extern void
_mesa_add_renderbuffer(struct gl_framebuffer *fb, _mesa_add_renderbuffer(struct gl_framebuffer *fb,

View File

@@ -253,10 +253,11 @@ delete_framebuffer_cb(GLuint id, void *data, void *userData)
static void static void
delete_renderbuffer_cb(GLuint id, void *data, void *userData) 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; struct gl_renderbuffer *rb = (struct gl_renderbuffer *) data;
rb->RefCount = 0; /* see comment for FBOs above */ rb->RefCount = 0; /* see comment for FBOs above */
if (rb->Delete) if (rb->Delete)
rb->Delete(rb); rb->Delete(ctx, rb);
} }

View File

@@ -225,14 +225,14 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
* gl_renderbuffer::Delete() * gl_renderbuffer::Delete()
*/ */
static void 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); struct st_renderbuffer *strb = st_renderbuffer(rb);
ASSERT(strb); ASSERT(strb);
pipe_surface_reference(&strb->surface, NULL); pipe_surface_reference(&strb->surface, NULL);
pipe_resource_reference(&strb->texture, NULL); pipe_resource_reference(&strb->texture, NULL);
free(strb->data); free(strb->data);
_mesa_delete_renderbuffer(rb); _mesa_delete_renderbuffer(ctx, rb);
} }

View File

@@ -164,13 +164,13 @@ soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
* Called via gl_renderbuffer::Delete() * Called via gl_renderbuffer::Delete()
*/ */
static void 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); struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
free(srb->Buffer); free(srb->Buffer);
srb->Buffer = NULL; srb->Buffer = NULL;
_mesa_delete_renderbuffer(rb); _mesa_delete_renderbuffer(ctx, rb);
} }

View File

@@ -16,7 +16,7 @@
static void static void
delete_texture_wrapper(struct gl_renderbuffer *rb) delete_texture_wrapper(struct gl_context *ctx, struct gl_renderbuffer *rb)
{ {
ASSERT(rb->RefCount == 0); ASSERT(rb->RefCount == 0);
free(rb); free(rb);