* Taeheon Kim <th908.kim@samsung.com>,
* YoungJun Cho <yj44.cho@samsung.com>,
* SooChan Lim <sc1.lim@samsung.com>,
- * Boram Park <sc1.lim@samsung.com>
+ * Boram Park <boram1288.park@samsung.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
if (found)
LIST_ADD(&wait_info->link, &found->link);
else
- LIST_ADDTAIL(&wait_info->link, list->next);
+ LIST_ADDTAIL(&wait_info->link, list);
}
static void
}
/* 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)
{
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
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
v->check_HW_or_SW = 1;
}
+
+ if (enable)
+ tdm_hwc_set_vblank(fps);
+ else
+ tdm_hwc_unset_vblank();
+
pthread_mutex_unlock(&valid_list_lock);
return TDM_ERROR_NONE;
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;
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;
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
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
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;
/* 1) if fps != factor of vrefresh, SW timer
* 2) if fps == factor of vrefresh && dpms == off, SW timer (Fake HW vblank)
- * 2) if fps == factor of vrefresh && dpms == on && offset == 0, HW vblank
- * 3) if fps == factor of vrefresh && dpms == on && offset != 0, HW vblank + SW timer
+ * 3) if fps == factor of vrefresh && dpms == on && offset == 0, HW vblank
+ * 4) if fps == factor of vrefresh && dpms == on && offset != 0, HW vblank + SW timer
* In case of 1), we really don't need to align with HW vblank.
*/
if (private_vblank->vrefresh % fps)