pp: using thread_cb 39/170539/5
authorBoram Park <boram1288.park@samsung.com>
Mon, 29 Jan 2018 00:53:05 +0000 (09:53 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 21 Feb 2018 00:44:08 +0000 (09:44 +0900)
Change-Id: I02bdd31434f95ff5c249e839442fd397afaffdef

src/tdm.c
src/tdm_pp.c
src/tdm_private.h
src/tdm_private_types.h
src/tdm_thread.c

index 2536479..a35bb4b 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -974,6 +974,10 @@ tdm_display_init(tdm_error *error)
        TDM_INFO("event loop init time: %.3f ms", (stamp2 - stamp1) * 1000.0);
        stamp1 = stamp2;
 
+       ret = tdm_pp_init(private_display);
+       if (ret != TDM_ERROR_NONE)
+               goto failed_load;
+
        ret = _tdm_display_load_module(private_display);
        if (ret != TDM_ERROR_NONE)
                goto failed_load;
index 6e1dafd..8f4fd8d 100644 (file)
@@ -68,7 +68,7 @@ _tdm_pp_print_list(struct list_head *list)
                        break;
        }
 
-       TDM_WRN("\t %s", str);
+       TDM_INFO("\t %s", str);
 }
 
 static tdm_pp_private_buffer *
@@ -97,35 +97,21 @@ _tdm_pp_find_buffer(struct list_head *list, tdm_pp_private_buffer *pp_buffer)
        return NULL;
 }
 
-INTERN void
-tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst,
-                          void *user_data)
+static void
+_tdm_pp_thread_cb_done(tdm_private_display *private_display, void *object, tdm_thread_cb_base *cb_base, void *user_data)
 {
-       tdm_private_pp *private_pp = user_data;
-       tdm_private_display *private_display = private_pp->private_display;
+       tdm_thread_cb_pp_done *pp_done = (tdm_thread_cb_pp_done *)cb_base;
+       tdm_private_pp *private_pp = object;
        tdm_pp_private_buffer *pp_buffer = NULL, *first_entry = NULL;
+       tbm_surface_h src;
+       tbm_surface_h dst;
 
        TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
 
-       if (private_pp->owner_tid != syscall(SYS_gettid)) {
-               tdm_thread_cb_pp_done pp_done;
-               tdm_error ret;
-
-               pp_done.base.type = TDM_THREAD_CB_PP_DONE;
-               pp_done.base.length = sizeof pp_done;
-               pp_done.pp_stamp = private_pp->stamp;
-               pp_done.src = src;
-               pp_done.dst = dst;
-               pp_done.user_data = user_data;
-
-               ret = tdm_thread_send_cb(private_display->private_loop, &pp_done.base);
-               TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
-
-               return;
-       }
+       assert(private_pp->owner_tid == syscall(SYS_gettid));
 
-       if (private_pp->owner_tid != syscall(SYS_gettid))
-               TDM_NEVER_GET_HERE();
+       src = pp_done->src;
+       dst = pp_done->dst;
 
        if (tdm_debug_dump & TDM_DUMP_FLAG_PP) {
                /* LCOV_EXCL_START */
@@ -167,8 +153,30 @@ tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst,
        }
 }
 
-INTERN tdm_private_pp *
-tdm_pp_find_stamp(tdm_private_display *private_display, double stamp)
+static void
+_tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, void *user_data)
+{
+       tdm_thread_cb_pp_done pp_done;
+       tdm_private_pp *private_pp = user_data;
+       tdm_error ret;
+
+       TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
+
+       memset(&pp_done, 0, sizeof pp_done);
+       pp_done.base.type = TDM_THREAD_CB_PP_DONE;
+       pp_done.base.length = sizeof pp_done;
+       pp_done.base.object_stamp = private_pp->stamp;
+       pp_done.base.data = NULL;
+       pp_done.base.sync = 0;
+       pp_done.src = src;
+       pp_done.dst = dst;
+
+       ret = tdm_thread_cb_call(private_pp, &pp_done.base);
+       TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
+}
+
+static void *
+_tdm_pp_find_object(tdm_private_display *private_display, double stamp)
 {
        tdm_private_pp *private_pp = NULL;
 
@@ -182,6 +190,14 @@ tdm_pp_find_stamp(tdm_private_display *private_display, double stamp)
        return NULL;
 }
 
+INTERN tdm_error
+tdm_pp_init(tdm_private_display *private_display)
+{
+       tdm_thread_cb_set_find_func(TDM_THREAD_CB_PP_DONE, _tdm_pp_find_object);
+
+       return TDM_ERROR_NONE;
+}
+
 INTERN tdm_private_pp *
 tdm_pp_create_internal(tdm_private_display *private_display, tdm_error *error)
 {
@@ -225,11 +241,22 @@ tdm_pp_create_internal(tdm_private_display *private_display, tdm_error *error)
                /* LCOV_EXCL_STOP */
        }
 
