correct email address
[platform/core/uifw/libtdm.git] / src / tdm_hwc_window.c
index 96d2698..c3619ed 100644 (file)
@@ -9,7 +9,7 @@
  *          Taeheon Kim <th908.kim@samsung.com>,
  *          YoungJun Cho <yj44.cho@samsung.com>,
  *          SooChan Lim <sc1.lim@samsung.com>,
- *          Boram Park <sc1.lim@samsung.com>
+ *          Boram Park <boram1288.park@samsung.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the
@@ -74,6 +74,7 @@
 tbm_surface_queue_h
 tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
        tbm_surface_queue_h queue = NULL;
 
@@ -81,12 +82,13 @@ tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_get_tbm_buffer_queue) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                if (error)
                        *error = TDM_ERROR_NOT_IMPLEMENTED;
                return NULL;
@@ -104,6 +106,7 @@ EXTERN tdm_error
 tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
                                                                        tdm_hwc_window_composition composition_type)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
 
        HWC_WINDOW_FUNC_ENTRY();
@@ -112,12 +115,13 @@ tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_set_composition_type) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -132,6 +136,7 @@ tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
 EXTERN tdm_error
 tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region damage)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
 
        HWC_WINDOW_FUNC_ENTRY();
@@ -140,12 +145,13 @@ tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region dama
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_set_buffer_damage) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -161,6 +167,7 @@ tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region dama
 EXTERN tdm_error
 tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
        char fmtstr[128];
 
@@ -170,12 +177,13 @@ tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_set_info) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -204,6 +212,7 @@ tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
 EXTERN tdm_error
 tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window;
 
        HWC_WINDOW_FUNC_ENTRY();
@@ -219,12 +228,13 @@ tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
                /* LCOV_EXCL_STOP */
        }
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_set_buffer) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -239,13 +249,15 @@ tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
 EXTERN tdm_error
 tdm_hwc_window_unset_buffer(tdm_hwc_window *hwc_window)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window;
 
        HWC_WINDOW_FUNC_ENTRY();
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_unset_buffer) {
                /* LCOV_EXCL_START */
@@ -267,7 +279,8 @@ tdm_hwc_window_create_internal(tdm_private_output *private_output, int is_video,
                                                                   tdm_error *error)
 {
        tdm_private_display *private_display = private_output->private_display;
-       tdm_func_output *func_output = &private_display->func_output;
+       tdm_private_module *private_module = private_output->private_module;
+       tdm_func_output *func_output = &private_module->func_output;
        tdm_private_hwc_window *private_hwc_window = NULL;
        tdm_hwc_window *hwc_window_backend = NULL;
        tdm_error ret = TDM_ERROR_NONE;
@@ -336,8 +349,8 @@ tdm_hwc_window_create_internal(tdm_private_output *private_output, int is_video,
 INTERN tdm_error
 tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
 {
-       tdm_private_display *private_display;
        tdm_private_output *private_output;
+       tdm_private_module *private_module;
        tdm_func_output *func_output;
 
        TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
@@ -345,12 +358,12 @@ tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
        if (!private_hwc_window)
                return TDM_ERROR_OPERATION_FAILED;
 
-       private_display = private_hwc_window->private_display;
        private_output = private_hwc_window->private_output;
+       private_module = private_output->private_module;
 
        LIST_DEL(&private_hwc_window->link);
 
-       func_output = &private_display->func_output;
+       func_output = &private_module->func_output;
        func_output->output_hwc_destroy_window(private_output->output_backend, private_hwc_window->hwc_window_backend);
 
        free(private_hwc_window);
@@ -360,18 +373,20 @@ tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
 EXTERN tdm_error
 tdm_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
 
        HWC_WINDOW_FUNC_ENTRY();
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_set_flags) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -386,18 +401,20 @@ tdm_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
 EXTERN tdm_error
 tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
 
        HWC_WINDOW_FUNC_ENTRY();
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_unset_flags) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -409,10 +426,122 @@ tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags
        return ret;
 }
 
+static void
+_tdm_hwc_window_layer_commit_handler(tdm_layer *layer, unsigned int sequence,
+                                                                                unsigned int tv_sec, unsigned int tv_usec,
+                                                                                void *user_data)
+{
+       tdm_private_hwc_window_commit_handler *hwc_window_commit_handler = (tdm_private_hwc_window_commit_handler *)user_data;
+       tdm_hwc_window_commit_handler func = hwc_window_commit_handler->func;
+       tdm_hwc_window *hwc_window = (tdm_hwc_window *)hwc_window_commit_handler->private_hwc_window;
+       void *data = hwc_window_commit_handler->user_data;
+
+       func(hwc_window, sequence, tv_sec, tv_usec, data);
+
+       free(hwc_window_commit_handler);
+}
+
+tdm_error
+tdm_hwc_window_commit(tdm_hwc_window *hwc_window, tdm_hwc_window_commit_handler func, void *user_data)
+{
+       tdm_private_module *private_module;
+       tdm_func_hwc_window *func_hwc_window = NULL;
+       tdm_private_hwc_window_commit_handler *hwc_window_commit_handler;
+       tdm_layer *layer = NULL;
+       tdm_private_layer *private_layer;
+       tdm_info_layer *info_layer;
+       tdm_hwc_window_info window_info;
+       tbm_surface_h buffer;
+
+       HWC_WINDOW_FUNC_ENTRY();
+
+       _pthread_mutex_lock(&private_display->lock);
+
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
+
+       if (!func_hwc_window->hwc_window_get_layer) {
+               /* LCOV_EXCL_START */
+               _pthread_mutex_unlock(&private_display->lock);
+               TDM_ERR("not implemented!!");
+               return TDM_ERROR_NOT_IMPLEMENTED;
+               /* LCOV_EXCL_STOP */
+       }
+
+       layer = func_hwc_window->hwc_window_get_layer(private_hwc_window->hwc_window_backend,
+                                                                                                                  &ret);
+       if (!layer) {
+               /* LCOV_EXCL_START */
+               _pthread_mutex_unlock(&private_display->lock);
+               TDM_ERR("no assigned layer!!");
+               return TDM_ERROR_INVALID_PARAMETER;
+               /* LCOV_EXCL_STOP */
+       }
+
+       private_layer = (tdm_private_layer*)layer;
+
+       buffer = func_hwc_window->hwc_window_get_buffer(private_hwc_window->hwc_window_backend,
+                                                                                                                  &ret);
+       if (buffer)
+               ret = tdm_layer_set_buffer_internal(private_layer, buffer);
+       else
+               ret = tdm_layer_unset_buffer_internal(private_layer);
+       if (ret != TDM_ERROR_NONE) {
+               /* LCOV_EXCL_START */
+               TDM_ERR("failed: layer set buffer(window)");
+               /* LCOV_EXCL_STOP */
+               return ret;
+       }
+
+       ret = func_hwc_window->hwc_window_get_info(private_hwc_window->hwc_window_backend,
+                                                                                                                  &window_info);
+       if (ret != TDM_ERROR_NONE) {
+               /* LCOV_EXCL_START */
+               TDM_ERR("failed: commit layer(window)");
+               /* LCOV_EXCL_STOP */
+               return ret;
+       }
+
+       info_layer = (tdm_info_layer *)&window_info;
+       ret = tdm_layer_set_info_internal(private_layer, info_layer);
+       if (ret != TDM_ERROR_NONE) {
+               /* LCOV_EXCL_START */
+               TDM_ERR("failed: layer set info(window)");
+               /* LCOV_EXCL_STOP */
+               return ret;
+       }
+
+       hwc_window_commit_handler = calloc(1, sizeof(tdm_private_hwc_window_commit_handler));
+       if (!hwc_window_commit_handler) {
+               /* LCOV_EXCL_START */
+               TDM_ERR("failed: alloc memory");
+               return TDM_ERROR_OUT_OF_MEMORY;
+               /* LCOV_EXCL_STOP */
+       }
+
+       hwc_window_commit_handler->private_hwc_window = private_hwc_window;
+       hwc_window_commit_handler->func = func;
+       hwc_window_commit_handler->user_data = user_data;
+
+       ret = tdm_layer_commit_internal(private_layer, _tdm_hwc_window_layer_commit_handler, hwc_window_commit_handler);
+       if (ret != TDM_ERROR_NONE) {
+               /* LCOV_EXCL_START */
+               TDM_ERR("failed: commit layer(window)");
+               free(hwc_window_commit_handler);
+               /* LCOV_EXCL_STOP */
+               return ret;
+       }
+
+       _pthread_mutex_unlock(&private_display->lock);
+
+       return ret;
+}
+
 EXTERN tdm_error
 tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
                                                                        tdm_hwc_window_video_capability *video_capability)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
 
        HWC_WINDOW_FUNC_ENTRY();
