Imported Upstream version 1.15.1
[deb_xorg-server.git] / present / present_priv.h
CommitLineData
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
38extern int present_request;
39
40extern DevPrivateKeyRec present_screen_private_key;
41
42typedef struct present_fence *present_fence_ptr;
43
44typedef struct present_notify present_notify_rec, *present_notify_ptr;
45
46struct present_notify {
47 struct xorg_list window_list;
48 WindowPtr window;
49 CARD32 serial;
50};
51
52struct 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
78typedef 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
108static inline present_screen_priv_ptr
109present_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 */
117typedef struct present_event *present_event_ptr;
118
119typedef 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
127typedef 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
136extern DevPrivateKeyRec present_window_private_key;
137
138static inline present_window_priv_ptr
139present_window_priv(WindowPtr window)
140{
141 return (present_window_priv_ptr)dixGetPrivate(&(window)->devPrivates, &present_window_private_key);
142}
143
144present_window_priv_ptr
145present_get_window_priv(WindowPtr window, Bool create);
146
147extern RESTYPE present_event_type;
148
149/*
150 * present.c
151 */
152int
153present_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
170int
171present_notify_msc(WindowPtr window,
172 CARD32 serial,
173 uint64_t target_msc,
174 uint64_t divisor,
175 uint64_t remainder);
176
177void
178present_abort_vblank(ScreenPtr screen, RRCrtcPtr crtc, uint64_t event_id, uint64_t msc);
179
180void
181present_vblank_destroy(present_vblank_ptr vblank);
182
183void
184present_flip_destroy(ScreenPtr screen);
185
186void
187present_check_flip_window(WindowPtr window);
188
189RRCrtcPtr
190present_get_crtc(WindowPtr window);
191
192uint32_t
193present_query_capabilities(RRCrtcPtr crtc);
194
195Bool
196present_init(void);
197
198/*
199 * present_event.c
200 */
201
202void
203present_free_events(WindowPtr window);
204
205void
206present_send_config_notify(WindowPtr window, int x, int y, int w, int h, int bw, WindowPtr sibling);
207
208void
209present_send_complete_notify(WindowPtr window, CARD8 kind, CARD8 mode, CARD32 serial, uint64_t ust, uint64_t msc);
210
211void
212present_send_idle_notify(WindowPtr window, CARD32 serial, PixmapPtr pixmap, present_fence_ptr idle_fence);
213
214int
215present_select_input(ClientPtr client,
216 CARD32 eid,
217 WindowPtr window,
218 CARD32 event_mask);
219
220Bool
221present_event_init(void);
222
223/*
224 * present_fake.c
225 */
226int
227present_fake_get_ust_msc(ScreenPtr screen, uint64_t *ust, uint64_t *msc);
228
229int
230present_fake_queue_vblank(ScreenPtr screen, uint64_t event_id, uint64_t msc);
231
232void
233present_fake_abort_vblank(ScreenPtr screen, uint64_t event_id, uint64_t msc);
234
235void
236present_fake_screen_init(ScreenPtr screen);
237
238void
239present_fake_queue_init(void);
240
241/*
242 * present_fence.c
243 */
244struct present_fence *
245present_fence_create(SyncFence *sync_fence);
246
247void
248present_fence_destroy(struct present_fence *present_fence);
249
250void
251present_fence_set_triggered(struct present_fence *present_fence);
252
253Bool
254present_fence_check_triggered(struct present_fence *present_fence);
255
256void
257present_fence_set_callback(struct present_fence *present_fence,
258 void (*callback)(void *param),
259 void *param);
260
261XID
262present_fence_id(struct present_fence *present_fence);
263
264/*
265 * present_notify.c
266 */
267void
268present_clear_window_notifies(WindowPtr window);
269
270void
271present_free_window_notify(present_notify_ptr notify);
272
273int
274present_add_window_notify(present_notify_ptr notify);
275
276int
277present_create_notifies(ClientPtr client, int num_notifies, xPresentNotify *x_notifies, present_notify_ptr *p_notifies);
278
279void
280present_destroy_notifies(present_notify_ptr notifies, int num_notifies);
281
282/*
283 * present_redirect.c
284 */
285
286WindowPtr
287present_redirect(ClientPtr client, WindowPtr target);
288
289/*
290 * present_request.c
291 */
292int
293proc_present_dispatch(ClientPtr client);
294
295int
296sproc_present_dispatch(ClientPtr client);
297
298/*
299 * present_screen.c
300 */
301
302#endif /* _PRESENT_PRIV_H_ */