From e95be5f458e48a9eb5968fb98e6fc71f27804ff7 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 29 Jan 2018 09:53:31 +0900 Subject: [PATCH] capture: using thread_cb Change-Id: I9c2e914fb12d472aac1faf354e893a18c3b060e3 --- src/tdm.c | 4 +++ src/tdm_capture.c | 82 ++++++++++++++++++++++++++++++++----------------- src/tdm_private.h | 7 ++--- src/tdm_private_types.h | 2 -- src/tdm_thread.c | 12 +------- 5 files changed, 61 insertions(+), 46 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index a35bb4b..b81347d 100644 --- 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; diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 2ba0e5f..869e31f 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -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); diff --git a/src/tdm_private.h b/src/tdm_private.h index fb1886f..c19ceb4 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -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); diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index 85413c4..188d3fe 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -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 { diff --git a/src/tdm_thread.c b/src/tdm_thread.c index 0bd4e86..ff0d0c8 100644 --- a/src/tdm_thread.c +++ b/src/tdm_thread.c @@ -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); -- 2.7.4