From 31392f837110f17c6037b4861056a891e078c083 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michel=20D=C3=A4nzer?= Date: Thu, 2 Jul 2020 18:49:26 +0200 Subject: [PATCH] Revert "loader/dri3: Check for window destruction in dri3_wait_for_event_locked" MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This reverts commit d7d7687829875e401690219d4a72458fb2bbe4de. It caused freezes with e.g. kwin_x11 due to hitting the 1s timeout. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3214 Reopens: https://gitlab.freedesktop.org/mesa/mesa/-/issues/116 Acked-by: Marek Olšák Part-of: --- src/loader/loader_dri3_helper.c | 38 +-------------------------------- src/loader/loader_dri3_helper.h | 1 - 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 97b5182994a..425faba8f64 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -22,7 +22,6 @@ */ #include -#include #include #include #include @@ -533,55 +532,20 @@ dri3_wait_for_event_locked(struct loader_dri3_drawable *draw, xcb_generic_event_t *ev; xcb_present_generic_event_t *ge; - if (draw->window_destroyed) - return false; - xcb_flush(draw->conn); /* Only have one thread waiting for events at a time */ if (draw->has_event_waiter) { cnd_wait(&draw->event_cnd, &draw->mtx); - if (draw->window_destroyed) - return false; if (full_sequence) *full_sequence = draw->last_special_event_sequence; /* Another thread has updated the protected info, so retest. */ return true; } else { - struct pollfd pfds; - draw->has_event_waiter = true; /* Allow other threads access to the drawable while we're waiting. */ mtx_unlock(&draw->mtx); - - pfds.fd = xcb_get_file_descriptor(draw->conn); - pfds.events = POLLIN; - - ev = xcb_poll_for_special_event(draw->conn, draw->special_event); - while (!ev) { - /* Wait up to ~1s for the XCB FD to become readable */ - if (poll(&pfds, 1, 1000) < 1) { - xcb_get_window_attributes_cookie_t cookie; - xcb_get_window_attributes_reply_t *attrib; - xcb_generic_error_t *error; - - /* Check if the window still exists */ - cookie = xcb_get_window_attributes(draw->conn, draw->drawable); - attrib = xcb_get_window_attributes_reply(draw->conn, cookie, &error); - free(attrib); - - if (error) { - if (error->error_code == BadWindow) - draw->window_destroyed = true; - - free(error); - break; - } - } - - ev = xcb_poll_for_special_event(draw->conn, draw->special_event); - } - + ev = xcb_wait_for_special_event(draw->conn, draw->special_event); mtx_lock(&draw->mtx); draw->has_event_waiter = false; cnd_broadcast(&draw->event_cnd); diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h index 0961534a792..c314e4c5a9d 100644 --- a/src/loader/loader_dri3_helper.h +++ b/src/loader/loader_dri3_helper.h @@ -122,7 +122,6 @@ struct loader_dri3_drawable { uint8_t have_back; uint8_t have_fake_front; uint8_t is_pixmap; - bool window_destroyed; /* Information about the GPU owning the buffer */ __DRIscreen *dri_screen; -- 2.30.2