For tiled format, Add new function 90/200990/6
authorXuelian Bai <xuelian.bai@samsung.com>
Thu, 7 Mar 2019 12:27:25 +0000 (20:27 +0800)
committerchangyeon lee <cyeon.lee@samsung.com>
Fri, 22 Mar 2019 04:50:10 +0000 (04:50 +0000)
 wayland_tbm_client_create_surface_queue_tiled

Change-Id: I4e248a292ec51f0451fbcc5ac20bbe07828fdea0

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

index 85fce87..f8edafe 100644 (file)
@@ -667,7 +667,7 @@ wayland_tbm_client_create_buffer(struct wayland_tbm_client *tbm_client,
        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;
 
@@ -1631,6 +1631,86 @@ fail:
        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)
 {
index b68a65f..7589b9a 100644 (file)
@@ -75,6 +75,12 @@ wayland_tbm_client_create_surface_queue(struct wayland_tbm_client *tbm_client,
                                        int queue_size,
                                        int width, int height, tbm_format format);
 
+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 wl_tbm_queue *
 wayland_tbm_client_get_wl_tbm_queue(struct wayland_tbm_client *tbm_client, struct wl_surface *surface);