client: add wayland_tbm_client_queue_get_surfaces 75/168975/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 29 Jan 2018 07:59:49 +0000 (16:59 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Thu, 1 Feb 2018 12:28:05 +0000 (21:28 +0900)
Change-Id: Id9f355013a57263f17a4d08d48192bb9575b48bf

src/wayland-tbm-client.c
src/wayland-tbm-client.h

index 504327f..0a36c0b 100644 (file)
@@ -1431,3 +1431,101 @@ wayland_tbm_client_queue_check_activate(struct wayland_tbm_client *tbm_client, t
 
        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;
+}
index b653f13..76d41f1 100644 (file)
@@ -84,6 +84,10 @@ wayland_tbm_client_set_event_queue(struct wayland_tbm_client *tbm_client, struct
 int
 wayland_tbm_client_queue_check_activate(struct wayland_tbm_client *tbm_client, tbm_surface_queue_h queue);
 
+int
+wayland_tbm_client_queue_get_surfaces(struct wayland_tbm_client *tbm_client,
+                                       tbm_surface_queue_h queue, tbm_surface_h *surfaces, int *num);
+
 #ifdef  __cplusplus
 }
 #endif