From 9a8097682b3fe2cf4c4c5926abcdb968e0de6839 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 8 Jun 2021 19:45:56 +0200 Subject: [PATCH] buffer: stop sending wl_buffer.release events from wlr_client_buffer The specialized client buffer implementations take care of this. --- include/wlr/types/wlr_buffer.h | 5 ----- types/wlr_buffer.c | 34 ---------------------------------- types/wlr_surface.c | 2 +- 3 files changed, 1 insertion(+), 40 deletions(-) diff --git a/include/wlr/types/wlr_buffer.h b/include/wlr/types/wlr_buffer.h index e64e60c8..c293eb6a 100644 --- a/include/wlr/types/wlr_buffer.h +++ b/include/wlr/types/wlr_buffer.h @@ -122,10 +122,6 @@ struct wlr_client_buffer { * The buffer resource, if any. Will be NULL if the client destroys it. */ struct wl_resource *resource; - /** - * Whether a release event has been sent to the resource. - */ - bool resource_released; /** * The buffer's texture, if any. A buffer will not have a texture if the * client destroys the buffer before it has been released. @@ -133,7 +129,6 @@ struct wlr_client_buffer { struct wlr_texture *texture; struct wl_listener resource_destroy; - struct wl_listener release; }; struct wlr_renderer; diff --git a/types/wlr_buffer.c b/types/wlr_buffer.c index 59c36f6b..8a17c9bf 100644 --- a/types/wlr_buffer.c +++ b/types/wlr_buffer.c @@ -148,11 +148,6 @@ static struct wlr_client_buffer *client_buffer_from_buffer( static void client_buffer_destroy(struct wlr_buffer *_buffer) { struct wlr_client_buffer *buffer = client_buffer_from_buffer(_buffer); - - if (!buffer->resource_released && buffer->resource != NULL) { - wl_buffer_send_release(buffer->resource); - } - wl_list_remove(&buffer->resource_destroy.link); wlr_texture_destroy(buffer->texture); free(buffer); @@ -199,23 +194,11 @@ static void client_buffer_resource_handle_destroy(struct wl_listener *listener, // which case we'll read garbage. We decide to accept this risk. } -static void client_buffer_handle_release(struct wl_listener *listener, - void *data) { - struct wlr_client_buffer *buffer = - wl_container_of(listener, buffer, release); - if (!buffer->resource_released && buffer->resource != NULL) { - wl_buffer_send_release(buffer->resource); - buffer->resource_released = true; - } -} - struct wlr_client_buffer *wlr_client_buffer_import( struct wlr_renderer *renderer, struct wl_resource *resource) { assert(wlr_resource_is_buffer(resource)); struct wlr_texture *texture = NULL; - bool resource_released = false; - if (wl_shm_buffer_get(resource) != NULL) { struct wlr_shm_client_buffer *shm_client_buffer = shm_client_buffer_create(resource); @@ -232,26 +215,14 @@ struct wlr_client_buffer *wlr_client_buffer_import( // The renderer should've locked the buffer by now if necessary wlr_buffer_unlock(&shm_client_buffer->base); - - // The renderer is responsible for releasing the buffer when - // appropriate - resource_released = true; } else if (wlr_dmabuf_v1_resource_is_buffer(resource)) { struct wlr_dmabuf_v1_buffer *dmabuf = wlr_dmabuf_v1_buffer_from_buffer_resource(resource); texture = wlr_texture_from_buffer(renderer, &dmabuf->base); - - // The renderer is responsible for releasing the buffer when - // appropriate - resource_released = true; } else if (wlr_drm_buffer_is_resource(resource)) { struct wlr_drm_buffer *drm_buffer = wlr_drm_buffer_from_resource(resource); texture = wlr_texture_from_buffer(renderer, &drm_buffer->base); - - // The renderer is responsible for releasing the buffer when - // appropriate - resource_released = true; } else { wlr_log(WLR_ERROR, "Cannot upload texture: unknown buffer type"); @@ -278,14 +249,10 @@ struct wlr_client_buffer *wlr_client_buffer_import( texture->width, texture->height); buffer->resource = resource; buffer->texture = texture; - buffer->resource_released = resource_released; wl_resource_add_destroy_listener(resource, &buffer->resource_destroy); buffer->resource_destroy.notify = client_buffer_resource_handle_destroy; - buffer->release.notify = client_buffer_handle_release; - wl_signal_add(&buffer->base.events.release, &buffer->release); - // Ensure the buffer will be released before being destroyed wlr_buffer_lock(&buffer->base); wlr_buffer_drop(&buffer->base); @@ -353,7 +320,6 @@ struct wlr_client_buffer *wlr_client_buffer_apply_damage( buffer->resource_destroy.notify = client_buffer_resource_handle_destroy; buffer->resource = resource; - buffer->resource_released = true; return buffer; } diff --git a/types/wlr_surface.c b/types/wlr_surface.c index 105b820f..abfcbf73 100644 --- a/types/wlr_surface.c +++ b/types/wlr_surface.c @@ -355,7 +355,7 @@ static void surface_apply_damage(struct wlr_surface *surface) { return; } - if (surface->buffer != NULL && surface->buffer->resource_released) { + if (surface->buffer != NULL) { struct wlr_client_buffer *updated_buffer = wlr_client_buffer_apply_damage(surface->buffer, resource, &surface->buffer_damage);