diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c index 492e4a876..2cec63f59 100644 --- a/hw/xwayland/xwayland-present.c +++ b/hw/xwayland/xwayland-present.c @@ -114,6 +114,12 @@ xwl_present_reset_timer(struct xwl_present_window *xwl_present_window) static void xwl_present_free_event(struct xwl_present_event *event) { + if (!event) + return; + + if (event->buffer) + wl_buffer_set_user_data(event->buffer, NULL); + xorg_list_del(&event->list); free(event); } @@ -138,21 +144,10 @@ xwl_present_cleanup(WindowPtr window) xorg_list_for_each_entry_safe(event, tmp, &xwl_present_window->event_list, list) xwl_present_free_event(event); - /* Clear remaining buffer releases and inform Present about free ressources */ - event = xwl_present_window->sync_flip; - xwl_present_window->sync_flip = NULL; - if (event) { - if (event->buffer_released) { - xwl_present_free_event(event); - } else { - event->pending = FALSE; - event->abort = TRUE; - } - } - xorg_list_for_each_entry_safe(event, tmp, &xwl_present_window->release_queue, list) { - xorg_list_del(&event->list); - event->abort = TRUE; - } + xwl_present_free_event(xwl_present_window->sync_flip); + + xorg_list_for_each_entry_safe(event, tmp, &xwl_present_window->release_queue, list) + xwl_present_free_event(event); /* Clear timer */ xwl_present_free_timer(xwl_present_window); @@ -353,6 +348,7 @@ xwl_present_queue_vblank(WindowPtr present_window, return BadAlloc; event->event_id = event_id; + event->buffer = NULL; event->xwl_present_window = xwl_present_window; event->target_msc = msc;