Mesa (main): Revert "wsi/x11: Avoid a class of deadlocks in the WSI queue thread"

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jan 25 15:22:51 UTC 2022


Module: Mesa
Branch: main
Commit: a429b3dd33afdffc79cd18d6ae481742fbb5347e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a429b3dd33afdffc79cd18d6ae481742fbb5347e

Author: Michel Dänzer <mdaenzer at redhat.com>
Date:   Tue Jan 25 15:48:47 2022 +0100

Revert "wsi/x11: Avoid a class of deadlocks in the WSI queue thread"

This reverts commit 272fba8e7540f09163169a6e95bc108919ca24ff.

Multiple regressions have been reported against this. Let's revert and
maybe try again.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5910
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5913
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14710>

---

 src/vulkan/wsi/wsi_common_x11.c | 70 +++++++++--------------------------------
 1 file changed, 14 insertions(+), 56 deletions(-)

diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
index a064ac5193a..921ad86965d 100644
--- a/src/vulkan/wsi/wsi_common_x11.c
+++ b/src/vulkan/wsi/wsi_common_x11.c
@@ -1372,67 +1372,25 @@ x11_manage_fifo_queues(void *state)
          goto fail;
 
       if (chain->has_acquire_queue) {
-         bool desperate = false;
-
-         while (1) {
-            /* Run the event queue and ensure we have at least one image
-             * available for the next AcquireNextImage.
-             */
-            xcb_generic_event_t *event = NULL;
-            while ((event = xcb_poll_for_special_event(chain->conn, chain->special_event))) {
-               result = x11_handle_dri3_present_event(chain, (void *)event);
-               /* Ensure that VK_SUBOPTIMAL_KHR is reported to the application */
-               result = x11_swapchain_result(chain, result);
-               free(event);
-               if (result < 0)
-                  goto fail;
-            }
-
-            /* event could have been NULL because the display was closed, not
-             * just because there are no more Present events in the queue.
-             */
-            if (xcb_connection_has_error(chain->conn)) {
+         /* Wait for our presentation to occur and ensure we have at least one
+          * image that can be acquired by the client afterwards. This ensures we
+          * can pull on the present-queue on the next loop.
+          */
+         while (chain->images[image_index].present_queued ||
+                chain->sent_image_count == chain->base.image_count) {
+            xcb_generic_event_t *event =
+               xcb_wait_for_special_event(chain->conn, chain->special_event);
+            if (!event) {
                result = VK_ERROR_OUT_OF_DATE_KHR;
                goto fail;
             }
 
-            /* If we have at least one image available to acquire, go back to
-             * awaiting the next QueuePresent.
-             */
-            if (chain->sent_image_count != chain->base.image_count)
-               break;
-
-            /* Still no image. Make a note of it, and pause if we're
-             * busy-looping. If your frame timing is affected by this delay,
-             * please note that to get here your swapchain is already too
-             * short: you have presented every image, and are waiting for the
-             * server to release one instead of drawing to the next image.
-             */
-            if (desperate) {
-               struct pollfd pfd;
-               pfd.fd = xcb_get_file_descriptor(chain->conn);
-               pfd.events = POLLIN;
-               poll(&pfd, 1, 1);
-            }
-            desperate = true;
-
-            /* Send a PresentSelectInput request to the server to ensure our
-             * window still exists, and to force a round trip so our next pass
-             * at xcb_poll_for_special_event might have work to do. If you find
-             * yourself blocked in this xcb_request_check it's because the
-             * server is actually stuck.
-             */
-            xcb_void_cookie_t cookie =
-               xcb_present_select_input_checked(chain->conn, chain->event_id, chain->window,
-                                                XCB_PRESENT_EVENT_MASK_CONFIGURE_NOTIFY |
-                                                XCB_PRESENT_EVENT_MASK_COMPLETE_NOTIFY |
-                                                XCB_PRESENT_EVENT_MASK_IDLE_NOTIFY);
-            xcb_generic_error_t *error = xcb_request_check(chain->conn, cookie);
-            if (error) {
-               free(error);
-               result = VK_ERROR_OUT_OF_DATE_KHR;
+            result = x11_handle_dri3_present_event(chain, (void *)event);
+            /* Ensure that VK_SUBOPTIMAL_KHR is reported to the application */
+            result = x11_swapchain_result(chain, result);
+            free(event);
+            if (result < 0)
                goto fail;
-            }
          }
       }
    }



More information about the mesa-commit mailing list