capture: using thread_cb 40/170540/5
authorBoram Park <boram1288.park@samsung.com>
Mon, 29 Jan 2018 00:53:31 +0000 (09:53 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 21 Feb 2018 00:44:08 +0000 (09:44 +0900)
Change-Id: I9c2e914fb12d472aac1faf354e893a18c3b060e3

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

index a35bb4b..b81347d 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -978,6 +978,10 @@ tdm_display_init(tdm_error *error)
        if (ret != TDM_ERROR_NONE)
                goto failed_load;
 
+       ret = tdm_capture_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 2ba0e5f..869e31f 100644 (file)
@@ -97,34 +97,19 @@ _tdm_capture_find_buffer(struct list_head *list, tdm_capture_private_buffer *cap
        return NULL;
 }
 
-INTERN void
-tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer,
-                                       void *user_data)
+static void
+_tdm_capture_thread_cb_done(tdm_private_display *private_display, void *object, tdm_thread_cb_base *cb_base, void *user_data)
 {
-       tdm_private_capture *private_capture = user_data;
-       tdm_private_display *private_display = private_capture->private_display;
+       tdm_thread_cb_capture_done *capture_done = (tdm_thread_cb_capture_done *)cb_base;
+       tdm_private_capture *private_capture = object;
        tdm_capture_private_buffer *capture_buffer = NULL, *first_entry = NULL;
+       tbm_surface_h buffer;
 
        TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
 
-       if (private_capture->owner_tid != syscall(SYS_gettid)) {
-               tdm_thread_cb_capture_done capture_done;
-               tdm_error ret;
-
-               capture_done.base.type = TDM_THREAD_CB_CAPTURE_DONE;
-               capture_done.base.length = sizeof capture_done;
-               capture_done.capture_stamp = private_capture->stamp;
-               capture_done.buffer = buffer;
-               capture_done.user_data = user_data;
-
-               ret = tdm_thread_send_cb(private_display->private_loop, &capture_done.base);
-               TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
-
-               return;
-       }
+       assert(private_capture->owner_tid == syscall(SYS_gettid));
 
-       if (private_capture->owner_tid != syscall(SYS_gettid))
-               TDM_NEVER_GET_HERE();
+       buffer = capture_done->buffer;
 
        if (tdm_debug_dump & TDM_DUMP_FLAG_CAPTURE) {
                /* LCOV_EXCL_START */
@@ -165,8 +150,29 @@ tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer,
        }
 }
 
-INTERN tdm_private_capture *
-tdm_capture_find_stamp(tdm_private_display *private_display, double stamp)
+static void
+_tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, void *user_data)
+{
+       tdm_private_capture *private_capture = user_data;
+       tdm_thread_cb_capture_done capture_done;
+       tdm_error ret;
+
+       TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
+
+       memset(&capture_done, 0, sizeof capture_done);
+       capture_done.base.type = TDM_THREAD_CB_CAPTURE_DONE;
+       capture_done.base.length = sizeof capture_done;
+       capture_done.base.object_stamp = private_capture->stamp;
+       capture_done.base.data = NULL;
+       capture_done.base.sync = 0;
+       capture_done.buffer = buffer;
+
+       ret = tdm_thread_cb_call(private_capture, &capture_done.base);
+       TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
+}
+
+static void *
+_tdm_capture_find_object(tdm_private_display *private_display, double stamp)
 {
        tdm_private_capture *private_capture = NULL;
 
@@ -180,6 +186,14 @@ tdm_capture_find_stamp(tdm_private_display *private_display, double stamp)
        return NULL;
 }
 
+INTERN tdm_error
+tdm_capture_init(tdm_private_display *private_display)
+{
+       tdm_thread_cb_set_find_func(TDM_THREAD_CB_CAPTURE_DONE, _tdm_capture_find_object);
+
+       return TDM_ERROR_NONE;
+}
+
 INTERN tdm_private_capture *
 tdm_capture_create_output_internal(tdm_private_output *private_output,
                                                                   tdm_error *error)
@@ -232,12 +246,22 @@ tdm_capture_create_output_internal(tdm_private_output *private_output,
                /* LCOV_EXCL_STOP */
        }
 
