X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftdm_vblank.c;h=568605a365ec76a4f0e4d9f0e51327ec2541eaca;hb=d83a8cb9702ec0084ffcaaefe561a7c20f030d15;hp=3b559445cc0ee38e830387fdd6b50532f1f3fdf1;hpb=9a64cd40fd535def8143e3a1490bf2f5e548459c;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index 3b55944..568605a 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.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 @@ -377,19 +377,17 @@ _tdm_vblank_update_output_info(tdm_private_vblank *private_vblank) tdm_output *output = private_vblank->output; tdm_output_conn_status connection = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; unsigned int vrefresh = TDM_VBLANK_DEFAULT_VREFRESH; + const tdm_output_mode *mode = NULL; tdm_error ret; ret = tdm_output_get_conn_status(output, &connection); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); - if (connection == TDM_OUTPUT_CONN_STATUS_MODE_SETTED) { - const tdm_output_mode *mode = NULL; - ret = tdm_output_get_mode(output, &mode); - if (ret == TDM_ERROR_NONE && mode) - vrefresh = mode->vrefresh; - else - VWR("mode not setted!!!"); - } + ret = tdm_output_get_mode(output, &mode); + if (ret == TDM_ERROR_NONE && mode) + vrefresh = mode->vrefresh; + else + VWR("mode not setted!!!"); private_vblank->connection = connection; private_vblank->vrefresh = vrefresh; @@ -452,6 +450,45 @@ _tdm_vblank_cb_output_change(tdm_output *output, tdm_output_change_type type, } /* LCOV_EXCL_STOP */ +static tdm_error +_tdm_vblank_set_fps(tdm_vblank *vblank, unsigned int fps) +{ + tdm_private_vblank *private_vblank = vblank; + + if (private_vblank->fps_fixed) { + VIN("fps(%u) can't be changed", private_vblank->fps); + return TDM_ERROR_NONE; + } + + private_vblank->fps_changeable = 0; + + if (private_vblank->fps == fps) + return TDM_ERROR_NONE; + + private_vblank->fps = fps; + private_vblank->check_HW_or_SW = 1; + + VIN("fps(%u) changed", fps); + + return TDM_ERROR_NONE; +} + +static tdm_error +_tdm_vblank_ignore_global_fps(tdm_vblank *vblank, unsigned int ignore) +{ + tdm_private_vblank *private_vblank = vblank; + + if (private_vblank->ignore_global_fps == ignore) + return TDM_ERROR_NONE; + + private_vblank->ignore_global_fps = ignore; + private_vblank->check_HW_or_SW = 1; + + VIN("ignore_global_fps(%u)", private_vblank->ignore_global_fps); + + return TDM_ERROR_NONE; +} + EXTERN tdm_error tdm_vblank_set_client_vblank_fps(unsigned int pid, const char *name, unsigned int fps) { @@ -485,7 +522,7 @@ tdm_vblank_set_client_vblank_fps(unsigned int pid, const char *name, unsigned in continue; } - ret = tdm_vblank_set_fps(v, fps); + ret = _tdm_vblank_set_fps(v, fps); if (ret == TDM_ERROR_NONE) TDM_INFO("(pid:%u) '%s' fps changed: %d", pid, v->name, fps); else @@ -528,7 +565,7 @@ tdm_vblank_set_client_ignore_global_fps(unsigned int pid, const char *name, unsi continue; } - ret = tdm_vblank_ignore_global_fps(v, ignore); + ret = _tdm_vblank_ignore_global_fps(v, ignore); if (ret == TDM_ERROR_NONE) TDM_INFO("(pid:%u) '%s' ignore changed: %u", pid, v->name, ignore); else @@ -603,7 +640,7 @@ _tdm_vblank_call_thread_cb(tdm_private_vblank *private_vblank) vblank_create.base.sync = 0; vblank_create.vblank_stamp = private_vblank->stamp; - ret = tdm_thread_cb_call(private_vblank->dpy, &vblank_create.base); + ret = tdm_thread_cb_call(private_vblank->dpy, &vblank_create.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); return TDM_ERROR_NONE; @@ -734,8 +771,8 @@ tdm_vblank_create(tdm_display *dpy, tdm_output *output, tdm_error *error) tdm_private_vblank *private_vblank; tdm_error ret; - TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(tdm_display_is_valid(dpy), TDM_ERROR_INVALID_PARAMETER, NULL); - TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(tdm_output_is_valid(output), TDM_ERROR_INVALID_PARAMETER, NULL); + TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(dpy != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); + TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(output != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); if (error) *error = TDM_ERROR_NONE; @@ -911,27 +948,10 @@ tdm_vblank_get_name(tdm_vblank *vblank, const char **name) EXTERN tdm_error tdm_vblank_set_fps(tdm_vblank *vblank, unsigned int fps) { - tdm_private_vblank *private_vblank = vblank; - TDM_RETURN_VAL_IF_FAIL(tdm_vblank_is_valid(vblank), TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(fps > 0, TDM_ERROR_INVALID_PARAMETER); - if (private_vblank->fps_fixed) { - VIN("fps(%u) can't be changed", private_vblank->fps); - return TDM_ERROR_NONE; - } - - private_vblank->fps_changeable = 0; - - if (private_vblank->fps == fps) - return TDM_ERROR_NONE; - - private_vblank->fps = fps; - private_vblank->check_HW_or_SW = 1; - - VIN("fps(%u) changed", fps); - - return TDM_ERROR_NONE; + return _tdm_vblank_set_fps(vblank, fps); } EXTERN tdm_error @@ -972,19 +992,9 @@ tdm_vblank_set_fixed_fps(tdm_vblank *vblank, unsigned int fps) EXTERN tdm_error tdm_vblank_ignore_global_fps(tdm_vblank *vblank, unsigned int ignore) { - tdm_private_vblank *private_vblank = vblank; - TDM_RETURN_VAL_IF_FAIL(tdm_vblank_is_valid(vblank), TDM_ERROR_INVALID_PARAMETER); - if (private_vblank->ignore_global_fps == ignore) - return TDM_ERROR_NONE; - - private_vblank->ignore_global_fps = ignore; - private_vblank->check_HW_or_SW = 1; - - VIN("ignore_global_fps(%u)", private_vblank->ignore_global_fps); - - return TDM_ERROR_NONE; + return _tdm_vblank_ignore_global_fps(vblank, ignore); } EXTERN tdm_error @@ -1412,7 +1422,7 @@ _tdm_vblank_cb_timeout_SW(void *user_data) vblank_sw.base.data = NULL; vblank_sw.base.sync = 0; - ret = tdm_thread_cb_call(private_vblank, &vblank_sw.base); + ret = tdm_thread_cb_call(private_vblank, &vblank_sw.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); return TDM_ERROR_NONE; @@ -1423,52 +1433,53 @@ _tdm_vblank_wait_SW(tdm_vblank_wait_info *wait_info) { tdm_private_vblank *private_vblank = wait_info->private_vblank; tdm_error ret; + double last, prev, req, curr, target; + unsigned int skip; if (private_vblank->last_type != VBLANK_EVENT_TYPE_SW) { - VIN("Use SW vblank"); + tdm_output_dpms dpms; + + tdm_output_get_dpms(private_vblank->output, &dpms); + + VIN("Use SW vblank. connection(%s), dpms(%s), vrefresh(%d), fps(%d), offset(%d)", + tdm_status_str(private_vblank->connection), tdm_dpms_str(dpms), + private_vblank->vrefresh, private_vblank->fps, private_vblank->offset); private_vblank->last_type = VBLANK_EVENT_TYPE_SW; } if (private_vblank->last_time == 0) { /* SW vblank starts from now. SW vblank doesn't need to be aligned with HW vblank. */ private_vblank->last_seq = 0; - private_vblank->last_time = tdm_helper_get_time(); + private_vblank->last_time = tdm_helper_get_time() - private_vblank->vblank_gap; /* +1 ms to call the handler ASAP at the first. no matter for SW timer. */ wait_info->target_seq = 1; - wait_info->target_time = private_vblank->last_time + 0.001; - - VDB("wait(%p) last(%.6f) target(%.6f) target sequence(%u)", - wait_info, private_vblank->last_time, wait_info->target_time, wait_info->target_seq); - } else { - double last, prev, req, curr, target; - unsigned int skip; + } - last = private_vblank->last_time; - req = wait_info->req_time; + last = private_vblank->last_time; + req = wait_info->req_time; - /* make sure that req time is bigger than last. */ - if (req < last) - req = last; + /* make sure that req time is bigger than last. */ + if (req < last) + req = last; - skip = (unsigned int)((req - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN); - prev = last + private_vblank->vblank_gap * skip; + skip = (unsigned int)((req - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN); + prev = last + private_vblank->vblank_gap * skip; - curr = tdm_helper_get_time(); - target = prev + private_vblank->vblank_gap * wait_info->interval; + curr = tdm_helper_get_time(); + target = prev + private_vblank->vblank_gap * wait_info->interval; - while (target < curr) - target += private_vblank->vblank_gap; + while (target < curr) + target += private_vblank->vblank_gap; - wait_info->target_seq = private_vblank->last_seq; - wait_info->target_seq += (unsigned int)((target - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN); + wait_info->target_seq = private_vblank->last_seq; + wait_info->target_seq += (unsigned int)((target - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN); - wait_info->target_time = target; + wait_info->target_time = target + (double)(private_vblank->offset) / 1000; - VDB("wait(%p) last(%.6f) req(%.6f) prev(%.6f) curr(%.6f) targ(%.6f,%.6f) skip(%u) targ_seq(%u)", - wait_info, last, req - last, prev - last, curr - last, - target, target - last, skip, wait_info->target_seq); - } + VDB("wait(%p) last(%.6f) req(%.6f) prev(%.6f) curr(%.6f) targ(%.6f,%.6f) skip(%u) targ_seq(%u)", + wait_info, last, req - last, prev - last, curr - last, + target, target - last, skip, wait_info->target_seq); _tdm_vblank_insert_wait(wait_info, &private_vblank->SW_wait_list);