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;
|
||||
|
Reference in New Issue
Block a user