Commit | Line | Data |
---|---|---|
a09e091a JB |
1 | /* |
2 | * Copyright © 2013 Keith Packard | |
3 | * | |
4 | * Permission to use, copy, modify, distribute, and sell this software and its | |
5 | * documentation for any purpose is hereby granted without fee, provided that | |
6 | * the above copyright notice appear in all copies and that both that copyright | |
7 | * notice and this permission notice appear in supporting documentation, and | |
8 | * that the name of the copyright holders not be used in advertising or | |
9 | * publicity pertaining to distribution of the software without specific, | |
10 | * written prior permission. The copyright holders make no representations | |
11 | * about the suitability of this software for any purpose. It is provided "as | |
12 | * is" without express or implied warranty. | |
13 | * | |
14 | * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | |
15 | * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO | |
16 | * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR | |
17 | * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, | |
18 | * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | |
19 | * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | |
20 | * OF THIS SOFTWARE. | |
21 | */ | |
22 | ||
23 | #ifndef _PRESENT_PRIV_H_ | |
24 | #define _PRESENT_PRIV_H_ | |
25 | ||
26 | #include <X11/X.h> | |
27 | #include "scrnintstr.h" | |
28 | #include "misc.h" | |
29 | #include "list.h" | |
30 | #include "windowstr.h" | |
31 | #include "dixstruct.h" | |
32 | #include "present.h" | |
33 | #include <syncsdk.h> | |
34 | #include <syncsrv.h> | |
35 | #include <xfixes.h> | |
36 | #include <randrstr.h> | |
37 | ||
38 | extern int present_request; | |
39 | ||
40 | extern DevPrivateKeyRec present_screen_private_key; | |
41 | ||
42 | typedef struct present_fence *present_fence_ptr; | |
43 | ||
44 | typedef struct present_notify present_notify_rec, *present_notify_ptr; | |
45 | ||
46 | struct present_notify { | |
47 | struct xorg_list window_list; | |
48 | WindowPtr window; | |
49 | CARD32 serial; | |
50 | }; | |
51 | ||
52 | struct present_vblank { | |
53 | struct xorg_list window_list; | |
54 | struct xorg_list event_queue; | |
55 | ScreenPtr screen; | |
56 | WindowPtr window; | |
57 | PixmapPtr pixmap; | |
58 | RegionPtr valid; | |
59 | RegionPtr update; | |
60 | RRCrtcPtr crtc; | |
61 | uint32_t serial; | |
62 | int16_t x_off; | |
63 | int16_t y_off; | |
64 | CARD16 kind; | |
65 | uint64_t event_id; | |
66 | uint64_t target_msc; | |
67 | uint64_t msc_offset; | |
68 | present_fence_ptr idle_fence; | |
69 | present_fence_ptr wait_fence; | |
70 | present_notify_ptr notifies; | |
71 | int num_notifies; | |
72 | Bool queued; /* on present_exec_queue */ | |
73 | Bool flip; /* planning on using flip */ | |
74 | Bool sync_flip; /* do flip synchronous to vblank */ | |
75 | Bool abort_flip; /* aborting this flip */ | |
76 | }; | |
77 | ||
78 | typedef struct present_screen_priv { | |
79 | CloseScreenProcPtr CloseScreen; | |
80 | ConfigNotifyProcPtr ConfigNotify; | |
81 | DestroyWindowProcPtr DestroyWindow; | |
82 | ClipNotifyProcPtr ClipNotify; | |
83 | ||
84 | present_vblank_ptr flip_pending; | |
85 | uint64_t unflip_event_id; | |
86 | ||
87 | uint32_t fake_interval; | |
88 | ||
89 | /* Currently active flipped pixmap and fence */ | |
90 | RRCrtcPtr flip_crtc; | |
91 | WindowPtr flip_window; | |
92 | uint32_t flip_serial; | |
93 | PixmapPtr flip_pixmap; | |
94 | present_fence_ptr flip_idle_fence; | |
95 | ||
96 | present_screen_info_ptr info; | |
97 | } present_screen_priv_rec, *present_screen_priv_ptr; | |
98 | ||
99 | #define wrap(priv,real,mem,func) {\ | |
100 | priv->mem = real->mem; \ | |
101 | real->mem = func; \ | |
102 | } | |
103 | ||
104 | #define unwrap(priv,real,mem) {\ | |
105 | real->mem = priv->mem; \ | |
106 | } | |
107 | ||
108 | static inline present_screen_priv_ptr | |
109 | present_screen_priv(ScreenPtr screen) | |
110 | { | |
111 | return (present_screen_priv_ptr)dixLookupPrivate(&(screen)->devPrivates, &present_screen_private_key); | |
112 | } | |
113 | ||
114 | /* | |
115 | * Each window has a list of clients and event masks | |
116 | */ | |
117 | typedef struct present_event *present_event_ptr; | |
118 | ||
119 | typedef struct present_event { | |
120 | present_event_ptr next; | |
121 | ClientPtr client; | |
122 | WindowPtr window; | |
123 | XID id; | |
124 | int mask; | |
125 | } present_event_rec; | |
126 | ||
127 | typedef struct present_window_priv { | |
128 | present_event_ptr events; | |
129 | RRCrtcPtr crtc; /* Last reported CRTC from get_ust_msc */ | |
130 | uint64_t msc_offset; | |
131 | uint64_t msc; /* Last reported MSC from the current crtc */ | |
132 | struct xorg_list vblank; | |
133 | struct xorg_list notifies; | |
134 | } present_window_priv_rec, *present_window_priv_ptr; | |
135 | ||
136 | extern DevPrivateKeyRec present_window_private_key; | |
137 | ||
138 | static inline present_window_priv_ptr | |
139 | present_window_priv(WindowPtr window) | |
140 | { | |
141 | return (present_window_priv_ptr)dixGetPrivate(&(window)->devPrivates, &present_window_private_key); | |
142 | } | |
143 | ||
144 | present_window_priv_ptr | |
145 | present_get_window_priv(WindowPtr window, Bool create); | |
146 | ||
147 | extern RESTYPE present_event_type; | |
148 | ||
149 | /* | |
150 | * present.c | |
151 | */ | |
152 | int | |
153 | present_pixmap(WindowPtr window, | |
154 | PixmapPtr pixmap, | |
155 | CARD32 serial, | |
156 | RegionPtr valid, | |
157 | RegionPtr update, | |
158 | int16_t x_off, | |
159 | int16_t y_off, | |
160 | RRCrtcPtr target_crtc, | |
161 | SyncFence *wait_fence, | |
162 | SyncFence *idle_fence, | |
163 | uint32_t options, | |
164 | uint64_t target_msc, | |
165 | uint64_t divisor, | |
166 | uint64_t remainder, | |
167 | present_notify_ptr notifies, | |
168 | int num_notifies); | |
169 | ||
170 | int | |
171 | present_notify_msc(WindowPtr window, | |
172 | CARD32 serial, | |
173 | uint64_t target_msc, | |
174 | uint64_t divisor, | |
175 | uint64_t remainder); | |
176 | ||
177 | void | |
178 | present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc); | |
179 | ||
180 | void | |
181 | present_vblank_destroy(present_vblank_ptr vblank); | |
182 | ||
183 | void | |
184 | present_flip_destroy(ScreenPtr screen); | |
185 | ||
186 | void | |
187 | present_check_flip_window(WindowPtr window); | |
188 | ||
189 | RRCrtcPtr | |
190 | present_get_crtc(WindowPtr window); | |
191 | ||
192 | uint32_t | |
193 | present_query_capabilities(RRCrtcPtr crtc); | |
194 | ||
195 | Bool | |
196 | present_init(void); | |
197 | ||
198 | /* | |
199 | * present_event.c | |
200 | */ | |
201 | ||
202 | void | |
203 | present_free_events(WindowPtr window); | |
204 | ||
205 | void | |
206 | present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling); | |
207 | ||
208 | void | |
209 | present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc); | |
210 | ||
211 | void | |
212 | present_send_idle_notify(WindowPtr window, CARD32 serial, PixmapPtr pixmap, present_fence_ptr idle_fence); | |
213 | ||
214 | int | |
215 | present_select_input(ClientPtr client, | |
216 | CARD32 eid, | |
217 | WindowPtr window, | |
218 | CARD32 event_mask); | |
219 | ||
220 | Bool | |
221 | present_event_init(void); | |
222 | ||
223 | /* | |
224 | * present_fake.c | |
225 | */ | |
226 | int | |
227 | present_fake_get_ust_msc(ScreenPtr screen, uint64_t *ust, uint64_t *msc); | |
228 | ||
229 | int | |
230 | present_fake_queue_vblank(ScreenPtr screen, uint64_t event_id, uint64_t msc); | |
231 | ||
232 | void | |
233 | present_fake_abort_vblank(ScreenPtr screen, uint64_t event_id, uint64_t msc); | |
234 | ||
235 | void | |
236 | present_fake_screen_init(ScreenPtr screen); | |
237 | ||
238 | void | |
239 | present_fake_queue_init(void); | |
240 | ||
241 | /* | |
242 | * present_fence.c | |
243 | */ | |
244 | struct present_fence * | |
245 | present_fence_create(SyncFence *sync_fence); | |
246 | ||
247 | void | |
248 | present_fence_destroy(struct present_fence *present_fence); | |
249 | ||
250 | void | |
251 | present_fence_set_triggered(struct present_fence *present_fence); | |
252 | ||
253 | Bool | |
254 | present_fence_check_triggered(struct present_fence *present_fence); | |
255 | ||
256 | void | |
257 | present_fence_set_callback(struct present_fence *present_fence, | |
258 | void (*callback)(void *param), | |
259 | void *param); | |
260 | ||
261 | XID | |
262 | present_fence_id(struct present_fence *present_fence); | |
263 | ||
264 | /* | |
265 | * present_notify.c | |
266 | */ | |
267 | void | |
268 | present_clear_window_notifies(WindowPtr window); | |
269 | ||
270 | void | |
271 | present_free_window_notify(present_notify_ptr notify); | |
272 | ||
273 | int | |
274 | present_add_window_notify(present_notify_ptr notify); | |
275 | ||
276 | int | |
277 | present_create_notifies(ClientPtr client, int num_notifies, xPresentNotify *x_notifies, present_notify_ptr *p_notifies); | |
278 | ||
279 | void | |
280 | present_destroy_notifies(present_notify_ptr notifies, int num_notifies); | |
281 | ||
282 | /* | |
283 | * present_redirect.c | |
284 | */ | |
285 | ||
286 | WindowPtr | |
287 | present_redirect(ClientPtr client, WindowPtr target); | |
288 | ||
289 | /* | |
290 | * present_request.c | |
291 | */ | |
292 | int | |
293 | proc_present_dispatch(ClientPtr client); | |
294 | ||
295 | int | |
296 | sproc_present_dispatch(ClientPtr client); | |
297 | ||
298 | /* | |
299 | * present_screen.c | |
300 | */ | |
301 | ||
302 | #endif /* _PRESENT_PRIV_H_ */ |