static tdm_private_display *g_private_display;
static pthread_mutex_t gLock = PTHREAD_MUTEX_INITIALIZER;
+/* gets called on behalf of the ecore-main-loop thread */
+INTERN tdm_error
+tdm_handle_need_validate_event(tdm_thread_cb_need_validate *ev)
+{
+ tdm_private_output *private_output;
+
+ TDM_RETURN_VAL_IF_FAIL(ev != NULL, TDM_ERROR_INVALID_PARAMETER);
+ TDM_RETURN_VAL_IF_FAIL(ev->o != NULL, TDM_ERROR_OPERATION_FAILED);
+
+ private_output = ev->o;
+
+ TDM_INFO("tdm-backend asks for revalidation for the output:%p.", private_output);
+
+ if (private_output->need_validate.hndl)
+ private_output->need_validate.hndl((tdm_output*)private_output);
+
+ return TDM_ERROR_NONE;
+}
+
+/* gets called on behalf of the tdm-thread */
+static tdm_error
+_need_validate_handler(int fd, tdm_event_loop_mask mask, void *user_data)
+{
+ tdm_thread_cb_need_validate ev;
+ tdm_private_output *private_output;
+ tdm_error ret;
+
+ private_output = (tdm_private_output *)user_data;
+
+ ev.base.type = TDM_THREAD_CB_NEED_VALIDATE;
+ ev.base.length = sizeof ev;
+ ev.o = private_output;
+
+ ret = tdm_thread_send_cb(private_output->private_display->private_loop, &ev.base);
+ TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE);
+
+ TDM_INFO("tdm-thread: get a 'need to revalidate' event for the ouptut:%p.", private_output);
+
+ /* who cares about this? */
+ return TDM_ERROR_NONE;
+}
+
+static void
+_tdm_backend_events_init(tdm_private_display *priv_dsp)
+{
+ tdm_private_output *o;
+ tdm_error err = TDM_ERROR_NONE;
+ int fd;
+
+ /* build in eventfd fds into event_loop listened & handled by the tdm-thread */
+ LIST_FOR_EACH_ENTRY(o, &priv_dsp->output_list, link) {
+ fd = eventfd(0, 0);
+ TDM_WARNING_IF_FAIL(fd >= 0);
+
+ tdm_event_loop_add_fd_handler(priv_dsp, fd, TDM_EVENT_LOOP_READABLE,
+ _need_validate_handler, o, &err);
+ TDM_WARNING_IF_FAIL(err == TDM_ERROR_NONE);
+
+ o->need_validate.event_fd = fd;
+
+ TDM_INFO("register an output:%p for the revalidation, event_fd:%d.", o, fd);
+ }
+}
+
static tdm_error
_tdm_display_check_module(tdm_backend_module *module)
{
private_display->init_count = 1;
private_display->commit_type = TDM_COMMIT_TYPE_NONE;
+ if (private_display->hwc_enable)
+ _tdm_backend_events_init(private_display);
+
g_private_display = private_display;
if (error)