xserver: Branch 'master'

Michel Dänzer daenzer at kemper.freedesktop.org
Thu Nov 23 10:32:10 UTC 2017


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

New commits:
commit 559954aaa8d811a22cf918cc16a7d618e12201a0
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Mon Oct 2 11:33:43 2017 +0200

    present: Only send PresentCompleteNotify events to the presenting client
    
    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 receiving events from other clients would
    be required.
    
    v2:
    * Also restrict events sent to additional windows to the presenting
      client
    * Don't shorten line lengths
    
    Reviewed-by: Keith Packard <keithp at keithp.com>

diff --git a/present/present.c b/present/present.c
index 176e89c0b..a8f116643 100644
--- a/present/present.c
+++ b/present/present.c
@@ -206,13 +206,13 @@ 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, vblank->client);
     }
 }
 
@@ -772,6 +772,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 +883,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 +1003,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 +1011,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..ac6f2555a 100644
--- a/present/present_event.c
+++ b/present/present_event.c
@@ -146,7 +146,7 @@ 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 +167,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 == 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..41c37af7e 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,7 @@ 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);
 }
 


More information about the xorg-commit mailing list