[hwc] add the ability to ask a client(E20) about the revalidation
[platform/core/uifw/libtdm.git] / src / tdm.c
index 315b027..cb397b8 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -669,6 +669,70 @@ int tdm_debug_dump;
 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)
 {
@@ -1008,6 +1072,9 @@ tdm_display_init(tdm_error *error)
        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)