-       ret = func_pp->pp_set_done_handler(pp_backend, tdm_pp_cb_done, private_pp);
+       ret = tdm_thread_cb_add(private_pp, TDM_THREAD_CB_PP_DONE, NULL, _tdm_pp_thread_cb_done, NULL);
+       if (ret != TDM_ERROR_NONE) {
+               TDM_ERR("pp tdm_thread_cb_add failed");
+               func_pp->pp_destroy(pp_backend);
+               free(private_pp);
+               if (error)
+                       *error = ret;
+               return NULL;
+       }
+
+       ret = func_pp->pp_set_done_handler(pp_backend, _tdm_pp_cb_done, private_pp);
        if (ret != TDM_ERROR_NONE) {
                /* LCOV_EXCL_START */
                TDM_ERR("spp(%p) et pp_done_handler failed", private_pp);
                func_pp->pp_destroy(pp_backend);
+               free(private_pp);
                if (error)
                        *error = ret;
                return NULL;
@@ -237,7 +264,7 @@ tdm_pp_create_internal(tdm_private_display *private_display, tdm_error *error)
        }
 
        private_pp->stamp = tdm_helper_get_time();
-       while (tdm_pp_find_stamp(private_display, private_pp->stamp))
+       while (_tdm_pp_find_object(private_display, private_pp->stamp))
                private_pp->stamp++;
 
        LIST_ADD(&private_pp->link, &private_display->pp_list);
@@ -267,6 +294,8 @@ tdm_pp_destroy_internal(tdm_private_pp *private_pp)
        if (!private_pp)
                return;
 
+       tdm_thread_cb_remove(private_pp, TDM_THREAD_CB_PP_DONE, NULL, _tdm_pp_thread_cb_done, NULL);
+
        private_display = private_pp->private_display;
        func_pp = &private_display->func_pp;
 
index f04eebb..fb1886f 100644 (file)
@@ -92,8 +92,6 @@ tdm_display_check_module_abi(tdm_private_display *private_display, int abimaj, i
 
 tdm_private_output *
 tdm_display_find_output_stamp(tdm_private_display *private_display, double stamp);
-tdm_private_pp *
-tdm_pp_find_stamp(tdm_private_display *private_display, double stamp);
 tdm_private_capture *
 tdm_capture_find_stamp(tdm_private_display *private_display, double stamp);
 
@@ -151,9 +149,6 @@ tdm_error
 tdm_layer_unset_buffer_internal(tdm_private_layer *private_layer);
 
 void
-tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst,
-                          void *user_data);
-void
 tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer,
                                        void *user_data);
 tdm_error
@@ -181,6 +176,8 @@ tdm_output_call_change_handler_internal(tdm_private_output *private_output,
                                                                                tdm_output_change_type type,
                                                                                tdm_value value);
 
+tdm_error
+tdm_pp_init(tdm_private_display *private_display);
 tdm_private_pp *
 tdm_pp_create_internal(tdm_private_display *private_display, tdm_error *error);
 void
index a4ac11d..85413c4 100644 (file)
@@ -487,10 +487,8 @@ struct _tdm_thread_cb_output_dpms {
 
 struct _tdm_thread_cb_pp_done {
        tdm_thread_cb_base base;
-       double pp_stamp;
        tbm_surface_h src;
        tbm_surface_h dst;
-       void *user_data;
 };
 
 struct _tdm_thread_cb_capture_done {
index 5b7f00e..0bd4e86 100644 (file)
@@ -471,17 +471,9 @@ tdm_thread_handle_cb(tdm_private_loop *private_loop)
                        break;
                        /* LCOV_EXCL_STOP */
                }
-               case TDM_THREAD_CB_PP_DONE: {
-                       tdm_thread_cb_pp_done *pp_done = (tdm_thread_cb_pp_done*)base;
-                       tdm_pp *pp_backend =
-                               tdm_pp_find_stamp(private_loop->dpy, pp_done->pp_stamp);
-                       if (!pp_backend) {
-                               TDM_WRN("no pp(%f)", pp_done->pp_stamp);
-                               break;
-                       }
-                       tdm_pp_cb_done(pp_backend, pp_done->src, pp_done->dst, pp_done->user_data);
+               case TDM_THREAD_CB_PP_DONE:
+                       tdm_thread_cb_call(NULL, base);
                        break;
-               }
                case TDM_THREAD_CB_CAPTURE_DONE: {
                        tdm_thread_cb_capture_done *capture_done = (tdm_thread_cb_capture_done*)base;
                        tdm_capture *capture_backend =