return 0;
}
+
+int
+wayland_tbm_client_queue_get_surfaces(struct wayland_tbm_client *tbm_client,
+ tbm_surface_queue_h queue, tbm_surface_h *surfaces, int *num)
+{
+ struct wayland_tbm_surface_queue *queue_info = NULL;
+ tbm_surface_h surface = NULL;
+ struct wayland_tbm_buffer *buffer = NULL;
+ tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
+ tbm_surface_h *get_surfaces;
+ int get_num = 0, dequeued_num = 0, index = 0;
+ int i;
+
+ WL_TBM_RETURN_VAL_IF_FAIL(tbm_client != NULL, 0);
+ WL_TBM_RETURN_VAL_IF_FAIL(queue != NULL, 0);
+
+ queue_info = _wayland_tbm_client_find_queue_info_queue(tbm_client, queue);
+ WL_TBM_RETURN_VAL_IF_FAIL(queue_info != NULL, 0);;
+
+ if (!surfaces && !num) {
+ WL_TBM_LOG_E("invalid parameter");
+ return 0;
+ }
+
+ if (num) {
+ if (queue_info->is_active && queue_info->active_flush)
+ *num = wl_list_length(&queue_info->attach_bufs);
+ else
+ *num = queue_info->queue_size;
+ }
+
+ if (surface) {
+ if (queue_info->is_active && queue_info->active_flush) {
+ wl_list_for_each(buffer, &queue_info->attach_bufs, link) {
+ surfaces[index] = buffer->tbm_surface;
+ index++;
+ }
+ } else {
+ get_surfaces = (tbm_surface_h *)calloc(queue_info->queue_size, sizeof(tbm_surface_h));
+ if (!get_surfaces) {
+ WL_TBM_LOG_E("failed to alloc get_surfaces");
+ goto fail;
+ }
+
+ tsq_err = tbm_surface_queue_get_surfaces(queue, get_surfaces, &get_num);
+ if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) {
+ WL_TBM_LOG_E("failed to tbm_surface_queue_get_surfaces");
+ goto fail;
+ }
+
+ for (i = 0; i < get_num; i++) {
+ surfaces[index] = get_surfaces[i];
+ index++;
+ }
+
+ if (get_num < queue_info->queue_size) {
+ for (i = 0; i < queue_info->queue_size - get_num; i++) {
+ tsq_err = tbm_surface_queue_dequeue(queue, &surface);
+ if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) {
+ WL_TBM_LOG_E("failed to tbm_surface_queue_dequeue");
+ goto fail;
+ }
+
+ dequeued_num++;
+ surfaces[index] = surface;
+ index++;
+ }
+ }
+
+ for (i = 0; i < dequeued_num; i++) {
+ tsq_err = tbm_surface_queue_release(queue, surfaces[get_num + i]);
+ if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
+ WL_TBM_LOG_E("failed to tbm_surface_queue_release");
+ }
+
+ if (get_surfaces)
+ free(get_surfaces);
+ }
+ }
+
+ return 1;
+
+fail:
+ if (num) *num = 0;
+
+ if (surfaces) {
+ for (i = 0; i < dequeued_num; i++) {
+ tsq_err = tbm_surface_queue_release(queue, surfaces[get_num + i]);
+ if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
+ WL_TBM_LOG_E("failed to tbm_surface_queue_release");
+ }
+
+ if (get_surfaces)
+ free(get_surfaces);
+ }
+
+ return 0;
+}