struct wl_list attach_bufs;
tbm_surface_queue_h tbm_queue;
-
- struct wl_list reset_noti;
-};
-
-typedef struct _wayland_tbm_client_queue_notify wayland_tbm_client_queue_notify;
-
-struct _wayland_tbm_client_queue_notify {
- wayland_tbm_client_queue_notify_cb cb;
- void *data;
- struct wl_list link;
};
-
static const int key_wl_buffer_imported;
#define KEY_WL_BUFFER_IMPORTED ((unsigned long)&key_wl_buffer_imported)
uint32_t usage)
{
struct wayland_tbm_surface_queue *queue_info = data;
- wayland_tbm_client_queue_notify *item, *tmp = NULL;
if (queue_info->is_active) {
WL_TBM_C_LOG("warning: queue_info is already activated\n");
queue_info->is_active = 1;
queue_info->usage = usage;
- /* call the reset_noti */
- wl_list_for_each_safe(item, tmp, &queue_info->reset_noti, link) {
- item->cb(queue_info->tbm_queue, item->data);
- }
-
/* flush the allocated surfaces at the client */
tbm_surface_queue_flush(queue_info->tbm_queue);
}
struct wl_tbm_queue *wl_tbm_queue)
{
struct wayland_tbm_surface_queue *queue_info = data;
- wayland_tbm_client_queue_notify *item, *tmp = NULL;
#ifdef DEBUG_TRACE
WL_TBM_TRACE(" pid:%d\n", getpid());
queue_info->is_active = 0;
- /* call the reset_noti */
- wl_list_for_each_safe(item, tmp, &queue_info->reset_noti, link) {
- item->cb(queue_info->tbm_queue, item->data);
- }
-
/* flush the attached surfaces */
_wayland_tbm_client_surface_queue_flush(queue_info);
}
void *data)
{
struct wayland_tbm_surface_queue *queue_info = data;
- wayland_tbm_client_queue_notify *item, *tmp;
#ifdef DEBUG_TRACE
WL_TBM_TRACE(" pid:%d\n", getpid());
#endif
- /* remove the reset notis in the queue_info */
- wl_list_for_each_safe(item, tmp, &queue_info->reset_noti, link) {
- wl_list_remove(&item->link);
- free(item);
- }
-
/* remove the attach_bufs int the queue_info */
_wayland_tbm_client_queue_destory_attach_bufs(queue_info);
WL_TBM_RETURN_VAL_IF_FAIL(queue_info != NULL, NULL);
queue_info->bufmgr = tbm_client->bufmgr;
wl_list_init(&queue_info->attach_bufs);
- wl_list_init(&queue_info->reset_noti);
queue = wl_tbm_create_surface_queue(tbm_client->wl_tbm, surface);
WL_TBM_GOTO_IF_FAIL(queue != NULL, fail);
return NULL;
}
-int wayland_tbm_client_add_reset_queue_cb(struct wayland_tbm_client *tbm_client,
- tbm_surface_queue_h surface_queue,
- wayland_tbm_client_queue_notify_cb reset_queue_cb,
- void *data)
-{
- struct wayland_tbm_surface_queue *queue_info = NULL;
- wayland_tbm_client_queue_notify *item = NULL;
-
- WL_TBM_RETURN_VAL_IF_FAIL(tbm_client != NULL, 0);
- WL_TBM_RETURN_VAL_IF_FAIL(surface_queue != NULL, 0);
- WL_TBM_RETURN_VAL_IF_FAIL(reset_queue_cb != NULL, 0);
-
- // TODO: verify the surface_queue in the tbm_client
- WL_TBM_RETURN_VAL_IF_FAIL(tbm_client->queue_info != NULL, 0);
- queue_info = tbm_client->queue_info;
- if (surface_queue != queue_info->tbm_queue) {
- WL_TBM_C_LOG("surface_queue != queue_info->tbm_queue\n");
- return 0;
- }
-
- item = calloc(1, sizeof(struct _wayland_tbm_client_queue_notify));
- WL_TBM_RETURN_VAL_IF_FAIL(item != NULL,0);
-
- item->cb = reset_queue_cb;
- item->data = data;
-
- wl_list_insert(&queue_info->reset_noti, &item->link);
-
- return 1;
-}
-
-
-int wayland_tbm_client_remove_reset_queue_cb(struct wayland_tbm_client *tbm_client,
- tbm_surface_queue_h surface_queue,
- wayland_tbm_client_queue_notify_cb reset_queue_cb,
- void *data)
-{
- struct wayland_tbm_surface_queue *queue_info = NULL;
- wayland_tbm_client_queue_notify *item, *tmp = NULL;
-
- WL_TBM_RETURN_VAL_IF_FAIL(tbm_client != NULL, 0);
- WL_TBM_RETURN_VAL_IF_FAIL(surface_queue != NULL, 0);
- WL_TBM_RETURN_VAL_IF_FAIL(reset_queue_cb != NULL, 0);
-
- // TODO: verify the surface_queue in the tbm_client
- WL_TBM_RETURN_VAL_IF_FAIL(tbm_client->queue_info != NULL, 0);
- queue_info = tbm_client->queue_info;
- if (surface_queue != queue_info->tbm_queue) {
- WL_TBM_C_LOG("surface_queue != queue_info->tbm_queue\n");
- return 0;
- }
-
- /* unref the tbm surfaces attached */
- wl_list_for_each_safe(item, tmp, &queue_info->reset_noti, link) {
- if (item->cb == reset_queue_cb && item->data == data) {
- wl_list_remove(&item->link);
- free(item);
- return 1;
- }
- }
-
- WL_TBM_C_LOG("Warning: cannot fine the reset notify in the queue.\n");
-
- return 0;
-}
-