static E_Buffer *_e_buffer_create(struct ds_buffer *ds_buffer, E_Client *ec);
static E_Buffer *_e_buffer_from_base(E_Comp_Wl_Buffer *base);
+static E_Buffer *_e_buffer_from_buffer(struct ds_buffer *ds_buffer);
static void _e_buffer_cb_resource_destroy(struct wl_listener *listener, void *data);
+static void _e_buffer_transform_update(E_Buffer *buffer);
E_API void
e_comp_wl_buffer_reference(E_Comp_Wl_Buffer_Ref *ref, E_Comp_Wl_Buffer *buffer)
e_comp_wl_buffer_get(struct ds_buffer *ds_buffer, E_Client *ec)
{
E_Buffer *buffer;
- struct wl_listener *listener;
- struct wl_resource *buffer_resource;
- buffer_resource = ds_buffer_get_resource(ds_buffer);
- listener = wl_resource_get_destroy_listener(buffer_resource, _e_buffer_cb_resource_destroy);
- if (listener)
- {
- buffer = wl_container_of(listener, buffer, base.destroy_listener);
- goto done;
- }
+ buffer = _e_buffer_from_buffer(ds_buffer);
+ if (buffer)
+ goto done;
buffer = _e_buffer_create(ds_buffer, ec);
if (!buffer)
}
done:
- if (buffer->base.tbm_surface)
- buffer->base.transform = wayland_tbm_server_buffer_get_buffer_transform(NULL, buffer->base.resource);
+ _e_buffer_transform_update(buffer);
return &buffer->base;
}
}
static void
-_e_comp_wl_buffer_unref(E_Comp_Wl_Buffer *base)
+_e_comp_wl_buffer_release(E_Comp_Wl_Buffer *base)
{
E_Buffer *buffer;
- base->busy--;
- if (base->busy != 0)
- return;
-
if (base->buffer_release)
{
e_explicit_sync_buffer_release_destroy(base->buffer_release);
base->buffer_release = NULL;
}
- if (base->resource)
+ buffer = _e_buffer_from_base(base);
+ if (buffer)
{
- buffer = _e_buffer_from_base(base);
- if (buffer)
- ds_buffer_unlock(buffer->ds_buffer);
- else
- wl_buffer_send_release(base->resource);
+ ds_buffer_unlock(buffer->ds_buffer);
#ifdef HAVE_WAYLAND_TBM
wayland_tbm_server_increase_buffer_sync_timeline(e_comp_wl->tbm.server,
base->resource, 1);
#endif
}
- else
+ else if (base->type == E_COMP_WL_BUFFER_TYPE_TBM)
{
- if (base->type == E_COMP_WL_BUFFER_TYPE_TBM)
- e_comp_wl_tbm_buffer_destroy(base);
+ e_comp_wl_tbm_buffer_destroy(base);
}
}
static void
+_e_comp_wl_buffer_unref(E_Comp_Wl_Buffer *base)
+{
+ base->busy--;
+ if (base->busy != 0)
+ return;
+
+ _e_comp_wl_buffer_release(base);
+}
+
+static void
_e_comp_wl_buffer_reference_cb_destroy(struct wl_listener *listener, void *data)
{
E_Comp_Wl_Buffer_Ref *ref;
- E_Buffer *buffer;
ref = container_of(listener, E_Comp_Wl_Buffer_Ref, destroy_listener);
-
- if (--ref->buffer->busy == 0)
- {
- buffer = _e_buffer_from_base(ref->buffer);
- if (buffer)
- ds_buffer_unlock(buffer->ds_buffer);
- }
-
wl_list_remove(&ref->destroy_listener.link);
ref->buffer = NULL;
}
DBG("Wl Buffer Destroy: b %p owner '%s'(%p)",
base, base->debug_info.owner_name, base->debug_info.owner_ptr);
+ wl_signal_emit(&base->destroy_signal, base);
+
/* remove debug info */
eina_stringshare_del(base->debug_info.owner_name);
if (base->buffer_release)
e_explicit_sync_buffer_release_destroy(base->buffer_release);
- wl_signal_emit(&base->destroy_signal, base);
+ wl_list_remove(&base->destroy_listener.link);
}
static E_Buffer *
buffer = wl_container_of(listener, buffer, base.destroy_listener);
+ if (buffer->base.busy > 0)
+ ds_buffer_unlock(buffer->ds_buffer);
_e_comp_wl_buffer_finish(&buffer->base);
- wl_list_remove(&buffer->base.destroy_listener.link);
free(buffer);
}
+
+static E_Buffer *
+_e_buffer_from_buffer(struct ds_buffer *ds_buffer)
+{
+ E_Buffer *buffer;
+ struct wl_resource *resource;
+ struct wl_listener *listener;
+
+ resource = ds_buffer_get_resource(ds_buffer);
+ listener = wl_resource_get_destroy_listener(resource, _e_buffer_cb_resource_destroy);
+ if (listener)
+ return wl_container_of(listener, buffer, base.destroy_listener);
+ return NULL;
+}
+
+static void
+_e_buffer_transform_update(E_Buffer *buffer)
+{
+ if (buffer->base.tbm_surface)
+ buffer->base.transform = wayland_tbm_server_buffer_get_buffer_transform(NULL, buffer->base.resource);
+}