-       ret = func_capture->capture_set_done_handler(capture_backend,
-                       tdm_capture_cb_done, private_capture);
+       ret = tdm_thread_cb_add(private_capture, TDM_THREAD_CB_CAPTURE_DONE, NULL, _tdm_capture_thread_cb_done, NULL);
+       if (ret != TDM_ERROR_NONE) {
+               TDM_ERR("capture tdm_thread_cb_add failed");
+               func_capture->capture_destroy(capture_backend);
+               free(private_capture);
+               if (error)
+                       *error = ret;
+               return NULL;
+       }
+
+       ret = func_capture->capture_set_done_handler(capture_backend, _tdm_capture_cb_done, private_capture);
        if (ret != TDM_ERROR_NONE) {
                /* LCOV_EXCL_START */
                TDM_ERR("capture(%p) set capture_done_handler failed", private_capture);
                func_capture->capture_destroy(capture_backend);
+               free(private_capture);
                if (error)
                        *error = ret;
                return NULL;
@@ -245,7 +269,7 @@ tdm_capture_create_output_internal(tdm_private_output *private_output,
        }
 
        private_capture->stamp = tdm_helper_get_time();
-       while (tdm_capture_find_stamp(private_display, private_capture->stamp))
+       while (_tdm_capture_find_object(private_display, private_capture->stamp))
                private_capture->stamp++;
 
        LIST_ADD(&private_capture->link, &private_output->capture_list);
@@ -313,7 +337,7 @@ tdm_capture_create_layer_internal(tdm_private_layer *private_layer,
        }
 
        private_capture->stamp = tdm_helper_get_time();
-       while (tdm_capture_find_stamp(private_display, private_capture->stamp))
+       while (_tdm_capture_find_object(private_display, private_capture->stamp))
                private_capture->stamp++;
 
        LIST_ADD(&private_capture->link, &private_layer->capture_list);
@@ -353,6 +377,8 @@ tdm_capture_destroy_internal(tdm_private_capture *private_capture)
 
        private_display = private_capture->private_display;
 
+       tdm_thread_cb_remove(private_capture, TDM_THREAD_CB_CAPTURE_DONE, NULL, _tdm_capture_thread_cb_done, NULL);
+
        LIST_DEL(&private_capture->link);
        LIST_DEL(&private_capture->display_link);
 
index fb1886f..c19ceb4 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_capture *
-tdm_capture_find_stamp(tdm_private_display *private_display, double stamp);
 
 int
 tdm_output_is_valid(tdm_output *output);
@@ -148,9 +146,6 @@ tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h bu
 tdm_error
 tdm_layer_unset_buffer_internal(tdm_private_layer *private_layer);
 
-void
-tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer,
-                                       void *user_data);
 tdm_error
 tdm_vblank_init(tdm_display *dpy);
 void
@@ -188,6 +183,8 @@ tdm_hwc_window_create_internal(tdm_private_output *private_output, int is_video,
 tdm_error
 tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window);
 
+tdm_error
+tdm_capture_init(tdm_private_display *private_display);
 tdm_private_capture *
 tdm_capture_create_output_internal(tdm_private_output *private_output,
                                                                   tdm_error *error);
index 85413c4..188d3fe 100644 (file)
@@ -493,9 +493,7 @@ struct _tdm_thread_cb_pp_done {
 
 struct _tdm_thread_cb_capture_done {
        tdm_thread_cb_base base;
-       double capture_stamp;
        tbm_surface_h buffer;
-       void *user_data;
 };
 
 struct _tdm_thread_cb_vblank_sw {
index 0bd4e86..ff0d0c8 100644 (file)
@@ -472,19 +472,9 @@ tdm_thread_handle_cb(tdm_private_loop *private_loop)
                        /* LCOV_EXCL_STOP */
                }
                case TDM_THREAD_CB_PP_DONE:
+               case TDM_THREAD_CB_CAPTURE_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 =
-                               tdm_capture_find_stamp(private_loop->dpy, capture_done->capture_stamp);
-                       if (!capture_backend) {
-                               TDM_WRN("no capture(%f)", capture_done->capture_stamp);
-                               break;
-                       }
-                       tdm_capture_cb_done(capture_backend, capture_done->buffer, capture_done->user_data);
-                       break;
-               }
                case TDM_THREAD_CB_VBLANK_SW: {
                        tdm_thread_cb_vblank_sw *vblank_sw = (tdm_thread_cb_vblank_sw*)base;
                        tdm_vblank_cb_vblank_SW(NULL, vblank_sw->vblank_stamp);