int num_buf, is_fd = -1, i;
char debug_id[64] = {0, };
tbm_surface_info_s info;
- uint32_t flags = 0;
+ uint32_t flags = tbm_bo_get_flags(tbm_surface_internal_get_bo(surface, 0));
struct wl_array plane_buf_idx, plane_offset, plane_stride, plane_size;
int *p;
return NULL;
}
+tbm_surface_queue_h
+wayland_tbm_client_create_surface_queue_tiled(struct wayland_tbm_client *tbm_client,
+ struct wl_surface *surface,
+ int queue_size,
+ int width, int height, tbm_format format)
+{
+ struct wayland_tbm_surface_queue *queue_info;
+ struct wl_tbm_queue *queue;
+
+#ifdef DEBUG_TRACE
+ WL_TBM_TRACE(" pid:%d", getpid());
+#endif
+
+ WL_TBM_RETURN_VAL_IF_FAIL(tbm_client != NULL, NULL);
+ WL_TBM_RETURN_VAL_IF_FAIL(surface != NULL, NULL);
+
+ queue_info = calloc(1, sizeof(struct wayland_tbm_surface_queue));
+ WL_TBM_RETURN_VAL_IF_FAIL(queue_info != NULL, NULL);
+
+ queue_info->wl_tbm = tbm_client->wl_tbm;
+ queue_info->bufmgr = tbm_client->bufmgr;
+ queue_info->wl_surface = surface;
+ wl_list_init(&queue_info->attach_bufs);
+
+ queue = wl_tbm_create_surface_queue(tbm_client->wl_tbm, surface);
+ WL_TBM_GOTO_IF_FAIL(queue != NULL, fail);
+
+ queue_info->wl_tbm_queue = queue;
+
+ wl_tbm_queue_add_listener(queue, &wl_tbm_queue_listener, queue_info);
+
+ queue_info->width = width;
+ queue_info->height = height;
+ queue_info->format = format;
+ queue_info->flag = TBM_BO_TILED;
+ queue_info->queue_size = queue_size;
+
+ queue_info->tbm_queue = tbm_surface_queue_sequence_create(queue_size,
+ width, height, format, TBM_BO_TILED);
+ WL_TBM_GOTO_IF_FAIL(queue_info->tbm_queue != NULL, fail);
+
+ tbm_surface_queue_set_alloc_cb(queue_info->tbm_queue,
+ __wayland_tbm_client_surface_alloc_cb,
+ __wayland_tbm_client_surface_free_cb,
+ queue_info);
+
+ tbm_surface_queue_add_destroy_cb(queue_info->tbm_queue,
+ _handle_tbm_surface_queue_destroy_notify,
+ queue_info);
+
+ tbm_surface_queue_add_reset_cb(queue_info->tbm_queue,
+ _handle_tbm_surface_queue_reset_notify, queue_info);
+
+ tbm_surface_queue_add_can_dequeue_cb(queue_info->tbm_queue,
+ _handle_tbm_surface_queue_can_dequeue_notify, queue_info);
+
+ tbm_surface_queue_add_trace_cb(queue_info->tbm_queue,
+ _handle_tbm_surface_queue_trace_notify, queue_info);
+
+#ifdef DEBUG_TRACE
+ WL_TBM_C_LOG("INFO cur(%dx%d fmt:0x%x num:%d) new(%dx%d fmt:0x%x num:%d)",
+ queue_info->width, queue_info->height,
+ queue_info->format, queue_info->num_bufs,
+ width, height, format, queue_size);
+#endif
+
+ pthread_mutex_init(&queue_info->lock, NULL);
+
+ /* add queue_info to the list */
+ wl_list_insert(&tbm_client->queue_info_list, &queue_info->link);
+
+ return queue_info->tbm_queue;
+
+fail:
+ if (queue_info->wl_tbm_queue)
+ wl_tbm_queue_destroy(queue_info->wl_tbm_queue);
+ free(queue_info);
+ return NULL;
+}
+
struct wl_tbm_queue *
wayland_tbm_client_get_wl_tbm_queue(struct wayland_tbm_client *tbm_client, struct wl_surface *surface)
{