|
26 | 26 | #include "qapi/error.h"
|
27 | 27 | #include "sysemu/sysemu.h"
|
28 | 28 | #include "dbus.h"
|
| 29 | +#include "glib.h" |
29 | 30 | #ifdef G_OS_UNIX
|
30 | 31 | #include <gio/gunixfdlist.h>
|
31 | 32 | #endif
|
@@ -85,18 +86,20 @@ struct _DBusDisplayListener {
|
85 | 86 | #endif
|
86 | 87 |
|
87 | 88 | guint dbus_filter;
|
88 |
| - guint32 out_serial_to_discard; |
| 89 | + guint32 display_serial_to_discard; |
89 | 90 | };
|
90 | 91 |
|
91 | 92 | G_DEFINE_TYPE(DBusDisplayListener, dbus_display_listener, G_TYPE_OBJECT)
|
92 | 93 |
|
93 | 94 | static void dbus_gfx_update(DisplayChangeListener *dcl,
|
94 | 95 | int x, int y, int w, int h);
|
95 | 96 |
|
96 |
| -static void ddl_discard_pending_messages(DBusDisplayListener *ddl) |
| 97 | +static void ddl_discard_display_messages(DBusDisplayListener *ddl) |
97 | 98 | {
|
98 |
| - ddl->out_serial_to_discard = g_dbus_connection_get_last_serial( |
| 99 | + guint32 serial = g_dbus_connection_get_last_serial( |
99 | 100 | g_dbus_proxy_get_connection(G_DBUS_PROXY(ddl->proxy)));
|
| 101 | + |
| 102 | + g_atomic_int_set(&ddl->display_serial_to_discard, serial); |
100 | 103 | }
|
101 | 104 |
|
102 | 105 | #ifdef CONFIG_OPENGL
|
@@ -290,7 +293,7 @@ static void dbus_scanout_dmabuf(DisplayChangeListener *dcl,
|
290 | 293 | return;
|
291 | 294 | }
|
292 | 295 |
|
293 |
| - ddl_discard_pending_messages(ddl); |
| 296 | + ddl_discard_display_messages(ddl); |
294 | 297 |
|
295 | 298 | width = qemu_dmabuf_get_width(dmabuf);
|
296 | 299 | height = qemu_dmabuf_get_height(dmabuf);
|
@@ -338,7 +341,7 @@ static bool dbus_scanout_map(DBusDisplayListener *ddl)
|
338 | 341 | return false;
|
339 | 342 | }
|
340 | 343 |
|
341 |
| - ddl_discard_pending_messages(ddl); |
| 344 | + ddl_discard_display_messages(ddl); |
342 | 345 |
|
343 | 346 | if (!qemu_dbus_display1_listener_win32_map_call_scanout_map_sync(
|
344 | 347 | ddl->map_proxy,
|
@@ -401,7 +404,7 @@ dbus_scanout_share_d3d_texture(
|
401 | 404 | return false;
|
402 | 405 | }
|
403 | 406 |
|
404 |
| - ddl_discard_pending_messages(ddl); |
| 407 | + ddl_discard_display_messages(ddl); |
405 | 408 |
|
406 | 409 | qemu_dbus_display1_listener_win32_d3d11_call_scanout_texture2d(
|
407 | 410 | ddl->d3d11_proxy,
|
@@ -659,7 +662,7 @@ static void ddl_scanout(DBusDisplayListener *ddl)
|
659 | 662 | surface_stride(ddl->ds) * surface_height(ddl->ds), TRUE,
|
660 | 663 | (GDestroyNotify)pixman_image_unref, pixman_image_ref(ddl->ds->image));
|
661 | 664 |
|
662 |
| - ddl_discard_pending_messages(ddl); |
| 665 | + ddl_discard_display_messages(ddl); |
663 | 666 |
|
664 | 667 | qemu_dbus_display1_listener_call_scanout(
|
665 | 668 | ddl->proxy, surface_width(ddl->ds), surface_height(ddl->ds),
|
@@ -992,17 +995,35 @@ dbus_filter(GDBusConnection *connection,
|
992 | 995 | gpointer user_data)
|
993 | 996 | {
|
994 | 997 | DBusDisplayListener *ddl = DBUS_DISPLAY_LISTENER(user_data);
|
995 |
| - guint32 serial; |
| 998 | + guint32 serial, discard_serial; |
996 | 999 |
|
997 | 1000 | if (incoming) {
|
998 | 1001 | return message;
|
999 | 1002 | }
|
1000 | 1003 |
|
1001 | 1004 | serial = g_dbus_message_get_serial(message);
|
1002 |
| - if (serial <= ddl->out_serial_to_discard) { |
1003 |
| - trace_dbus_filter(serial, ddl->out_serial_to_discard); |
1004 |
| - g_object_unref(message); |
1005 |
| - return NULL; |
| 1005 | + |
| 1006 | + discard_serial = g_atomic_int_get(&ddl->display_serial_to_discard); |
| 1007 | + if (serial <= discard_serial) { |
| 1008 | + const char *member = g_dbus_message_get_member(message); |
| 1009 | + static const char *const display_messages[] = { |
| 1010 | + "Scanout", |
| 1011 | + "Update", |
| 1012 | +#ifdef CONFIG_GBM |
| 1013 | + "ScanoutDMABUF", |
| 1014 | + "UpdateDMABUF", |
| 1015 | +#endif |
| 1016 | + "ScanoutMap", |
| 1017 | + "UpdateMap", |
| 1018 | + "Disable", |
| 1019 | + NULL, |
| 1020 | + }; |
| 1021 | + |
| 1022 | + if (g_strv_contains(display_messages, member)) { |
| 1023 | + trace_dbus_filter(serial, discard_serial); |
| 1024 | + g_object_unref(message); |
| 1025 | + return NULL; |
| 1026 | + } |
1006 | 1027 | }
|
1007 | 1028 |
|
1008 | 1029 | return message;
|
|
0 commit comments