compositor: Clean up resource destroy callback handling
This commit is contained in:
+6
-15
@@ -206,10 +206,7 @@ surface_handle_buffer_destroy(struct wl_listener *listener,
|
|||||||
{
|
{
|
||||||
struct wlsc_surface *es = container_of(listener, struct wlsc_surface,
|
struct wlsc_surface *es = container_of(listener, struct wlsc_surface,
|
||||||
buffer_destroy_listener);
|
buffer_destroy_listener);
|
||||||
struct wl_buffer *buffer = (struct wl_buffer *) resource;
|
|
||||||
|
|
||||||
wl_list_init(&es->buffer_destroy_listener.link);
|
|
||||||
if (es->buffer == buffer)
|
|
||||||
es->buffer = NULL;
|
es->buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,9 +218,7 @@ output_handle_scanout_buffer_destroy(struct wl_listener *listener,
|
|||||||
struct wlsc_output *output =
|
struct wlsc_output *output =
|
||||||
container_of(listener, struct wlsc_output,
|
container_of(listener, struct wlsc_output,
|
||||||
scanout_buffer_destroy_listener);
|
scanout_buffer_destroy_listener);
|
||||||
struct wl_buffer *buffer = (struct wl_buffer *) resource;
|
|
||||||
|
|
||||||
if (output->scanout_buffer == buffer)
|
|
||||||
output->scanout_buffer = NULL;
|
output->scanout_buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,9 +230,7 @@ output_handle_pending_scanout_buffer_destroy(struct wl_listener *listener,
|
|||||||
struct wlsc_output *output =
|
struct wlsc_output *output =
|
||||||
container_of(listener, struct wlsc_output,
|
container_of(listener, struct wlsc_output,
|
||||||
pending_scanout_buffer_destroy_listener);
|
pending_scanout_buffer_destroy_listener);
|
||||||
struct wl_buffer *buffer = (struct wl_buffer *) resource;
|
|
||||||
|
|
||||||
if (output->pending_scanout_buffer == buffer)
|
|
||||||
output->pending_scanout_buffer = NULL;
|
output->pending_scanout_buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,7 +273,6 @@ wlsc_surface_create(struct wlsc_compositor *compositor,
|
|||||||
pixman_region32_init(&surface->opaque);
|
pixman_region32_init(&surface->opaque);
|
||||||
|
|
||||||
surface->buffer_destroy_listener.func = surface_handle_buffer_destroy;
|
surface->buffer_destroy_listener.func = surface_handle_buffer_destroy;
|
||||||
wl_list_init(&surface->buffer_destroy_listener.link);
|
|
||||||
|
|
||||||
surface->transform = NULL;
|
surface->transform = NULL;
|
||||||
|
|
||||||
@@ -742,7 +734,7 @@ wlsc_compositor_damage_all(struct wlsc_compositor *compositor)
|
|||||||
static inline void
|
static inline void
|
||||||
wlsc_buffer_post_release(struct wl_buffer *buffer)
|
wlsc_buffer_post_release(struct wl_buffer *buffer)
|
||||||
{
|
{
|
||||||
if (buffer == NULL || --buffer->busy_count > 0)
|
if (--buffer->busy_count > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
assert(buffer->resource.client != NULL);
|
assert(buffer->resource.client != NULL);
|
||||||
@@ -1083,11 +1075,13 @@ surface_attach(struct wl_client *client,
|
|||||||
struct wl_buffer *buffer = buffer_resource->data;
|
struct wl_buffer *buffer = buffer_resource->data;
|
||||||
int repick = 0;
|
int repick = 0;
|
||||||
|
|
||||||
buffer->busy_count++;
|
if (es->buffer) {
|
||||||
wlsc_buffer_post_release(es->buffer);
|
wlsc_buffer_post_release(es->buffer);
|
||||||
|
|
||||||
es->buffer = buffer;
|
|
||||||
wl_list_remove(&es->buffer_destroy_listener.link);
|
wl_list_remove(&es->buffer_destroy_listener.link);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer->busy_count++;
|
||||||
|
es->buffer = buffer;
|
||||||
wl_list_insert(es->buffer->resource.destroy_listener_list.prev,
|
wl_list_insert(es->buffer->resource.destroy_listener_list.prev,
|
||||||
&es->buffer_destroy_listener.link);
|
&es->buffer_destroy_listener.link);
|
||||||
|
|
||||||
@@ -1946,11 +1940,8 @@ wlsc_output_init(struct wlsc_output *output, struct wlsc_compositor *c,
|
|||||||
|
|
||||||
output->scanout_buffer_destroy_listener.func =
|
output->scanout_buffer_destroy_listener.func =
|
||||||
output_handle_scanout_buffer_destroy;
|
output_handle_scanout_buffer_destroy;
|
||||||
wl_list_init(&output->scanout_buffer_destroy_listener.link);
|
|
||||||
|
|
||||||
output->pending_scanout_buffer_destroy_listener.func =
|
output->pending_scanout_buffer_destroy_listener.func =
|
||||||
output_handle_pending_scanout_buffer_destroy;
|
output_handle_pending_scanout_buffer_destroy;
|
||||||
wl_list_init(&output->pending_scanout_buffer_destroy_listener.link);
|
|
||||||
|
|
||||||
wl_list_init(&output->frame_callback_list);
|
wl_list_init(&output->frame_callback_list);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user