@@ -421,12 +550,13 @@ tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_video_get_capability) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -443,6 +573,7 @@ EXTERN tdm_error
 tdm_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
                                                                                          const tdm_prop **props, int *count)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
 
        HWC_WINDOW_FUNC_ENTRY();
@@ -452,12 +583,13 @@ tdm_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_video_get_available_properties) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -474,6 +606,7 @@ EXTERN tdm_error
 tdm_hwc_window_video_get_property(tdm_hwc_window *hwc_window,
                                                                        unsigned int id, tdm_value *value)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
 
        HWC_WINDOW_FUNC_ENTRY();
@@ -482,12 +615,13 @@ tdm_hwc_window_video_get_property(tdm_hwc_window *hwc_window,
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_video_get_property) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }
@@ -504,18 +638,20 @@ EXTERN tdm_error
 tdm_hwc_window_video_set_property(tdm_hwc_window *hwc_window,
                                                                        unsigned int id, tdm_value value)
 {
+       tdm_private_module *private_module;
        tdm_func_hwc_window *func_hwc_window = NULL;
 
        HWC_WINDOW_FUNC_ENTRY();
 
        _pthread_mutex_lock(&private_display->lock);
 
-       func_hwc_window = &private_display->func_hwc_window;
+       private_module = private_output->private_module;
+       func_hwc_window = &private_module->func_hwc_window;
 
        if (!func_hwc_window->hwc_window_video_set_property) {
                /* LCOV_EXCL_START */
                _pthread_mutex_unlock(&private_display->lock);
-               TDM_ERR("not implemented!!");
+               TDM_WRN("not implemented!!");
                return TDM_ERROR_NOT_IMPLEMENTED;
                /* LCOV_EXCL_STOP */
        }