diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2020-09-17 17:35:35 +0200 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2020-09-17 17:35:35 +0200 |
commit | 1abcd6f3043fc272d8fd30437fc0969c73fc6eb5 (patch) | |
tree | dc9fc7a76fdd49bd7119ea55f22ecf9b12819e84 | |
parent | f87de393b57fbae0a96b59cb0b53a1f7c4e64d17 (diff) | |
download | gtk+-1abcd6f3043fc272d8fd30437fc0969c73fc6eb5.tar.gz |
wayland: Commit surface from cairo context
In order to make the cairo renderer/context behave more similar to how
the OpenGL and Vulkan renderer/context behaves, request a frame callback
and commit in the end frame vfunc.
This means the end frame vfunc in cairo does
* attach buffer
* request frame callback
* sync surface state
* commit
Where as e.g. the OpenGL version of the same flow does
* attach buffer
* request frame callback
* sync surface state
* eglSwapBuffers()
where eglSwapBuffers() indirectly calls wl_surface_commit().
-rw-r--r-- | gdk/wayland/gdkcairocontext-wayland.c | 5 | ||||
-rw-r--r-- | gdk/wayland/gdkprivate-wayland.h | 1 | ||||
-rw-r--r-- | gdk/wayland/gdksurface-wayland.c | 29 |
3 files changed, 14 insertions, 21 deletions
diff --git a/gdk/wayland/gdkcairocontext-wayland.c b/gdk/wayland/gdkcairocontext-wayland.c index bb28ada46f..d0fc54d0b0 100644 --- a/gdk/wayland/gdkcairocontext-wayland.c +++ b/gdk/wayland/gdkcairocontext-wayland.c @@ -23,6 +23,7 @@ #include "gdkprivate-wayland.h" #include "gdkinternals.h" +#include "gdkprofilerprivate.h" static const cairo_user_data_key_t gdk_wayland_cairo_context_key; static const cairo_user_data_key_t gdk_wayland_cairo_region_key; @@ -180,6 +181,10 @@ gdk_wayland_cairo_context_end_frame (GdkDrawContext *draw_context, gdk_wayland_surface_attach_image (surface, self->paint_surface, painted); gdk_wayland_surface_sync (surface); + gdk_wayland_surface_request_frame (surface); + + gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "wayland", "surface commit"); + gdk_wayland_surface_commit (surface); gdk_wayland_cairo_context_surface_clear_region (self->paint_surface); self->paint_surface = NULL; diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h index dc7c4848a2..db45a07c08 100644 --- a/gdk/wayland/gdkprivate-wayland.h +++ b/gdk/wayland/gdkprivate-wayland.h @@ -94,6 +94,7 @@ guint _gdk_wayland_cursor_get_next_image_index (GdkWaylandDisplay *display, guint *next_image_delay); void gdk_wayland_surface_sync (GdkSurface *surface); +void gdk_wayland_surface_commit (GdkSurface *surface); void gdk_wayland_surface_request_frame (GdkSurface *surface); void gdk_wayland_surface_attach_image (GdkSurface *surface, cairo_surface_t *cairo_surface, diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c index 7ac0a78263..bda30ae39c 100644 --- a/gdk/wayland/gdksurface-wayland.c +++ b/gdk/wayland/gdksurface-wayland.c @@ -95,7 +95,6 @@ struct _GdkWaylandSurface unsigned int initial_configure_received : 1; unsigned int mapped : 1; - unsigned int pending_commit : 1; unsigned int awaiting_frame : 1; unsigned int awaiting_frame_frozen : 1; unsigned int is_drag_surface : 1; @@ -615,30 +614,20 @@ gdk_wayland_surface_request_frame (GdkSurface *surface) impl->awaiting_frame = TRUE; } +void +gdk_wayland_surface_commit (GdkSurface *surface) +{ + GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface); + + wl_surface_commit (impl->display_server.wl_surface); +} + static void on_frame_clock_after_paint (GdkFrameClock *clock, GdkSurface *surface) { GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface); - if (impl->pending_commit && surface->update_freeze_count == 0) - { - gdk_wayland_surface_request_frame (surface); - - /* From this commit forward, we can't write to the buffer, - * it's "live". In the future, if we need to stage more changes - * we have to allocate a new staging buffer and draw to it instead. - * - * Our one saving grace is if the compositor releases the buffer - * before we need to stage any changes, then we can take it back and - * use it again. - */ - gdk_profiler_add_mark (GDK_PROFILER_CURRENT_TIME, 0, "wayland", "surface commit"); - wl_surface_commit (impl->display_server.wl_surface); - - impl->pending_commit = FALSE; - } - if (impl->awaiting_frame && impl->pending_frame_counter == gdk_frame_clock_get_frame_counter (clock)) { @@ -804,7 +793,6 @@ gdk_wayland_surface_attach_image (GdkSurface *surface, cairo_region_get_rectangle (damage, i, &rect); wl_surface_damage (impl->display_server.wl_surface, rect.x, rect.y, rect.width, rect.height); } - impl->pending_commit = TRUE; } void @@ -2789,7 +2777,6 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface) unset_transient_for_exported (surface); _gdk_wayland_surface_clear_saved_size (surface); - impl->pending_commit = FALSE; impl->mapped = FALSE; } |