[PATCH xserver] present: Only send PresentCompleteNotify events to the presenting client

Michel Dänzer michel at daenzer.net
Fri Oct 20 16:30:59 UTC 2017


From: Michel Dänzer <michel.daenzer at amd.com>

We were sending the events to all clients listening for them on the
window. But clients can get confused by events from another client, and
I can't imagine any case where reciving events from other clients would
be required.

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---

This fixes the same problem described in
https://patchwork.freedesktop.org/patch/183995/ . The problem doesn't
occur if either fix is present, and things work correctly when both are
present as well.

 present/present.c         | 11 +++++++++--
 present/present_event.c   |  7 +++++--
 present/present_priv.h    |  7 ++++++-
 present/present_request.c |  4 ++--
 4 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/present/present.c b/present/present.c
index 176e89c0b..07da2c63c 100644
--- a/present/present.c
+++ b/present/present.c
@@ -206,13 +206,16 @@ present_vblank_notify(present_vblank_ptr vblank, CARD8 kind, CARD8 mode, uint64_
     int         n;
 
     if (vblank->window)
-        present_send_complete_notify(vblank->window, kind, mode, vblank->serial, ust, crtc_msc - vblank->msc_offset);
+        present_send_complete_notify(vblank->window, kind, mode, vblank->serial,
+                                     ust, crtc_msc - vblank->msc_offset,
+                                     vblank->client);
     for (n = 0; n < vblank->num_notifies; n++) {
         WindowPtr   window = vblank->notifies[n].window;
         CARD32      serial = vblank->notifies[n].serial;
 
         if (window)
-            present_send_complete_notify(window, kind, mode, serial, ust, crtc_msc - vblank->msc_offset);
+            present_send_complete_notify(window, kind, mode, serial, ust,
+                                         crtc_msc - vblank->msc_offset, NULL);
     }
 }
 
@@ -772,6 +775,7 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
 int
 present_pixmap(WindowPtr window,
                PixmapPtr pixmap,
+               ClientPtr client,
                CARD32 serial,
                RegionPtr valid,
                RegionPtr update,
@@ -882,6 +886,7 @@ present_pixmap(WindowPtr window,
     xorg_list_append(&vblank->window_list, &window_priv->vblank);
     xorg_list_init(&vblank->event_queue);
 
+    vblank->client = client;
     vblank->screen = screen;
     vblank->window = window;
     vblank->pixmap = pixmap;
@@ -1001,6 +1006,7 @@ present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64
 
 int
 present_notify_msc(WindowPtr window,
+                   ClientPtr client,
                    CARD32 serial,
                    uint64_t target_msc,
                    uint64_t divisor,
@@ -1008,6 +1014,7 @@ present_notify_msc(WindowPtr window,
 {
     return present_pixmap(window,
                           NULL,
+                          client,
                           serial,
                           NULL, NULL,
                           0, 0,
diff --git a/present/present_event.c b/present/present_event.c
index c222dd5ff..314e1c949 100644
--- a/present/present_event.c
+++ b/present/present_event.c
@@ -146,7 +146,9 @@ present_register_complete_notify(present_complete_notify_proc proc)
 }
 
 void
-present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc)
+present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode,
+                             CARD32 serial, uint64_t ust, uint64_t msc,
+                             ClientPtr client)
 {
     present_window_priv_ptr window_priv = present_window_priv(window);
 
@@ -167,7 +169,8 @@ present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 se
         present_event_ptr event;
 
         for (event = window_priv->events; event; event = event->next) {
-            if (event->mask & PresentCompleteNotifyMask) {
+            if (event->mask & PresentCompleteNotifyMask &&
+                (!client || client == event->client)) {
                 cn.eid = event->id;
                 WriteEventsToClient(event->client, 1, (xEvent *) &cn);
             }
diff --git a/present/present_priv.h b/present/present_priv.h
index dfb4bdea9..01b930221 100644
--- a/present/present_priv.h
+++ b/present/present_priv.h
@@ -52,6 +52,7 @@ struct present_notify {
 struct present_vblank {
     struct xorg_list    window_list;
     struct xorg_list    event_queue;
+    ClientPtr           client;
     ScreenPtr           screen;
     WindowPtr           window;
     PixmapPtr           pixmap;
@@ -155,6 +156,7 @@ present_get_window_priv(WindowPtr window, Bool create);
 int
 present_pixmap(WindowPtr window,
                PixmapPtr pixmap,
+               ClientPtr client,
                CARD32 serial,
                RegionPtr valid,
                RegionPtr update,
@@ -172,6 +174,7 @@ present_pixmap(WindowPtr window,
 
 int
 present_notify_msc(WindowPtr window,
+                   ClientPtr client,
                    CARD32 serial,
                    uint64_t target_msc,
                    uint64_t divisor,
@@ -215,7 +218,9 @@ void
 present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling);
 
 void
-present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc);
+present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode,
+                             CARD32 serial, uint64_t ust, uint64_t msc,
+                             ClientPtr client);
 
 void
 present_send_idle_notify(WindowPtr window, CARD32 serial, PixmapPtr pixmap, present_fence_ptr idle_fence);
diff --git a/present/present_request.c b/present/present_request.c
index c6afe5fa7..25310d66f 100644
--- a/present/present_request.c
+++ b/present/present_request.c
@@ -135,7 +135,7 @@ proc_present_pixmap(ClientPtr client)
             return ret;
     }
 
-    ret = present_pixmap(window, pixmap, stuff->serial, valid, update,
+    ret = present_pixmap(window, pixmap, client, stuff->serial, valid, update,
                          stuff->x_off, stuff->y_off, target_crtc,
                          wait_fence, idle_fence, stuff->options,
                          stuff->target_msc, stuff->divisor, stuff->remainder, notifies, nnotifies);
@@ -171,7 +171,7 @@ proc_present_notify_msc(ClientPtr client)
         }
     }
 
-    return present_notify_msc(window, stuff->serial,
+    return present_notify_msc(window, client, stuff->serial,
                               stuff->target_msc, stuff->divisor, stuff->remainder);
 }
 
-- 
2.15.0.rc0



More information about the xorg-devel mailing list