xserver: Branch 'server-21.1-branch'

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed May 3 12:58:32 UTC 2023


 present/present_event.c  |    5 +++--
 present/present_priv.h   |    7 ++++++-
 present/present_screen.c |   11 ++++++++++-
 3 files changed, 19 insertions(+), 4 deletions(-)

New commits:
commit b98fc07d3442a289c6bef82df50dd0a2d01de71a
Author: Adam Jackson <ajax at redhat.com>
Date:   Thu Feb 2 12:26:27 2023 -0500

    present: Send a PresentConfigureNotify event for destroyed windows
    
    This enables fixing a deadlock case on the client side, where the client
    ends up blocked waiting for a Present event that will never come because
    the window was destroyed. The new PresentWindowDestroyed flag allows the
    client to avoid blocking indefinitely.
    
    Signed-off-by: Adam Jackson <ajax at redhat.com>
    See-also: https://gitlab.freedesktop.org/mesa/mesa/-/issues/116
    See-also: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6685
    Reviewed-by: Michel Dänzer <mdaenzer at redhat.com>
    (cherry picked from commit 462b06033e66a32308d940eb5fc47f5e4c914dc0)

diff --git a/present/present_event.c b/present/present_event.c
index 435b26b70..849732dc8 100644
--- a/present/present_event.c
+++ b/present/present_event.c
@@ -102,7 +102,8 @@ present_event_swap(xGenericEvent *from, xGenericEvent *to)
 }
 
 void
-present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling)
+present_send_config_notify(WindowPtr window, int x, int y, int w, int h,
+                           int bw, WindowPtr sibling, CARD32 flags)
 {
     present_window_priv_ptr window_priv = present_window_priv(window);
 
@@ -122,7 +123,7 @@ present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw,
             .off_y = 0,
             .pixmap_width = w,
             .pixmap_height = h,
-            .pixmap_flags = 0
+            .pixmap_flags = flags
         };
         present_event_ptr event;
 
diff --git a/present/present_priv.h b/present/present_priv.h
index 6ebd009a2..4ad729864 100644
--- a/present/present_priv.h
+++ b/present/present_priv.h
@@ -43,6 +43,11 @@
 #define DebugPresent(x)
 #endif
 
+/* XXX this belongs in presentproto */
+#ifndef PresentWindowDestroyed
+#define PresentWindowDestroyed (1 << 0)
+#endif
+
 extern int present_request;
 
 extern DevPrivateKeyRec present_screen_private_key;
@@ -307,7 +312,7 @@ void
 present_free_events(WindowPtr window);
 
 void
-present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling);
+present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling, CARD32 flags);
 
 void
 present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc);
diff --git a/present/present_screen.c b/present/present_screen.c
index 15684eda4..2c29aafd2 100644
--- a/present/present_screen.c
+++ b/present/present_screen.c
@@ -93,6 +93,15 @@ present_destroy_window(WindowPtr window)
     present_screen_priv_ptr screen_priv = present_screen_priv(screen);
     present_window_priv_ptr window_priv = present_window_priv(window);
 
+    present_send_config_notify(window,
+                               window->drawable.x,
+                               window->drawable.y,
+                               window->drawable.width,
+                               window->drawable.height,
+                               window->borderWidth,
+                               window->nextSib,
+                               PresentWindowDestroyed);
+
     if (window_priv) {
         present_clear_window_notifies(window);
         present_free_events(window);
@@ -123,7 +132,7 @@ present_config_notify(WindowPtr window,
     ScreenPtr screen = window->drawable.pScreen;
     present_screen_priv_ptr screen_priv = present_screen_priv(screen);
 
-    present_send_config_notify(window, x, y, w, h, bw, sibling);
+    present_send_config_notify(window, x, y, w, h, bw, sibling, 0);
 
     unwrap(screen_priv, screen, ConfigNotify);
     if (screen->ConfigNotify)


More information about the xorg-commit mailing list