buffer: introduce wlr_buffer_finish()

This commit is contained in:
Kirill Primak 2024-11-22 23:18:55 +03:00 committed by Isaac Freund
parent 5eed5d622d
commit 7963ba6a0d
12 changed files with 38 additions and 9 deletions

View file

@ -24,6 +24,7 @@ struct cairo_buffer {
static void cairo_buffer_destroy(struct wlr_buffer *wlr_buffer) { static void cairo_buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct cairo_buffer *buffer = wl_container_of(wlr_buffer, buffer, base); struct cairo_buffer *buffer = wl_container_of(wlr_buffer, buffer, base);
wlr_buffer_finish(wlr_buffer);
cairo_surface_destroy(buffer->surface); cairo_surface_destroy(buffer->surface);
free(buffer); free(buffer);
} }

View file

@ -36,6 +36,11 @@ struct wlr_buffer_resource_interface {
void wlr_buffer_init(struct wlr_buffer *buffer, void wlr_buffer_init(struct wlr_buffer *buffer,
const struct wlr_buffer_impl *impl, int width, int height); const struct wlr_buffer_impl *impl, int width, int height);
/**
* Emit the destroy event and clean up common buffer state.
*/
void wlr_buffer_finish(struct wlr_buffer *buffer);
/** /**
* Allows the registration of a struct wl_resource implementation. * Allows the registration of a struct wl_resource implementation.
* *

View file

@ -135,6 +135,8 @@ static bool buffer_get_dmabuf(struct wlr_buffer *wlr_buffer,
static void buffer_destroy(struct wlr_buffer *wlr_buffer) { static void buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct wlr_drm_dumb_buffer *buf = drm_dumb_buffer_from_buffer(wlr_buffer); struct wlr_drm_dumb_buffer *buf = drm_dumb_buffer_from_buffer(wlr_buffer);
wlr_buffer_finish(wlr_buffer);
if (buf->data) { if (buf->data) {
munmap(buf->data, buf->size); munmap(buf->data, buf->size);
} }

View file

@ -155,8 +155,10 @@ static struct wlr_gbm_buffer *create_buffer(struct wlr_gbm_allocator *alloc,
} }
static void buffer_destroy(struct wlr_buffer *wlr_buffer) { static void buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct wlr_gbm_buffer *buffer = struct wlr_gbm_buffer *buffer = get_gbm_buffer_from_buffer(wlr_buffer);
get_gbm_buffer_from_buffer(wlr_buffer);
wlr_buffer_finish(wlr_buffer);
wlr_dmabuf_attributes_finish(&buffer->dmabuf); wlr_dmabuf_attributes_finish(&buffer->dmabuf);
if (buffer->gbm_bo != NULL) { if (buffer->gbm_bo != NULL) {
gbm_bo_destroy(buffer->gbm_bo); gbm_bo_destroy(buffer->gbm_bo);

View file

@ -22,6 +22,11 @@ void wlr_buffer_init(struct wlr_buffer *buffer,
wlr_addon_set_init(&buffer->addons); wlr_addon_set_init(&buffer->addons);
} }
void wlr_buffer_finish(struct wlr_buffer *buffer) {
wl_signal_emit_mutable(&buffer->events.destroy, NULL);
wlr_addon_set_finish(&buffer->addons);
}
static void buffer_consider_destroy(struct wlr_buffer *buffer) { static void buffer_consider_destroy(struct wlr_buffer *buffer) {
if (!buffer->dropped || buffer->n_locks > 0) { if (!buffer->dropped || buffer->n_locks > 0) {
return; return;
@ -29,9 +34,6 @@ static void buffer_consider_destroy(struct wlr_buffer *buffer) {
assert(!buffer->accessing_data_ptr); assert(!buffer->accessing_data_ptr);
wl_signal_emit_mutable(&buffer->events.destroy, NULL);
wlr_addon_set_finish(&buffer->addons);
buffer->impl->destroy(buffer); buffer->impl->destroy(buffer);
} }

View file

@ -24,6 +24,9 @@ static struct wlr_client_buffer *client_buffer_from_buffer(
static void client_buffer_destroy(struct wlr_buffer *buffer) { static void client_buffer_destroy(struct wlr_buffer *buffer) {
struct wlr_client_buffer *client_buffer = client_buffer_from_buffer(buffer); struct wlr_client_buffer *client_buffer = client_buffer_from_buffer(buffer);
wlr_buffer_finish(buffer);
wl_list_remove(&client_buffer->source_destroy.link); wl_list_remove(&client_buffer->source_destroy.link);
wl_list_remove(&client_buffer->renderer_destroy.link); wl_list_remove(&client_buffer->renderer_destroy.link);
wlr_texture_destroy(client_buffer->texture); wlr_texture_destroy(client_buffer->texture);

View file

@ -15,6 +15,7 @@ static struct wlr_dmabuf_buffer *dmabuf_buffer_from_buffer(
static void dmabuf_buffer_destroy(struct wlr_buffer *wlr_buffer) { static void dmabuf_buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct wlr_dmabuf_buffer *buffer = dmabuf_buffer_from_buffer(wlr_buffer); struct wlr_dmabuf_buffer *buffer = dmabuf_buffer_from_buffer(wlr_buffer);
wlr_buffer_finish(wlr_buffer);
if (buffer->saved) { if (buffer->saved) {
wlr_dmabuf_attributes_finish(&buffer->dmabuf); wlr_dmabuf_attributes_finish(&buffer->dmabuf);
} }

View file

@ -17,6 +17,7 @@ static struct wlr_readonly_data_buffer *readonly_data_buffer_from_buffer(
static void readonly_data_buffer_destroy(struct wlr_buffer *wlr_buffer) { static void readonly_data_buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct wlr_readonly_data_buffer *buffer = struct wlr_readonly_data_buffer *buffer =
readonly_data_buffer_from_buffer(wlr_buffer); readonly_data_buffer_from_buffer(wlr_buffer);
wlr_buffer_finish(wlr_buffer);
free(buffer->saved_data); free(buffer->saved_data);
free(buffer); free(buffer);
} }

View file

@ -34,11 +34,14 @@ static struct wlr_drm_buffer *drm_buffer_from_buffer(
static void buffer_destroy(struct wlr_buffer *wlr_buffer) { static void buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct wlr_drm_buffer *buffer = drm_buffer_from_buffer(wlr_buffer); struct wlr_drm_buffer *buffer = drm_buffer_from_buffer(wlr_buffer);
wl_list_remove(&buffer->release.link);
wlr_buffer_finish(wlr_buffer);
if (buffer->resource != NULL) { if (buffer->resource != NULL) {
wl_resource_set_user_data(buffer->resource, NULL); wl_resource_set_user_data(buffer->resource, NULL);
} }
wlr_dmabuf_attributes_finish(&buffer->dmabuf); wlr_dmabuf_attributes_finish(&buffer->dmabuf);
wl_list_remove(&buffer->release.link);
free(buffer); free(buffer);
} }

View file

@ -100,11 +100,14 @@ static struct wlr_dmabuf_v1_buffer *dmabuf_v1_buffer_from_buffer(
static void buffer_destroy(struct wlr_buffer *wlr_buffer) { static void buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct wlr_dmabuf_v1_buffer *buffer = struct wlr_dmabuf_v1_buffer *buffer =
dmabuf_v1_buffer_from_buffer(wlr_buffer); dmabuf_v1_buffer_from_buffer(wlr_buffer);
wl_list_remove(&buffer->release.link);
wlr_buffer_finish(wlr_buffer);
if (buffer->resource != NULL) { if (buffer->resource != NULL) {
wl_resource_set_user_data(buffer->resource, NULL); wl_resource_set_user_data(buffer->resource, NULL);
} }
wlr_dmabuf_attributes_finish(&buffer->attributes); wlr_dmabuf_attributes_finish(&buffer->attributes);
wl_list_remove(&buffer->release.link);
free(buffer); free(buffer);
} }

View file

@ -155,8 +155,11 @@ static void pool_consider_destroy(struct wlr_shm_pool *pool);
static void buffer_destroy(struct wlr_buffer *wlr_buffer) { static void buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct wlr_shm_buffer *buffer = wl_container_of(wlr_buffer, buffer, base); struct wlr_shm_buffer *buffer = wl_container_of(wlr_buffer, buffer, base);
assert(buffer->resource == NULL);
wl_list_remove(&buffer->release.link); wl_list_remove(&buffer->release.link);
wlr_buffer_finish(wlr_buffer);
assert(buffer->resource == NULL);
wl_list_remove(&buffer->link); wl_list_remove(&buffer->link);
pool_consider_destroy(buffer->pool); pool_consider_destroy(buffer->pool);
free(buffer); free(buffer);

View file

@ -53,10 +53,13 @@ static const struct wlr_buffer_resource_interface buffer_resource_interface = {
static void buffer_destroy(struct wlr_buffer *wlr_buffer) { static void buffer_destroy(struct wlr_buffer *wlr_buffer) {
struct wlr_single_pixel_buffer_v1 *buffer = struct wlr_single_pixel_buffer_v1 *buffer =
wl_container_of(wlr_buffer, buffer, base); wl_container_of(wlr_buffer, buffer, base);
wl_list_remove(&buffer->release.link);
wlr_buffer_finish(wlr_buffer);
if (buffer->resource != NULL) { if (buffer->resource != NULL) {
wl_resource_set_user_data(buffer->resource, NULL); wl_resource_set_user_data(buffer->resource, NULL);
} }
wl_list_remove(&buffer->release.link);
free(buffer); free(buffer);
} }