X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftdm_hwc_window.c;h=97169e188bf50a261f3dc8f2ba3bdf0b9023e419;hb=baa55bfdbc3876a956816e46ef996fdffd7b8248;hp=91191b81e94b9726ed6cabe5e52220c7bf907151;hpb=fd490a7e890fd9c1dac8f41d78c1f961548cd9e2;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/src/tdm_hwc_window.c b/src/tdm_hwc_window.c index 91191b8..97169e1 100644 --- a/src/tdm_hwc_window.c +++ b/src/tdm_hwc_window.c @@ -37,10 +37,7 @@ #include "config.h" #endif -#include "tdm.h" -#include "tdm_backend.h" #include "tdm_private.h" -#include "tdm_helper.h" #define COUNT_MAX 10 @@ -77,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; @@ -84,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,49 +103,25 @@ tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error } EXTERN tdm_error -tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, uint32_t zpos) -{ - 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; - - if (!func_hwc_window->hwc_window_set_zpos) { - /* LCOV_EXCL_START */ - _pthread_mutex_unlock(&private_display->lock); - TDM_ERR("not implemented!!"); - return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_STOP */ - } - - ret = func_hwc_window->hwc_window_set_zpos(private_hwc_window->hwc_window_backend, zpos); - if (ret == TDM_ERROR_NONE) - private_hwc_window->zpos = zpos; - - _pthread_mutex_unlock(&private_display->lock); - - return ret; -} - -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(); + TDM_RETURN_VAL_IF_FAIL(composition_type >= TDM_COMPOSITION_NONE, TDM_ERROR_INVALID_PARAMETER); + TDM_RETURN_VAL_IF_FAIL(composition_type <= TDM_COMPOSITION_VIDEO, TDM_ERROR_INVALID_PARAMETER); _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 */ } @@ -161,18 +136,22 @@ 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(); + if (damage.num_rects > 0) + TDM_RETURN_VAL_IF_FAIL(damage.rects != NULL, TDM_ERROR_INVALID_PARAMETER); _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 */ } @@ -188,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]; @@ -197,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 */ } @@ -228,31 +209,10 @@ tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info) return ret; } -/* LCOV_EXCL_START */ -static void -_tdm_window_dump_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer) -{ - tdm_private_hwc_window *private_window = (tdm_private_hwc_window *)hwc_window; - tdm_private_output *private_output = private_window->private_output; - unsigned int pipe; - uint32_t zpos; - char fname[PATH_MAX]; - - pipe = private_output->pipe; - zpos = private_window->zpos; - - snprintf(fname, sizeof(fname), "tdm_%d_win_%d", pipe, zpos); - - tbm_surface_internal_dump_buffer(buffer, fname); - TDM_DBG("%s dump excute", fname); - - return; -} -/* LCOV_EXCL_STOP */ - 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(); @@ -263,28 +223,22 @@ tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer) /* LCOV_EXCL_START */ char str[TDM_PATH_LEN]; static int i; - snprintf(str, TDM_PATH_LEN, "window_%d_%d_%03d", - private_output->index, private_hwc_window->zpos, i++); + snprintf(str, TDM_PATH_LEN, "window_%d_%03d", private_output->index, i++); tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str); /* 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 */ } - /* dump buffer */ - /* LCOV_EXCL_START */ - if (tdm_dump_enable && buffer) - _tdm_window_dump_buffer(hwc_window, buffer); - /* LCOV_EXCL_STOP */ - ret = func_hwc_window->hwc_window_set_buffer(private_hwc_window->hwc_window_backend, buffer); _pthread_mutex_unlock(&private_display->lock); @@ -292,35 +246,82 @@ tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer) return ret; } +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); + + 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 */ + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("not implemented!!"); + return TDM_ERROR_NOT_IMPLEMENTED; + /* LCOV_EXCL_STOP */ + } + + ret = func_hwc_window->hwc_window_unset_buffer(private_hwc_window->hwc_window_backend); + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + INTERN tdm_hwc_window * -tdm_hwc_window_create_internal(tdm_private_output *private_output, +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; TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL); - if (!func_output->output_hwc_create_window) { - /* LCOV_EXCL_START */ - if (error) - *error = TDM_ERROR_BAD_MODULE; - return NULL; - /* LCOV_EXCL_STOP */ - } + if (!is_video) { + if (!func_output->output_hwc_create_window) { + /* LCOV_EXCL_START */ + if (error) + *error = TDM_ERROR_BAD_MODULE; + return NULL; + /* LCOV_EXCL_STOP */ + } - hwc_window_backend = func_output->output_hwc_create_window( + hwc_window_backend = func_output->output_hwc_create_window( private_output->output_backend, &ret); - if (ret != TDM_ERROR_NONE) { - if (error) - *error = ret; - return NULL; + if (ret != TDM_ERROR_NONE) { + if (error) + *error = ret; + return NULL; + } + } else { + if (!func_output->output_hwc_create_video_window) { + /* LCOV_EXCL_START */ + if (error) + *error = TDM_ERROR_NOT_IMPLEMENTED; + return NULL; + /* LCOV_EXCL_STOP */ + } + + hwc_window_backend = func_output->output_hwc_create_video_window( + private_output->output_backend, &ret); + if (ret != TDM_ERROR_NONE) { + if (error) + *error = ret; + return NULL; + } } - private_hwc_window = calloc(1, sizeof(tdm_private_capture)); + private_hwc_window = calloc(1, sizeof(tdm_private_hwc_window)); if (!private_hwc_window) { /* LCOV_EXCL_START */ TDM_ERR("failed: alloc memory"); @@ -348,8 +349,8 @@ tdm_hwc_window_create_internal(tdm_private_output *private_output, 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); @@ -357,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); @@ -372,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 */ } @@ -398,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 */ } @@ -421,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(); @@ -433,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 */ } @@ -455,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(); @@ -464,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 */ } @@ -486,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(); @@ -494,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 */ } @@ -516,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 */ }