struct wl_resource *resource;
} tdm_server_client_info;
+typedef enum {
+ VBLANK_WAIT_TYPE_INTERVAL,
+ VBLANK_WAIT_TYPE_SEQUENCE,
+} tdm_server_vblank_wait_type;
+
static tdm_private_server *keep_private_server;
static struct list_head client_list;
}
static void
-_tdm_server_vblank_cb_wait_vblank(struct wl_client *client, struct wl_resource *resource,
- uint32_t interval, uint32_t req_id, uint32_t req_sec, uint32_t req_usec)
+_tdm_server_vblank_wait_vblank(tdm_server_vblank_info *vblank_info, tdm_server_vblank_wait_type wait_type,
+ uint32_t wait_value, uint32_t req_id, uint32_t req_sec, uint32_t req_usec)
{
- tdm_server_vblank_info *vblank_info = wl_resource_get_user_data(resource);
tdm_server_output_info *output_info = vblank_info->output_info;
tdm_private_server *private_server = output_info->private_server;
tdm_private_loop *private_loop = private_server->private_loop;
if (tdm_ttrace_module & TDM_TTRACE_SERVER_VBLANK)
TDM_TRACE_ASYNC_BEGIN((int)wait_info->req_time, "TDM_Server_Vblank:%u", vblank_info->stamp);
- ret = tdm_vblank_wait(vblank_info->vblank, req_sec, req_usec, interval, _tdm_server_cb_vblank, wait_info);
+ if (wait_type == VBLANK_WAIT_TYPE_INTERVAL)
+ ret = tdm_vblank_wait(vblank_info->vblank, req_sec, req_usec, wait_value, _tdm_server_cb_vblank, wait_info);
+ else
+ ret = tdm_vblank_wait_seq(vblank_info->vblank, req_sec, req_usec, wait_value, _tdm_server_cb_vblank, wait_info);
+
tdm_vblank_get_enable_fake(vblank_info->vblank, &enable_fake);
if (!enable_fake && ret == TDM_ERROR_DPMS_OFF)
TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, wait_failed);
- tdm_display_lock(private_loop->dpy);
- _tdm_server_vblank_timeout_update(vblank_info, 1000);
- tdm_display_unlock(private_loop->dpy);
+ if (wait_type == VBLANK_WAIT_TYPE_INTERVAL) {
+ tdm_display_lock(private_loop->dpy);
+ _tdm_server_vblank_timeout_update(vblank_info, 1000);
+ tdm_display_unlock(private_loop->dpy);
+ }
return;
+
wait_failed:
/* LCOV_EXCL_START */
-
wl_tdm_vblank_send_done(vblank_info->resource, req_id, 0, 0, 0, ret);
if (wait_info)
destroy_wait(wait_info);
-
/* LCOV_EXCL_STOP */
}
static void
-_tdm_server_vblank_cb_wait_vblank_seq(struct wl_client *client, struct wl_resource *resource,
- uint32_t sequence, uint32_t req_id, uint32_t req_sec, uint32_t req_usec)
+_tdm_server_vblank_cb_wait_vblank(struct wl_client *client, struct wl_resource *resource,
+ uint32_t interval, uint32_t req_id, uint32_t req_sec, uint32_t req_usec)
{
tdm_server_vblank_info *vblank_info = wl_resource_get_user_data(resource);
- tdm_server_output_info *output_info = vblank_info->output_info;
- tdm_private_server *private_server = output_info->private_server;
- tdm_server_wait_info *wait_info;
- unsigned int enable_fake = 0;
- tdm_error ret;
-
- wait_info = calloc(1, sizeof * wait_info);
- if (!wait_info) {
- /* LCOV_EXCL_START */
-
- TDM_ERR("alloc failed");
- ret = TDM_ERROR_OUT_OF_MEMORY;
- goto wait_failed;
- /* LCOV_EXCL_STOP */
- }
-
- LIST_ADDTAIL(&wait_info->link, &private_server->wait_list);
- wait_info->vblank_info = vblank_info;
- wait_info->req_id = req_id;
- wait_info->req_time = TDM_TIME(req_sec, req_usec);
-
- if (tdm_debug_module & TDM_DEBUG_VBLANK)
- TDM_DBG("req_id(%d) wait", req_id);
-
- if (tdm_ttrace_module & TDM_TTRACE_SERVER_VBLANK)
- TDM_TRACE_ASYNC_BEGIN((int)wait_info->req_time, "TDM_Server_Vblank:%u", vblank_info->stamp);
-
- ret = tdm_vblank_wait_seq(vblank_info->vblank, req_sec, req_usec, sequence, _tdm_server_cb_vblank, wait_info);
-
- tdm_vblank_get_enable_fake(vblank_info->vblank, &enable_fake);
- if (!enable_fake && ret == TDM_ERROR_DPMS_OFF)
- goto wait_failed;
-
- TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, wait_failed);
-
- return;
-wait_failed:
- /* LCOV_EXCL_START */
+ _tdm_server_vblank_wait_vblank(vblank_info, VBLANK_WAIT_TYPE_INTERVAL, interval, req_id, req_sec, req_usec);
+}
- wl_tdm_vblank_send_done(vblank_info->resource, req_id, 0, 0, 0, ret);
- if (wait_info)
- destroy_wait(wait_info);
+static void
+_tdm_server_vblank_cb_wait_vblank_seq(struct wl_client *client, struct wl_resource *resource,
+ uint32_t sequence, uint32_t req_id, uint32_t req_sec, uint32_t req_usec)
+{
+ tdm_server_vblank_info *vblank_info = wl_resource_get_user_data(resource);
- /* LCOV_EXCL_STOP */
+ _tdm_server_vblank_wait_vblank(vblank_info, VBLANK_WAIT_TYPE_SEQUENCE, sequence, req_id, req_sec, req_usec);
}
static const struct wl_tdm_vblank_interface tdm_vblank_implementation = {