diff options
author | emersion <contact@emersion.fr> | 2018-06-17 12:49:34 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-06-17 12:49:34 +0100 |
commit | 843621714fff0dc4c1ce63e105a03b5d4028b833 (patch) | |
tree | ac2f7f681e92618b1cea797c00a1ee22813e88dc | |
parent | fb118ac9966bbb663ddb9964f54c879a0bb88fba (diff) |
surface: fix double wl_buffer.release events
Prior to this commit, we re-uploaded the buffer even if a new one
wasn't attached. After uploading, we send wl_buffer.release. So,
this sequence of requests resulted in a double release:
surface.attach(buffer, 0, 0)
surface.commit()
<- buffer.release()
surface.commit()
<- buffer.release()
-rw-r--r-- | types/wlr_surface.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/types/wlr_surface.c b/types/wlr_surface.c index af1e9446..0f84312e 100644 --- a/types/wlr_surface.c +++ b/types/wlr_surface.c @@ -325,8 +325,7 @@ static void surface_damage_subsurfaces(struct wlr_subsurface *subsurface) { } } -static void surface_apply_damage(struct wlr_surface *surface, - bool invalid_buffer) { +static void surface_apply_damage(struct wlr_surface *surface) { struct wl_resource *resource = surface->current->buffer; if (resource == NULL) { // NULL commit @@ -335,12 +334,6 @@ static void surface_apply_damage(struct wlr_surface *surface, return; } - if (surface->buffer != NULL && !surface->buffer->released && - !invalid_buffer) { - // The buffer is still the same, no need to re-upload - return; - } - if (surface->buffer != NULL && surface->buffer->released) { pixman_region32_t damage; pixman_region32_init(&damage); @@ -376,7 +369,9 @@ static void surface_commit_pending(struct wlr_surface *surface) { surface_move_state(surface, surface->pending, surface->current); - surface_apply_damage(surface, invalid_buffer); + if (invalid_buffer) { + surface_apply_damage(surface); + } // commit subsurface order struct wlr_subsurface *subsurface; |