#include "utils.h"
#include "vblank.h"
#include "drirenderbuffer.h"
+#include "main/framebuffer.h"
#include "main/state.h"
#define DRIVER_DATE "20090101"
#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.
*
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);
}
#define IS_R300_CLASS(screen) \
((screen->chip_flags & RADEON_CLASS_MASK) == RADEON_CLASS_R300)
+extern void radeonDestroyBuffer(__DRIdrawablePrivate *driDrawPriv);
#endif /* __RADEON_SCREEN_H__ */