From: Boram Park Date: Wed, 14 Mar 2018 05:05:25 +0000 (+0900) Subject: vblank: calculating SW target time properly X-Git-Tag: submit/tizen/20180314.093754~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8ad1b4be07c629b521ef749fba2da732369449ae;p=platform%2Fcore%2Fuifw%2Flibtdm.git vblank: calculating SW target time properly Change-Id: I3f72412fd9b0d23ddbd5db42bed9e6f07dda322c --- diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index 3b559445..263f825e 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -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; @@ -1423,52 +1421,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);