summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte.benjamin@googlemail.com>2023-04-28 21:22:12 +0000
committerBenjamin Otte <otte.benjamin@googlemail.com>2023-04-28 21:22:12 +0000
commite94416054cbcb4c6e1c0193712856862ff8c8ef7 (patch)
treec1a20152bdfc7b61b0a95f7d9405d198e2a2d63a
parent7bea2685e1f1e07ed4caca0e8b7ee211d7e2d07f (diff)
parentb4c859c0113f8802d9c6f047dcf2b689223848da (diff)
downloadgtk+-e94416054cbcb4c6e1c0193712856862ff8c8ef7.tar.gz
Merge branch 'wip/otte/for-main' into 'main'
Fix hangs on Wayland Closes #5761 See merge request GNOME/gtk!5884
-rw-r--r--gdk/wayland/gdkglcontext-wayland.c3
-rw-r--r--gdk/wayland/gdksurface-wayland-private.h2
-rw-r--r--gdk/wayland/gdksurface-wayland.c30
3 files changed, 16 insertions, 19 deletions
diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c
index b0ae79a0b7..b236854ba9 100644
--- a/gdk/wayland/gdkglcontext-wayland.c
+++ b/gdk/wayland/gdkglcontext-wayland.c
@@ -75,6 +75,9 @@ gdk_wayland_gl_context_end_frame (GdkDrawContext *draw_context,
WL_SURFACE_OFFSET_SINCE_VERSION)
wl_surface_offset (impl->display_server.wl_surface, dx, dy);
+ /* We should do ths when setting up the EGLSurface, but we don't make_current then */
+ eglSwapInterval (gdk_display_get_egl_display (gdk_draw_context_get_display (draw_context)), 0);
+
GDK_DRAW_CONTEXT_CLASS (gdk_wayland_gl_context_parent_class)->end_frame (draw_context, painted);
gdk_wayland_surface_notify_committed (surface);
diff --git a/gdk/wayland/gdksurface-wayland-private.h b/gdk/wayland/gdksurface-wayland-private.h
index 614b56bec4..1b2d674a99 100644
--- a/gdk/wayland/gdksurface-wayland-private.h
+++ b/gdk/wayland/gdksurface-wayland-private.h
@@ -42,11 +42,11 @@ struct _GdkWaylandSurface
} display_server;
struct wl_event_queue *event_queue;
+ struct wl_callback *frame_callback;
unsigned int initial_configure_received : 1;
unsigned int has_uncommitted_ack_configure : 1;
unsigned int mapped : 1;
- unsigned int awaiting_frame : 1;
unsigned int awaiting_frame_frozen : 1;
int pending_buffer_offset_x;
diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c
index 4dd546aab6..a4049bab72 100644
--- a/gdk/wayland/gdksurface-wayland.c
+++ b/gdk/wayland/gdksurface-wayland.c
@@ -272,17 +272,13 @@ frame_callback (void *data,
gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "wayland", "frame event");
GDK_DISPLAY_DEBUG (GDK_DISPLAY (display_wayland), EVENTS, "frame %p", surface);
- wl_callback_destroy (callback);
+ g_assert (impl->frame_callback == callback);
+ g_assert (!GDK_SURFACE_DESTROYED (surface));
- if (GDK_SURFACE_DESTROYED (surface))
- return;
-
- if (!impl->awaiting_frame)
- return;
+ g_clear_pointer (&impl->frame_callback, wl_callback_destroy);
GDK_WAYLAND_SURFACE_GET_CLASS (impl)->handle_frame (impl);
- impl->awaiting_frame = FALSE;
if (impl->awaiting_frame_frozen)
{
impl->awaiting_frame_frozen = FALSE;
@@ -370,20 +366,17 @@ gdk_wayland_surface_request_layout (GdkSurface *surface)
void
gdk_wayland_surface_request_frame (GdkSurface *surface)
{
- GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
- struct wl_callback *callback;
+ GdkWaylandSurface *self = GDK_WAYLAND_SURFACE (surface);
GdkFrameClock *clock;
- if (impl->awaiting_frame)
- return;
+ g_assert (self->frame_callback == NULL);
clock = gdk_surface_get_frame_clock (surface);
- callback = wl_surface_frame (impl->display_server.wl_surface);
- wl_proxy_set_queue ((struct wl_proxy *) callback, NULL);
- wl_callback_add_listener (callback, &frame_listener, surface);
- impl->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock);
- impl->awaiting_frame = TRUE;
+ self->frame_callback = wl_surface_frame (self->display_server.wl_surface);
+ wl_proxy_set_queue ((struct wl_proxy *) self->frame_callback, NULL);
+ wl_callback_add_listener (self->frame_callback, &frame_listener, surface);
+ self->pending_frame_counter = gdk_frame_clock_get_frame_counter (clock);
}
gboolean
@@ -422,9 +415,10 @@ on_frame_clock_after_paint (GdkFrameClock *clock,
gdk_wayland_surface_notify_committed (surface);
}
- if (impl->awaiting_frame &&
+ if (impl->frame_callback &&
impl->pending_frame_counter == gdk_frame_clock_get_frame_counter (clock))
{
+ g_assert (!impl->awaiting_frame_frozen);
impl->awaiting_frame_frozen = TRUE;
gdk_surface_freeze_updates (surface);
}
@@ -973,7 +967,7 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
unmap_popups_for_surface (surface);
- impl->awaiting_frame = FALSE;
+ g_clear_pointer (&impl->frame_callback, wl_callback_destroy);
if (impl->awaiting_frame_frozen)
{
impl->awaiting_frame_frozen = FALSE;