surface: introduce commit sequence numbers

Very similar to output commit sequence numbers. Can be useful to
reference a specific commit.
master
Simon Ser 4 years ago
parent 78d21fa131
commit 7ac76aba8a

@ -31,6 +31,9 @@ enum wlr_surface_state_field {
struct wlr_surface_state { struct wlr_surface_state {
uint32_t committed; // enum wlr_surface_state_field uint32_t committed; // enum wlr_surface_state_field
// Sequence number of the surface state. Incremented on each commit, may
// overflow.
uint32_t seq;
struct wl_resource *buffer_resource; struct wl_resource *buffer_resource;
int32_t dx, dy; // relative to previous position int32_t dx, dy; // relative to previous position

@ -295,6 +295,7 @@ static void surface_state_copy(struct wlr_surface_state *state,
} }
state->committed |= next->committed; state->committed |= next->committed;
state->seq = next->seq;
} }
/** /**
@ -418,6 +419,7 @@ static void surface_commit_pending(struct wlr_surface *surface) {
surface_state_copy(&surface->previous, &surface->current); surface_state_copy(&surface->previous, &surface->current);
surface_state_move(&surface->current, &surface->pending); surface_state_move(&surface->current, &surface->pending);
surface->pending.seq = surface->current.seq + 1;
if (invalid_buffer) { if (invalid_buffer) {
surface_apply_damage(surface); surface_apply_damage(surface);
@ -491,6 +493,7 @@ static void subsurface_commit(struct wlr_subsurface *subsurface) {
if (subsurface_is_synchronized(subsurface)) { if (subsurface_is_synchronized(subsurface)) {
surface_state_move(&subsurface->cached, &surface->pending); surface_state_move(&subsurface->cached, &surface->pending);
subsurface->has_cache = true; subsurface->has_cache = true;
surface->pending.seq = subsurface->cached.seq + 1;
} else { } else {
if (subsurface->has_cache) { if (subsurface->has_cache) {
surface_state_move(&surface->pending, &subsurface->cached); surface_state_move(&surface->pending, &subsurface->cached);
@ -692,6 +695,7 @@ struct wlr_surface *wlr_surface_create(struct wl_client *client,
surface_state_init(&surface->current); surface_state_init(&surface->current);
surface_state_init(&surface->pending); surface_state_init(&surface->pending);
surface_state_init(&surface->previous); surface_state_init(&surface->previous);
surface->pending.seq = 1;
wl_signal_init(&surface->events.commit); wl_signal_init(&surface->events.commit);
wl_signal_init(&surface->events.destroy); wl_signal_init(&surface->events.destroy);

Loading…
Cancel
Save