X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftdm_backend.c;h=7d469d17b15ace9e81e612e935124ef8e6d8ff53;hb=9c947c16a27e74229f34c29093dce9822ae63e5b;hp=f8d36d3ad9a9ebf7550cca7ca7389e41c256bc95;hpb=339d56bf5152ae317d7ddd458c042ba632003a23;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/src/tdm_backend.c b/src/tdm_backend.c index f8d36d3..7d469d1 100644 --- a/src/tdm_backend.c +++ b/src/tdm_backend.c @@ -9,7 +9,7 @@ * Taeheon Kim , * YoungJun Cho , * SooChan Lim , - * Boram Park + * Boram Park * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the @@ -37,8 +37,6 @@ #include "config.h" #endif -#include "tdm.h" -#include "tdm_backend.h" #include "tdm_private.h" #define BACKEND_FUNC_ENTRY() \ @@ -46,6 +44,11 @@ TDM_RETURN_VAL_IF_FAIL(dpy != NULL, TDM_ERROR_INVALID_PARAMETER); \ private_display = (tdm_private_display*)dpy; +#define BACKEND_FUNC_ENTRY_VOID() \ + tdm_private_display *private_display; \ + TDM_RETURN_IF_FAIL(dpy != NULL); \ + private_display = (tdm_private_display*)dpy; + static int _check_abi_version(tdm_backend_module *module, int abimaj, int abimin) { @@ -75,12 +78,14 @@ tdm_backend_register_func_display(tdm_display *dpy, TDM_RETURN_VAL_IF_FAIL(func_display != NULL, TDM_ERROR_INVALID_PARAMETER); + assert(private_display->current_module); + /* the ABI version of backend module should be more than 1.1 */ - module = private_display->module_data; + module = private_display->current_module->module_data; if (_check_abi_version(module, 1, 1) < 0) return TDM_ERROR_BAD_MODULE; - private_display->func_display = *func_display; + private_display->current_module->func_display = *func_display; return TDM_ERROR_NONE; } @@ -96,12 +101,14 @@ tdm_backend_register_func_output(tdm_display *dpy, tdm_func_output *func_output) TDM_RETURN_VAL_IF_FAIL(func_output != NULL, TDM_ERROR_INVALID_PARAMETER); + assert(private_display->current_module); + /* the ABI version of backend module should be more than 1.1 */ - module = private_display->module_data; + module = private_display->current_module->module_data; if (_check_abi_version(module, 1, 1) < 0) return TDM_ERROR_BAD_MODULE; - private_display->func_output = *func_output; + private_display->current_module->func_output = *func_output; return TDM_ERROR_NONE; } @@ -117,12 +124,37 @@ tdm_backend_register_func_layer(tdm_display *dpy, tdm_func_layer *func_layer) TDM_RETURN_VAL_IF_FAIL(func_layer != NULL, TDM_ERROR_INVALID_PARAMETER); + assert(private_display->current_module); + /* the ABI version of backend module should be more than 1.1 */ - module = private_display->module_data; + module = private_display->current_module->module_data; if (_check_abi_version(module, 1, 1) < 0) return TDM_ERROR_BAD_MODULE; - private_display->func_layer = *func_layer; + private_display->current_module->func_layer = *func_layer; + + return TDM_ERROR_NONE; +} + +/* LCOV_EXCL_START */ +EXTERN tdm_error +tdm_backend_register_func_hwc(tdm_display *dpy, tdm_func_hwc *func_hwc) +{ + tdm_backend_module *module; + + TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED); + + BACKEND_FUNC_ENTRY(); + + TDM_RETURN_VAL_IF_FAIL(func_hwc != NULL, TDM_ERROR_INVALID_PARAMETER); + + assert(private_display->current_module); + + module = private_display->current_module->module_data; + if (_check_abi_version(module, 2, 0) < 0) + return TDM_ERROR_BAD_MODULE; + + private_display->current_module->func_hwc = *func_hwc; return TDM_ERROR_NONE; } @@ -138,17 +170,17 @@ tdm_backend_register_func_hwc_window(tdm_display *dpy, tdm_func_hwc_window *func TDM_RETURN_VAL_IF_FAIL(func_hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER); - module = private_display->module_data; - /* FIX ME: - Temporarily, we set the version of hwc window to 1.1 for the development. - Originally the hwc window version is 2.0. */ - if (_check_abi_version(module, 1, 1) < 0) + assert(private_display->current_module); + + module = private_display->current_module->module_data; + if (_check_abi_version(module, 2, 0) < 0) return TDM_ERROR_BAD_MODULE; - private_display->func_hwc_window = *func_hwc_window; + private_display->current_module->func_hwc_window = *func_hwc_window; return TDM_ERROR_NONE; } +/* LCOV_EXCL_STOP */ EXTERN tdm_error tdm_backend_register_func_pp(tdm_display *dpy, tdm_func_pp *func_pp) @@ -160,8 +192,15 @@ tdm_backend_register_func_pp(tdm_display *dpy, tdm_func_pp *func_pp) if (!func_pp) return TDM_ERROR_NONE; - private_display->capabilities |= TDM_DISPLAY_CAPABILITY_PP; - private_display->func_pp = *func_pp; + assert(private_display->current_module); + + private_display->current_module->capabilities |= TDM_DISPLAY_CAPABILITY_PP; + private_display->current_module->func_pp = *func_pp; + + if (!private_display->pp_module) + private_display->pp_module = private_display->current_module; + else + TDM_ERR("already has pp backend(%s)", private_display->pp_module->module_data->name); return TDM_ERROR_NONE; } @@ -177,54 +216,58 @@ tdm_backend_register_func_capture(tdm_display *dpy, if (!func_capture) return TDM_ERROR_NONE; - private_display->capabilities |= TDM_DISPLAY_CAPABILITY_CAPTURE; - private_display->func_capture = *func_capture; + assert(private_display->current_module); + + private_display->current_module->capabilities |= TDM_DISPLAY_CAPABILITY_CAPTURE; + private_display->current_module->func_capture = *func_capture; + + //TODO: remove later + if (!private_display->capture_module) + private_display->capture_module = private_display->current_module; + else + TDM_ERR("already has capture backend(%s)", private_display->capture_module->module_data->name); return TDM_ERROR_NONE; } -/* backend operates itself types */ -static tdm_private_output* -_look_for_frontend_hwc_output(tdm_output *backend_output) +EXTERN tdm_error +tdm_backend_register_output(tdm_display *dpy, tdm_output *output) { - tdm_private_output *frontend_output = NULL, *o = NULL; - tdm_private_display *dpy; + tdm_error ret; - dpy = tdm_display_init(NULL); - TDM_RETURN_VAL_IF_FAIL(dpy != NULL, NULL); + BACKEND_FUNC_ENTRY(); - LIST_FOR_EACH_ENTRY(o, &dpy->output_list, link) { - if (!(o->caps.capabilities & TDM_OUTPUT_CAPABILITY_HWC)) - continue; + TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED); + TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_OPERATION_FAILED); - if (o->output_backend == backend_output) { - frontend_output = o; - break; - } - } + /* this function is only for backend. if backend calls this function, it means + * that it's triggered by frontend. frontend should set current_module before calling + * backend functions. + */ + TDM_RETURN_VAL_IF_FAIL(private_display->current_module != NULL, TDM_ERROR_OPERATION_FAILED); - tdm_display_deinit(dpy); + ret = tdm_display_update_output(private_display->current_module, output); + TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); - return frontend_output; + return TDM_ERROR_NONE; } -EXTERN tdm_error -tdm_backend_trigger_need_validate_event(tdm_output *output) +EXTERN void +tdm_backend_unregister_output(tdm_display *dpy, tdm_output *output) { tdm_private_output *private_output; - uint64_t value; - int res; - private_output = _look_for_frontend_hwc_output(output); - TDM_RETURN_VAL_IF_FAIL(private_output != NULL, TDM_ERROR_INVALID_PARAMETER); + BACKEND_FUNC_ENTRY_VOID(); - value = 1; + TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); + TDM_RETURN_IF_FAIL(output != NULL); - /* do not lock the global display lock here */ + /* this function is only for backend. if backend calls this function, it means + * that it's triggered by frontend. frontend should set current_module before calling + * backend functions. + */ + TDM_RETURN_IF_FAIL(private_display->current_module != NULL); - res = write(private_output->need_validate.event_fd, &value, sizeof(value)); - if (res < 0) - return TDM_ERROR_OPERATION_FAILED; - - return TDM_ERROR_NONE; + private_output = tdm_display_find_private_output(private_display, output); + tdm_display_destroy_private_output(private_output); }