aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-06-17 12:49:34 +0100
committeremersion <contact@emersion.fr>2018-06-17 12:49:34 +0100
commit843621714fff0dc4c1ce63e105a03b5d4028b833 (patch)
treeac2f7f681e92618b1cea797c00a1ee22813e88dc
parentfb118ac9966bbb663ddb9964f54c879a0bb88fba (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.c13
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;