Mesa (radeon-rewrite): radeon: fixup render buffer cleanups

Dave Airlie airlied at kemper.freedesktop.org
Wed Apr 1 06:26:18 UTC 2009


Module: Mesa
Branch: radeon-rewrite
Commit: 6e30fe4873f30ccf9edec9ab6113ea647dccb9b7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6e30fe4873f30ccf9edec9ab6113ea647dccb9b7

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Apr  1 15:41:58 2009 +1000

radeon: fixup render buffer cleanups

this fixes qtdemo-qt4 starting and a leak in glxgears exit

---

 .../drivers/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 5766c9e..9103c8c 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 98fa141..ea400a6 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 1c0f5bb..8605eb4 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__ */




More information about the mesa-commit mailing list