add tdm_output_set_mirror
[platform/core/uifw/libtdm.git] / src / tdm_output.c
index 8354d07..f4c818b 100644 (file)
@@ -429,7 +429,7 @@ tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_
        tdm_private_output *private_output = user_data;
        tdm_error ret;
 
-       TDM_INFO("output(%d) %s", private_output->pipe, tdm_status_str(dpms));
+       TDM_INFO("output(%d) %s", private_output->pipe, tdm_dpms_str(dpms));
 
        private_output->current_dpms_value = dpms;
        private_output->waiting_dpms_change = 0;
@@ -1630,8 +1630,11 @@ tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handl
 
        if (TDM_OUTPUT_DPMS_VSYNC_IS_OFF(dpms_value)) {
                TDM_WRN("dpms %s. Directly call commit handler instead of commit.", tdm_dpms_str(dpms_value));
-               if (func)
+               if (func) {
+                       _pthread_mutex_unlock(&private_display->lock);
                        func(output, 0, 0, 0, user_data);
+                       _pthread_mutex_lock(&private_display->lock);
+               }
        }
 
        return ret;
@@ -2024,6 +2027,52 @@ tdm_output_get_hwc(tdm_output *output, tdm_error *error)
        return private_hwc;
 }
 
+EXTERN tdm_error
+tdm_output_set_mirror(tdm_output *output, tdm_output *src_output, tdm_transform transform)
+{
+       /* LCOV_EXCL_START */
+       tdm_private_module *private_module;
+       tdm_func_output *func_output;
+       tdm_private_output *private_src_output;
+
+       OUTPUT_FUNC_ENTRY();
+
+       TDM_RETURN_VAL_IF_FAIL(src_output != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       _pthread_mutex_lock(&private_display->lock);
+
+       private_module = private_output->private_module;
+       func_output = &private_module->func_output;
+       private_src_output = (tdm_private_output*)src_output;
+
+       if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_MIRROR)) {
+               TDM_INFO("output(%d) doesn't support the mirror.", private_output->pipe);
+               _pthread_mutex_unlock(&private_display->lock);
+               return TDM_ERROR_BAD_REQUEST;
+       }
+
+       if (!func_output->output_set_mirror) {
+               TDM_WRN("not implemented!!");
+               _pthread_mutex_unlock(&private_display->lock);
+               return TDM_ERROR_NOT_IMPLEMENTED;
+       }
+
+       ret = func_output->output_set_mirror(private_output->output_backend,
+                                                                               private_src_output->output_backend,
+                                                                               transform);
+       if (ret != TDM_ERROR_NONE) {
+               TDM_ERR("output(%p) fails to set MIRROR.", private_output);
+               _pthread_mutex_unlock(&private_display->lock);
+               return TDM_ERROR_BAD_REQUEST;
+       }
+
+       _pthread_mutex_unlock(&private_display->lock);
+
+       /* LCOV_EXCL_STOP */
+
+       return ret;
+}
+
 INTERN tdm_error
 tdm_output_choose_commit_per_vblank_mode(tdm_private_output *private_output, int mode)
 {