mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 11:28:05 +02:00
radeon: fixup render buffer cleanups
this fixes qtdemo-qt4 starting and a leak in glxgears exit
This commit is contained in:
parent
d81a48757a
commit
6e30fe4873
3 changed files with 35 additions and 53 deletions
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue