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 */
}
}
-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;
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)
/* 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;
}
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);
}
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);
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);
/* 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);