[mutter] wayland/surface: Make cached subsurface state generic
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] wayland/surface: Make cached subsurface state generic
- Date: Mon, 9 Dec 2019 09:19:33 +0000 (UTC)
commit f7e256e9a1363330d406d0d6f73ee75c498c1bdd
Author: Jonas Ådahl <jadahl gmail com>
Date: Wed Mar 13 14:42:40 2019 +0100
wayland/surface: Make cached subsurface state generic
This moves the cached subsurface surface state into the generic
MetaWaylandSurface namespace. Eventually it'll be used by other surface
roles which as well aim to implement synhcronization.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/907
src/wayland/meta-wayland-subsurface.c | 6 ++----
src/wayland/meta-wayland-surface.c | 32 +++++++++++++++++++++++++++++---
src/wayland/meta-wayland-surface.h | 9 ++++++---
3 files changed, 37 insertions(+), 10 deletions(-)
---
diff --git a/src/wayland/meta-wayland-subsurface.c b/src/wayland/meta-wayland-subsurface.c
index a33c8ef89..dfd455496 100644
--- a/src/wayland/meta-wayland-subsurface.c
+++ b/src/wayland/meta-wayland-subsurface.c
@@ -189,7 +189,7 @@ meta_wayland_subsurface_parent_state_applied (MetaWaylandSubsurface *subsurface)
}
if (is_surface_effectively_synchronized (surface))
- meta_wayland_surface_apply_state (surface, surface->sub.pending);
+ meta_wayland_surface_apply_cached_state (surface);
meta_wayland_actor_surface_sync_actor_state (actor_surface);
}
@@ -356,7 +356,6 @@ wl_subsurface_destructor (struct wl_resource *resource)
surface->sub.parent = NULL;
}
- g_clear_object (&surface->sub.pending);
surface->wl_subsurface = NULL;
}
@@ -485,7 +484,7 @@ wl_subsurface_set_desync (struct wl_client *client,
if (was_effectively_synchronized &&
!is_surface_effectively_synchronized (surface))
- meta_wayland_surface_apply_state (surface, surface->sub.pending);
+ meta_wayland_surface_apply_cached_state (surface);
}
static const struct wl_subsurface_interface meta_wayland_wl_subsurface_interface = {
@@ -561,7 +560,6 @@ wl_subcompositor_get_subsurface (struct wl_client *client,
surface,
wl_subsurface_destructor);
- surface->sub.pending = g_object_new (META_TYPE_WAYLAND_SURFACE_STATE, NULL);
surface->sub.synchronous = TRUE;
surface->sub.parent = parent;
surface->sub.parent_destroy_listener.notify =
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 09d83a31d..1f4727ece 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -616,7 +616,7 @@ meta_wayland_surface_cache_pending_frame_callbacks (MetaWaylandSurface *sur
wl_list_init (&pending->frame_callback_list);
}
-void
+static void
meta_wayland_surface_apply_state (MetaWaylandSurface *surface,
MetaWaylandSurfaceState *state)
{
@@ -817,12 +817,30 @@ cleanup:
}
}
+void
+meta_wayland_surface_apply_cached_state (MetaWaylandSurface *surface)
+{
+ if (!surface->cached_state)
+ return;
+
+ meta_wayland_surface_apply_state (surface, surface->cached_state);
+}
+
MetaWaylandSurfaceState *
meta_wayland_surface_get_pending_state (MetaWaylandSurface *surface)
{
return surface->pending_state;
}
+MetaWaylandSurfaceState *
+meta_wayland_surface_ensure_cached_state (MetaWaylandSurface *surface)
+{
+ if (!surface->cached_state)
+ surface->cached_state = g_object_new (META_TYPE_WAYLAND_SURFACE_STATE,
+ NULL);
+ return surface->cached_state;
+}
+
static void
meta_wayland_surface_commit (MetaWaylandSurface *surface)
{
@@ -844,9 +862,16 @@ meta_wayland_surface_commit (MetaWaylandSurface *surface)
* surface is in effective desynchronized mode.
*/
if (meta_wayland_surface_should_cache_state (surface))
- meta_wayland_surface_state_merge_into (pending, surface->sub.pending);
+ {
+ MetaWaylandSurfaceState *cached_state;
+
+ cached_state = meta_wayland_surface_ensure_cached_state (surface);
+ meta_wayland_surface_state_merge_into (pending, cached_state);
+ }
else
- meta_wayland_surface_apply_state (surface, surface->pending_state);
+ {
+ meta_wayland_surface_apply_state (surface, surface->pending_state);
+ }
}
static void
@@ -1344,6 +1369,7 @@ wl_surface_destructor (struct wl_resource *resource)
g_clear_pointer (&surface->texture, cogl_object_unref);
g_clear_object (&surface->buffer_ref.buffer);
+ g_clear_object (&surface->cached_state);
g_clear_object (&surface->pending_state);
if (surface->opaque_region)
diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h
index 9a8c8f793..41fe47ca4 100644
--- a/src/wayland/meta-wayland-surface.h
+++ b/src/wayland/meta-wayland-surface.h
@@ -176,6 +176,8 @@ struct _MetaWaylandSurface
/* All the pending state that wl_surface.commit will apply. */
MetaWaylandSurfaceState *pending_state;
+ /* State cached due to inter-surface synchronization such. */
+ MetaWaylandSurfaceState *cached_state;
/* Extension resources. */
struct wl_resource *wl_subsurface;
@@ -197,7 +199,6 @@ struct _MetaWaylandSurface
* state here.
*/
gboolean synchronous;
- MetaWaylandSurfaceState *pending;
int32_t pending_x;
int32_t pending_y;
@@ -232,8 +233,10 @@ MetaWaylandSurface *meta_wayland_surface_create (MetaWaylandCompositor *composit
MetaWaylandSurfaceState *
meta_wayland_surface_get_pending_state (MetaWaylandSurface *surface);
-void meta_wayland_surface_apply_state (MetaWaylandSurface *surface,
- MetaWaylandSurfaceState *state);
+MetaWaylandSurfaceState *
+ meta_wayland_surface_ensure_cached_state (MetaWaylandSurface *surface);
+
+void meta_wayland_surface_apply_cached_state (MetaWaylandSurface *surface);
gboolean meta_wayland_surface_is_effectively_synchronized (MetaWaylandSurface *surface);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]