From 6e30fe4873f30ccf9edec9ab6113ea647dccb9b7 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 1 Apr 2009 15:41:58 +1000 Subject: [PATCH] radeon: fixup render buffer cleanups this fixes qtdemo-qt4 starting and a leak in glxgears exit --- .../dri/radeon/radeon_common_context.c | 40 ++-------------- src/mesa/drivers/dri/radeon/radeon_screen.c | 47 ++++++++++++------- src/mesa/drivers/dri/radeon/radeon_screen.h | 1 + 3 files changed, 35 insertions(+), 53 deletions(-) diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c index 5766c9ec7bc..9103c8c0f66 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c @@ -37,6 +37,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "utils.h" #include "vblank.h" #include "drirenderbuffer.h" +#include "main/framebuffer.h" #include "main/state.h" #define DRIVER_DATE "20090101" @@ -183,45 +184,14 @@ void radeonCleanupContext(radeonContextPtr radeon) #ifdef RADEON_BO_TRACK FILE *track; #endif - struct radeon_renderbuffer *rb; struct radeon_framebuffer *rfb; + radeonDestroyBuffer(radeon->dri.drawable); + radeonDestroyBuffer(radeon->dri.readable); + /* free the Mesa context */ _mesa_destroy_context(radeon->glCtx); - - rfb = (void*)radeon->dri.drawable->driverPrivate; - rb = rfb->color_rb[0]; - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } - rb = rfb->color_rb[1]; - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } - rb = radeon_get_renderbuffer(&rfb->base, BUFFER_DEPTH); - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } - rfb = (void*)radeon->dri.readable->driverPrivate; - rb = rfb->color_rb[0]; - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } - rb = rfb->color_rb[1]; - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } - rb = radeon_get_renderbuffer(&rfb->base, BUFFER_DEPTH); - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } - + /* _mesa_destroy_context() might result in calls to functions that * depend on the DriverCtx, so don't set it to NULL before. * diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c index 98fa1417f9a..ea400a672dd 100644 --- a/src/mesa/drivers/dri/radeon/radeon_screen.c +++ b/src/mesa/drivers/dri/radeon/radeon_screen.c @@ -1296,28 +1296,39 @@ radeonCreateBuffer( __DRIscreenPrivate *driScrnPriv, return (driDrawPriv->driverPrivate != NULL); } -static void + +static void radeon_cleanup_renderbuffers(struct radeon_framebuffer *rfb) +{ + struct radeon_renderbuffer *rb; + + rb = rfb->color_rb[0]; + if (rb && rb->bo) { + radeon_bo_unref(rb->bo); + rb->bo = NULL; + } + rb = rfb->color_rb[1]; + if (rb && rb->bo) { + radeon_bo_unref(rb->bo); + rb->bo = NULL; + } + rb = radeon_get_renderbuffer(&rfb->base, BUFFER_DEPTH); + if (rb && rb->bo) { + radeon_bo_unref(rb->bo); + rb->bo = NULL; + } +} + +void radeonDestroyBuffer(__DRIdrawablePrivate *driDrawPriv) { - struct radeon_renderbuffer *rb; struct radeon_framebuffer *rfb; - + if (!driDrawPriv) + return; + rfb = (void*)driDrawPriv->driverPrivate; - rb = (void *)rfb->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer; - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } - rb = (void *)rfb->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer; - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } - rb = (void *)rfb->base.Attachment[BUFFER_DEPTH].Renderbuffer; - if (rb && rb->bo) { - radeon_bo_unref(rb->bo); - rb->bo = NULL; - } + if (!rfb) + return; + radeon_cleanup_renderbuffers(rfb); _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL); } diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.h b/src/mesa/drivers/dri/radeon/radeon_screen.h index 1c0f5bb9bc7..8605eb4f075 100644 --- a/src/mesa/drivers/dri/radeon/radeon_screen.h +++ b/src/mesa/drivers/dri/radeon/radeon_screen.h @@ -118,4 +118,5 @@ typedef struct radeon_screen { #define IS_R300_CLASS(screen) \ ((screen->chip_flags & RADEON_CLASS_MASK) == RADEON_CLASS_R300) +extern void radeonDestroyBuffer(__DRIdrawablePrivate *driDrawPriv); #endif /* __RADEON_SCREEN_H__ */ -- 2.30.2