dri3: Free resources when drawable is destroyed.
Always nice to clean up after ourselves. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:

committed by
Kenneth Graunke

parent
568a27588d
commit
95b04850d0
@@ -265,14 +265,26 @@ dri3_create_context(struct glx_screen *base,
|
||||
0, NULL, &error);
|
||||
}
|
||||
|
||||
static void
|
||||
dri3_free_render_buffer(struct dri3_drawable *pdraw, struct dri3_buffer *buffer);
|
||||
|
||||
static void
|
||||
dri3_destroy_drawable(__GLXDRIdrawable *base)
|
||||
{
|
||||
struct dri3_screen *psc = (struct dri3_screen *) base->psc;
|
||||
struct dri3_drawable *pdraw = (struct dri3_drawable *) base;
|
||||
xcb_connection_t *c = XGetXCBConnection(pdraw->base.psc->dpy);
|
||||
int i;
|
||||
|
||||
(*psc->core->destroyDrawable) (pdraw->driDrawable);
|
||||
|
||||
for (i = 0; i < DRI3_NUM_BUFFERS; i++) {
|
||||
if (pdraw->buffers[i])
|
||||
dri3_free_render_buffer(pdraw, pdraw->buffers[i]);
|
||||
}
|
||||
|
||||
if (pdraw->special_event)
|
||||
xcb_unregister_for_special_event(c, pdraw->special_event);
|
||||
free(pdraw);
|
||||
}
|
||||
|
||||
@@ -736,6 +748,7 @@ dri3_alloc_render_buffer(struct glx_screen *glx_screen, Drawable draw,
|
||||
fence_fd);
|
||||
|
||||
buffer->pixmap = pixmap;
|
||||
buffer->own_pixmap = true;
|
||||
buffer->sync_fence = sync_fence;
|
||||
buffer->shm_fence = shm_fence;
|
||||
buffer->width = width;
|
||||
@@ -769,7 +782,8 @@ dri3_free_render_buffer(struct dri3_drawable *pdraw, struct dri3_buffer *buffer)
|
||||
struct dri3_screen *psc = (struct dri3_screen *) pdraw->base.psc;
|
||||
xcb_connection_t *c = XGetXCBConnection(pdraw->base.psc->dpy);
|
||||
|
||||
xcb_free_pixmap(c, buffer->pixmap);
|
||||
if (buffer->own_pixmap)
|
||||
xcb_free_pixmap(c, buffer->pixmap);
|
||||
xcb_sync_destroy_fence(c, buffer->sync_fence);
|
||||
xshmfence_unmap_shm(buffer->shm_fence);
|
||||
(*psc->image->destroyImage)(buffer->image);
|
||||
@@ -987,6 +1001,7 @@ dri3_get_pixmap_buffer(__DRIdrawable *driDrawable,
|
||||
goto no_image;
|
||||
|
||||
buffer->pixmap = pixmap;
|
||||
buffer->own_pixmap = false;
|
||||
buffer->width = bp_reply->width;
|
||||
buffer->height = bp_reply->height;
|
||||
buffer->buffer_type = buffer_type;
|
||||
|
@@ -89,6 +89,7 @@ struct dri3_buffer {
|
||||
uint32_t sync_fence; /* XID of X SyncFence object */
|
||||
struct xshmfence *shm_fence; /* pointer to xshmfence object */
|
||||
GLboolean busy; /* Set on swap, cleared on IdleNotify */
|
||||
GLboolean own_pixmap; /* We allocated the pixmap ID, free on destroy */
|
||||
void *driverPrivate;
|
||||
|
||||
uint32_t size;
|
||||
@@ -171,6 +172,8 @@ dri3_pixmap_buf_id(enum dri3_buffer_type buffer_type)
|
||||
return DRI3_FRONT_ID;
|
||||
}
|
||||
|
||||
#define DRI3_NUM_BUFFERS (1 + DRI3_MAX_BACK)
|
||||
|
||||
struct dri3_drawable {
|
||||
__GLXDRIdrawable base;
|
||||
__DRIdrawable *driDrawable;
|
||||
@@ -194,7 +197,7 @@ struct dri3_drawable {
|
||||
uint64_t previous_time;
|
||||
unsigned frames;
|
||||
|
||||
struct dri3_buffer *buffers[1 + DRI3_MAX_BACK];
|
||||
struct dri3_buffer *buffers[DRI3_NUM_BUFFERS];
|
||||
int cur_back;
|
||||
int depth;
|
||||
|
||||
|
Reference in New Issue
Block a user