tpl_tbm: Added reset callback for tbm_queue. 39/230139/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Tue, 31 Mar 2020 09:11:10 +0000 (18:11 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Wed, 8 Apr 2020 06:38:13 +0000 (15:38 +0900)
Change-Id: Ic9c331d82525ad05fae9818970f60ed6853907d5
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/tpl_tbm.c

index b38c7c5..cabdf9d 100644 (file)
@@ -21,6 +21,7 @@ struct _tpl_tbm_display {
 
 struct _tpl_tbm_surface {
        tbm_surface_queue_h tbm_queue;
+       tpl_bool_t need_reset;
 };
 
 static tpl_result_t
@@ -165,6 +166,22 @@ __tpl_tbm_display_get_buffer_from_native_pixmap(tpl_handle_t pixmap)
        return (tbm_surface_h)pixmap;
 }
 
+static void
+__cb_tbm_queue_reset_callback(tbm_surface_queue_h tbm_queue,
+                                                         void *data)
+{
+       tpl_tbm_surface_t *tpl_tbm_surface = (tpl_tbm_surface_t *)data;
+
+       if (!tpl_tbm_surface) {
+               TPL_ERR("Invalid parameter. tpl_tbm_surface(%p)", tpl_tbm_surface);
+               return;
+       }
+
+       TPL_LOG_B("TBM", "tbm_queue(%p) has been reset!", tbm_queue);
+
+       tpl_tbm_surface->need_reset = TPL_TRUE;
+}
+
 static tpl_result_t
 __tpl_tbm_surface_init(tpl_surface_t *surface)
 {
@@ -179,8 +196,15 @@ __tpl_tbm_surface_init(tpl_surface_t *surface)
 
        surface->backend.data = (void *)tpl_tbm_surface;
 
+       tpl_tbm_surface->need_reset = TPL_FALSE;
+
        tpl_tbm_surface->tbm_queue = (tbm_surface_queue_h)surface->native_handle;
 
+       /* Set reset_callback to tbm_queue */
+       tbm_surface_queue_add_reset_cb(tpl_tbm_surface->tbm_queue,
+                                                                  __cb_tbm_queue_reset_callback,
+                                                                  (void *)tpl_tbm_surface);
+
        TPL_LOG_B("TBM", "[INIT] tpl_surface(%p) tpl_tbm_surface_t(%p) tbm_surface_queue(%p)",
                          surface, tpl_tbm_surface, surface->native_handle);
 
@@ -252,7 +276,12 @@ __tpl_tbm_surface_enqueue_buffer(tpl_surface_t *surface,
 static tpl_bool_t
 __tpl_tbm_surface_validate(tpl_surface_t *surface)
 {
-       return TPL_TRUE;
+       tpl_tbm_surface_t *tpl_tbm_surface = (tpl_tbm_surface_t *)surface->backend.data;
+       tpl_bool_t ret = TPL_TRUE;
+
+       ret = !tpl_tbm_surface->need_reset;
+
+       return ret;
 }
 
 static tbm_surface_h
@@ -286,6 +315,8 @@ __tpl_tbm_surface_dequeue_buffer(tpl_surface_t *surface, uint64_t timeout_ns,
        /* It will be dec when before tbm_surface_queue_enqueue called */
        tbm_surface_internal_ref(tbm_surface);
 
+       tpl_tbm_surface->need_reset = TPL_FALSE;
+
        TPL_LOG_B("TBM", "[DEQ] tpl_surface(%p) tbm_queue(%p) tbm_surface(%p) bo(%d)",
                          surface, tpl_tbm_surface->tbm_queue, tbm_surface,
                          tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0)));