[Mesa-dev] [PATCH 6/9] swrast: take ownership rather than adding reference for new renderbuffers
Timothy Arceri
tarceri at itsqueeze.com
Sat Apr 8 01:04:37 UTC 2017
This avoids locking in the reference calls and fixes a leak after the
RefCount initialisation was change from 0 to 1.
Fixes: 32141e53d1520 (mesa: tidy up renderbuffer RefCount initialisation)
---
src/mesa/drivers/dri/swrast/swrast.c | 6 ++++--
src/mesa/swrast/s_renderbuffer.c | 17 ++++++-----------
2 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
index 0402232..f43ac60 100644
--- a/src/mesa/drivers/dri/swrast/swrast.c
+++ b/src/mesa/drivers/dri/swrast/swrast.c
@@ -562,26 +562,28 @@ dri_create_buffer(__DRIscreen * sPriv,
if (drawable->row == NULL)
goto drawable_fail;
fb = &drawable->Base;
/* basic framebuffer setup */
_mesa_initialize_window_framebuffer(fb, visual);
/* add front renderbuffer */
frontrb = swrast_new_renderbuffer(visual, dPriv, GL_TRUE);
- _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontrb->Base.Base);
+ _mesa_add_renderbuffer_without_ref(fb, BUFFER_FRONT_LEFT,
+ &frontrb->Base.Base);
/* add back renderbuffer */
if (visual->doubleBufferMode) {
backrb = swrast_new_renderbuffer(visual, dPriv, GL_FALSE);
- _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backrb->Base.Base);
+ _mesa_add_renderbuffer_without_ref(fb, BUFFER_BACK_LEFT,
+ &backrb->Base.Base);
}
/* add software renderbuffers */
_swrast_add_soft_renderbuffers(fb,
GL_FALSE, /* color */
visual->haveDepthBuffer,
visual->haveStencilBuffer,
visual->haveAccumBuffer,
GL_FALSE, /* alpha */
GL_FALSE /* aux bufs */);
diff --git a/src/mesa/swrast/s_renderbuffer.c b/src/mesa/swrast/s_renderbuffer.c
index af09955..940c7b7 100644
--- a/src/mesa/swrast/s_renderbuffer.c
+++ b/src/mesa/swrast/s_renderbuffer.c
@@ -264,29 +264,24 @@ add_color_renderbuffers(struct gl_context *ctx, struct gl_framebuffer *fb,
continue;
assert(fb->Attachment[b].Renderbuffer == NULL);
rb = ctx->Driver.NewRenderbuffer(ctx, 0);
if (!rb) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating color buffer");
return GL_FALSE;
}
- /* Set refcount to 0 to avoid a leak since the _mesa_add_renderbuffer()
- * call below will bump the initial refcount.
- */
- rb->RefCount = 0;
-
rb->InternalFormat = GL_RGBA;
rb->AllocStorage = soft_renderbuffer_storage;
- _mesa_add_renderbuffer(fb, b, rb);
+ _mesa_add_renderbuffer_without_ref(fb, b, rb);
}
return GL_TRUE;
}
/**
* Add a software-based depth renderbuffer to the given framebuffer.
* This is a helper routine for device drivers when creating a
* window system framebuffer (not a user-created render/framebuffer).
@@ -318,21 +313,21 @@ add_depth_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
rb->InternalFormat = GL_DEPTH_COMPONENT16;
}
else if (depthBits <= 24) {
rb->InternalFormat = GL_DEPTH_COMPONENT24;
}
else {
rb->InternalFormat = GL_DEPTH_COMPONENT32;
}
rb->AllocStorage = soft_renderbuffer_storage;
- _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb);
+ _mesa_add_renderbuffer_without_ref(fb, BUFFER_DEPTH, rb);
return GL_TRUE;
}
/**
* Add a software-based stencil renderbuffer to the given framebuffer.
* This is a helper routine for device drivers when creating a
* window system framebuffer (not a user-created render/framebuffer).
* Once this function is called, you can basically forget about this
@@ -356,21 +351,21 @@ add_stencil_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
rb = _swrast_new_soft_renderbuffer(ctx, 0);
if (!rb) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating stencil buffer");
return GL_FALSE;
}
assert(stencilBits <= 8);
rb->InternalFormat = GL_STENCIL_INDEX8;
rb->AllocStorage = soft_renderbuffer_storage;
- _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb);
+ _mesa_add_renderbuffer_without_ref(fb, BUFFER_STENCIL, rb);
return GL_TRUE;
}
static GLboolean
add_depth_stencil_renderbuffer(struct gl_context *ctx,
struct gl_framebuffer *fb)
{
struct gl_renderbuffer *rb;
@@ -380,21 +375,21 @@ add_depth_stencil_renderbuffer(struct gl_context *ctx,
rb = _swrast_new_soft_renderbuffer(ctx, 0);
if (!rb) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth+stencil buffer");
return GL_FALSE;
}
rb->InternalFormat = GL_DEPTH_STENCIL;
rb->AllocStorage = soft_renderbuffer_storage;
- _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb);
+ _mesa_add_renderbuffer_without_ref(fb, BUFFER_DEPTH, rb);
_mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb);
return GL_TRUE;
}
/**
* Add a software-based accumulation renderbuffer to the given framebuffer.
* This is a helper routine for device drivers when creating a
* window system framebuffer (not a user-created render/framebuffer).
@@ -418,21 +413,21 @@ add_accum_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
assert(fb->Attachment[BUFFER_ACCUM].Renderbuffer == NULL);
rb = _swrast_new_soft_renderbuffer(ctx, 0);
if (!rb) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating accum buffer");
return GL_FALSE;
}
rb->InternalFormat = GL_RGBA16_SNORM;
rb->AllocStorage = soft_renderbuffer_storage;
- _mesa_add_renderbuffer(fb, BUFFER_ACCUM, rb);
+ _mesa_add_renderbuffer_without_ref(fb, BUFFER_ACCUM, rb);
return GL_TRUE;
}
/**
* Add a software-based aux renderbuffer to the given framebuffer.
* This is a helper routine for device drivers when creating a
* window system framebuffer (not a user-created render/framebuffer).
@@ -463,21 +458,21 @@ add_aux_renderbuffers(struct gl_context *ctx, struct gl_framebuffer *fb,
if (!rb) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating aux buffer");
return GL_FALSE;
}
assert (colorBits <= 8);
rb->InternalFormat = GL_RGBA;
rb->AllocStorage = soft_renderbuffer_storage;
- _mesa_add_renderbuffer(fb, BUFFER_AUX0 + i, rb);
+ _mesa_add_renderbuffer_without_ref(fb, BUFFER_AUX0 + i, rb);
}
return GL_TRUE;
}
/**
* Create/attach software-based renderbuffers to the given framebuffer.
* This is a helper routine for device drivers. Drivers can just as well
* call the individual _mesa_add_*_renderbuffer() routines directly.
*/
--
2.9.3
More information about the mesa-dev
mailing list