[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