VWR("couldn't update sw timer");
}
- if (tdm_debug_module & TDM_DEBUG_VBLANK)
- VIN("wait(%p) sequence(%u) done", wait_info, wait_info->target_seq);
-
if (private_vblank->last_seq >= wait_info->target_seq)
TDM_ERR("last_seq(%u) target_seq(%u)", private_vblank->last_seq, wait_info->target_seq);
+ /* tv_sec & tv_usec shouldn't be zero. But sometimes they are zero in some hardware.
+ * We need to prohibit that last_time becomes zero because "last_time == 0" means
+ * that a tdm_vblank object is just created and doesn't have the first vblank event.
+ * If last_time becomes 0, it would make issue.
+ */
+ if (tv_sec == 0 && tv_usec == 0) {
+ double curr = tdm_helper_get_time();
+ tv_sec = TDM_TIME_SEC(curr);
+ tv_usec = TDM_TIME_USEC(curr);
+ }
+
private_vblank->last_seq = wait_info->target_seq;
private_vblank->last_time = TDM_TIME(tv_sec, tv_usec);
+ if (tdm_debug_module & TDM_DEBUG_VBLANK)
+ VIN("wait(%p) last(%.6f) sequence(%u) done", wait_info, private_vblank->last_time, wait_info->target_seq);
+
if (wait_info->func)
wait_info->func(private_vblank, TDM_ERROR_NONE, wait_info->target_seq,
tv_sec, tv_usec, wait_info->user_data);
/* +1 ms to call the handler ASAP at the first. no matter for SW timer. */
wait_info->target_seq = 1;
if (tdm_debug_module & TDM_DEBUG_VBLANK)
- VIN("wait(%p) last(%.6f) hw_interval(%d) target sequence(%u)",
+ VIN("wait(%p) last(%.6f) hw_itvl(%d) targ_seq(%u)",
wait_info, private_vblank->last_time, hw_interval, wait_info->target_seq);
} else {
- double last, prev, req, curr, target, skip;
+ double last, prev, req, curr, target;
+ unsigned int skip;
last = private_vblank->last_time;
req = wait_info->req_time;
- skip = (req - last) / private_vblank->vblank_gap;
+ skip = (unsigned int)((req - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN);
prev = last + private_vblank->vblank_gap * skip;
curr = tdm_helper_get_time();
wait_info->target_seq += (unsigned int)((target - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN);
if (hw_interval > 300)
- VER("wait(%p) last(%.6f) req(%.6f) prev(%.6f) curr(%.6f) target(%.6f) skip(%.0f) hw_interval(%d) target_seq(%u)",
- wait_info, last, req - last, prev - last, curr - last, target - last,
+ VER("wait(%p) last(%.6f) req(%.6f) prev(%.6f) curr(%.6f) targ(%.6f,%.6f) skip(%u) hw_itvl(%d) targ_seq(%u)",
+ wait_info, last, req - last, prev - last, curr - last, target, target - last,
skip, hw_interval, wait_info->target_seq);
else if (tdm_debug_module & TDM_DEBUG_VBLANK)
- VIN("wait(%p) last(%.6f) req(%.6f) prev(%.6f) curr(%.6f) target(%.6f) skip(%.0f) hw_interval(%d) target_seq(%u)",
- wait_info, last, req - last, prev - last, curr - last, target - last,
+ VIN("wait(%p) last(%.6f) req(%.6f) prev(%.6f) curr(%.6f) targ(%.6f,%.6f) skip(%u) hw_itvl(%d) targ_seq(%u)",
+ wait_info, last, req - last, prev - last, curr - last, target, target - last,
skip, hw_interval, wait_info->target_seq);
}
first_wait_info = container_of(private_vblank->SW_wait_list.next, first_wait_info, link);
TDM_RETURN_VAL_IF_FAIL(first_wait_info != NULL, TDM_ERROR_OPERATION_FAILED);
- if (tdm_debug_module & TDM_DEBUG_VBLANK)
- VIN("wait(%p) sequence(%u) done", first_wait_info, first_wait_info->target_seq);
-
if (private_vblank->last_seq >= first_wait_info->target_seq)
TDM_ERR("last_seq(%u) target_seq(%u)", private_vblank->last_seq, first_wait_info->target_seq);
private_vblank->last_seq = first_wait_info->target_seq;
private_vblank->last_time = first_wait_info->target_time;
+ if (tdm_debug_module & TDM_DEBUG_VBLANK)
+ VIN("wait(%p) last(%.6f) sequence(%u) done", first_wait_info, private_vblank->last_time, first_wait_info->target_seq);
+
LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->SW_wait_list, link) {
if (w->target_time != first_wait_info->target_time)
break;
VIN("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, skip;
+ double last, prev, req, curr, target;
+ unsigned int skip;
last = private_vblank->last_time;
req = wait_info->req_time;
- skip = (req - last) / private_vblank->vblank_gap;
+ skip = (unsigned int)((req - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN);
prev = last + private_vblank->vblank_gap * skip;
curr = tdm_helper_get_time();
wait_info->target_time = target;
if (tdm_debug_module & TDM_DEBUG_VBLANK)
- VIN("wait(%p) last(%.6f) req(%.6f) prev(%.6f) curr(%.6f) target(%.6f,%.6f) target sequence(%u)",
+ VIN("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, wait_info->target_seq);
+ target, target - last, skip, wait_info->target_seq);
}
_tdm_vblank_insert_wait(wait_info, &private_vblank->SW_wait_list);