|
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