static void cogland_buffer_reference (CoglandBufferReference *ref, CoglandBuffer *buffer) { if (ref->buffer && buffer != ref->buffer) { ref->buffer->busy_count--; if (ref->buffer->busy_count == 0) { g_assert (wl_resource_get_client (ref->buffer->resource)); wl_resource_queue_event (ref->buffer->resource, WL_BUFFER_RELEASE); } wl_list_remove (&ref->destroy_listener.link); } if (buffer && buffer != ref->buffer) { buffer->busy_count++; wl_signal_add (&buffer->destroy_signal, &ref->destroy_listener); } ref->buffer = buffer; ref->destroy_listener.notify = cogland_buffer_reference_handle_destroy; }
void meta_wayland_buffer_unref (MetaWaylandBuffer *buffer) { buffer->ref_count--; if (buffer->ref_count == 0) { g_clear_pointer (&buffer->texture, cogl_object_unref); wl_resource_queue_event (buffer->resource, WL_BUFFER_RELEASE); } }
void wlc_buffer_release(struct wlc_buffer *buffer) { struct wlc_surface *surface; if ((surface = convert_from_wlc_resource(buffer->surface, "surface"))) { if (surface->commit.buffer == convert_to_wlc_resource(buffer)) surface->commit.buffer = 0; if (surface->pending.buffer == convert_to_wlc_resource(buffer)) surface->pending.buffer = 0; } struct wl_resource *resource; if ((resource = convert_to_wl_resource(buffer, "buffer"))) { wlc_resource_invalidate(convert_to_wlc_resource(buffer)); wl_resource_queue_event(resource, WL_BUFFER_RELEASE); } }