2 #include "tdm_private.h"
4 #define TDM_VBLANK_UINT_MAX 4294967295U
5 #define TDM_VBLANK_UINT_1Q 1073741823U /* UINT_MAX / 4 */
6 #define TDM_VBLANK_UINT_3Q 3221225471U /* UINT_MAX / 4 * 3 */
8 #define TDM_VBLANK_SEQ_REACHED_MAX(seq, last_seq) \
9 ((seq) < TDM_VBLANK_UINT_1Q && TDM_VBLANK_UINT_3Q < (last_seq))
11 #define VER(fmt, arg...) TDM_ERR("[%p] "fmt, private_vblank, ##arg)
12 #define VWR(fmt, arg...) TDM_WRN("[%p] "fmt, private_vblank, ##arg)
13 #define VIN(fmt, arg...) TDM_INFO("[%p] "fmt, private_vblank, ##arg)
14 #define VDB(fmt, arg...) TDM_DBG("[%p] "fmt, private_vblank, ##arg)
21 } tdm_vblank_wait_type;
23 typedef struct _tdm_vblank_wait_info tdm_vblank_wait_info;
25 typedef struct _tdm_private_vblank {
26 struct list_head link;
31 unsigned int vrefresh;
33 unsigned int check_HW_or_SW;
36 unsigned int enable_fake;
39 unsigned int quotient;
41 unsigned int last_seq;
42 unsigned int last_tv_sec;
43 unsigned int last_tv_usec;
47 struct list_head HW_wait_list;
50 tdm_event_loop_source *SW_timer;
51 struct list_head SW_wait_list;
54 struct _tdm_vblank_wait_info {
55 struct list_head link;
56 struct list_head valid_link;
61 unsigned int req_usec;
62 unsigned int interval;
64 tdm_vblank_handler func;
66 tdm_private_vblank *private_vblank;
68 tdm_vblank_wait_type type;
70 unsigned int target_sec;
71 unsigned int target_usec;
72 unsigned int target_seq;
75 static struct list_head vblank_list;
76 static struct list_head valid_wait_list;
77 static unsigned int vblank_list_inited;
78 static unsigned int stamp = 0;
80 static tdm_error _tdm_vblank_cb_vblank_SW(void *user_data);
81 static tdm_error _tdm_vblank_wait_SW(tdm_vblank_wait_info *wait_info);
84 tdm_vblank_create(tdm_display *dpy, tdm_output *output, tdm_error *error)
89 tdm_vblank_destroy(tdm_vblank *vblank)
94 tdm_vblank_set_fps(tdm_vblank *vblank, unsigned int fps)
99 tdm_vblank_set_offset(tdm_vblank *vblank, int offset)
104 tdm_vblank_set_enable_fake(tdm_vblank *vblank, unsigned int enable_fake)
109 tdm_vblank_get_enable_fake(tdm_vblank *vblank)
114 tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec,
115 unsigned int interval, tdm_vblank_handler func, void *user_data)
120 tdm_vblank_wait_seq(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec,
121 unsigned int sequence, tdm_vblank_handler func, void *user_data)