XSync.c revision 9b530083
1caade7ccSmrg/*
2caade7ccSmrg
3caade7ccSmrgCopyright 1991, 1993, 1998  The Open Group
4caade7ccSmrg
5caade7ccSmrgPermission to use, copy, modify, distribute, and sell this software and its
6caade7ccSmrgdocumentation for any purpose is hereby granted without fee, provided that
7caade7ccSmrgthe above copyright notice appear in all copies and that both that
8caade7ccSmrgcopyright notice and this permission notice appear in supporting
9caade7ccSmrgdocumentation.
10caade7ccSmrg
11caade7ccSmrgThe above copyright notice and this permission notice shall be included
12caade7ccSmrgin all copies or substantial portions of the Software.
13caade7ccSmrg
14caade7ccSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15caade7ccSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16caade7ccSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17caade7ccSmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18caade7ccSmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19caade7ccSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20caade7ccSmrgOTHER DEALINGS IN THE SOFTWARE.
21caade7ccSmrg
22caade7ccSmrgExcept as contained in this notice, the name of The Open Group shall
23caade7ccSmrgnot be used in advertising or otherwise to promote the sale, use or
24caade7ccSmrgother dealings in this Software without prior written authorization
25caade7ccSmrgfrom The Open Group.
26caade7ccSmrg
27caade7ccSmrg*/
28caade7ccSmrg
29caade7ccSmrg/***********************************************************
30caade7ccSmrgCopyright 1991,1993 by Digital Equipment Corporation, Maynard, Massachusetts,
31caade7ccSmrgand Olivetti Research Limited, Cambridge, England.
32caade7ccSmrg
33caade7ccSmrg                        All Rights Reserved
34caade7ccSmrg
35caade7ccSmrgPermission to use, copy, modify, and distribute this software and its
36caade7ccSmrgdocumentation for any purpose and without fee is hereby granted,
37caade7ccSmrgprovided that the above copyright notice appear in all copies and that
38caade7ccSmrgboth that copyright notice and this permission notice appear in
39caade7ccSmrgsupporting documentation, and that the names of Digital or Olivetti
40caade7ccSmrgnot be used in advertising or publicity pertaining to distribution of the
41caade7ccSmrgsoftware without specific, written prior permission.
42caade7ccSmrg
43caade7ccSmrgDIGITAL AND OLIVETTI DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
44caade7ccSmrgSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
45caade7ccSmrgFITNESS, IN NO EVENT SHALL THEY BE LIABLE FOR ANY SPECIAL, INDIRECT OR
46caade7ccSmrgCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
47caade7ccSmrgUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
48caade7ccSmrgOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
49caade7ccSmrgPERFORMANCE OF THIS SOFTWARE.
50caade7ccSmrg
51caade7ccSmrg******************************************************************/
52caade7ccSmrg
53caade7ccSmrg#ifdef HAVE_CONFIG_H
54caade7ccSmrg#include <config.h>
55caade7ccSmrg#endif
56caade7ccSmrg#include <stdio.h>
57caade7ccSmrg#include <X11/Xlibint.h>
58caade7ccSmrg#include <X11/extensions/Xext.h>
59caade7ccSmrg#include <X11/extensions/extutil.h>
60485f0483Smrg#include <X11/extensions/sync.h>
61485f0483Smrg#include <X11/extensions/syncproto.h>
622d7aecc9Smrg#include <limits.h>
63caade7ccSmrg
64caade7ccSmrgstatic XExtensionInfo _sync_info_data;
65caade7ccSmrgstatic XExtensionInfo *sync_info = &_sync_info_data;
662d7aecc9Smrgstatic const char     *sync_extension_name = SYNC_NAME;
67caade7ccSmrg
68caade7ccSmrg#define SyncCheckExtension(dpy,i,val) \
69caade7ccSmrg		XextCheckExtension(dpy, i, sync_extension_name, val)
70caade7ccSmrg#define SyncSimpleCheckExtension(dpy,i) \
71caade7ccSmrg		XextSimpleCheckExtension(dpy, i, sync_extension_name)
72caade7ccSmrg
73caade7ccSmrgstatic int      close_display(Display *dpy, XExtCodes *codes);
74caade7ccSmrgstatic Bool wire_to_event(Display *dpy, XEvent *event, xEvent *wire);
75caade7ccSmrgstatic Status event_to_wire(Display *dpy, XEvent *event, xEvent *wire);
76caade7ccSmrgstatic char    *error_string(Display *dpy, int code, XExtCodes *codes,
77caade7ccSmrg			     char *buf, int n);
78caade7ccSmrg
79caade7ccSmrgstatic XExtensionHooks sync_extension_hooks = {
80caade7ccSmrg    NULL,			/* create_gc */
81caade7ccSmrg    NULL,			/* copy_gc */
82caade7ccSmrg    NULL,			/* flush_gc */
83caade7ccSmrg    NULL,			/* free_gc */
84caade7ccSmrg    NULL,			/* create_font */
85caade7ccSmrg    NULL,			/* free_font */
86caade7ccSmrg    close_display,		/* close_display */
87caade7ccSmrg    wire_to_event,		/* wire_to_event */
88caade7ccSmrg    event_to_wire,		/* event_to_wire */
89caade7ccSmrg    NULL,			/* error */
90caade7ccSmrg    error_string,		/* error_string */
91caade7ccSmrg};
92caade7ccSmrg
932d7aecc9Smrgstatic const char *sync_error_list[] = {
94caade7ccSmrg    "BadCounter",
95caade7ccSmrg    "BadAlarm",
96a5602400Smrg    "BadFence",
97caade7ccSmrg};
98caade7ccSmrg
99a5602400Smrgtypedef struct _SyncVersionInfoRec {
100a5602400Smrg    short major;
101a5602400Smrg    short minor;
102a5602400Smrg    int num_errors;
103a5602400Smrg} SyncVersionInfo;
104a5602400Smrg
105a5602400Smrgstatic /* const */ SyncVersionInfo supported_versions[] = {
106a5602400Smrg    { 3 /* major */, 0 /* minor */, 2 /* num_errors */ },
107a5602400Smrg    { 3 /* major */, 1 /* minor */, 3 /* num_errors */ },
108a5602400Smrg};
109a5602400Smrg
110a5602400Smrg#define NUM_VERSIONS (sizeof(supported_versions)/sizeof(supported_versions[0]))
11105a4e9a7Smrg#define GET_VERSION(info) ((const SyncVersionInfo*)(info)->data)
11205a4e9a7Smrg#define IS_VERSION_SUPPORTED(info) (!!(info))
113a5602400Smrg
114caade7ccSmrgstatic
115a5602400Smrgconst SyncVersionInfo* GetVersionInfo(Display *dpy)
116a5602400Smrg{
117a5602400Smrg    xSyncInitializeReply rep;
118a5602400Smrg    xSyncInitializeReq *req;
119a5602400Smrg    XExtCodes codes;
120a5602400Smrg    int i;
121a5602400Smrg
122a5602400Smrg    if (!XQueryExtension(dpy, sync_extension_name,
123a5602400Smrg                         &codes.major_opcode,
124a5602400Smrg                         &codes.first_event,
125a5602400Smrg                         &codes.first_error))
126a5602400Smrg        return NULL;
127a5602400Smrg
128a5602400Smrg    LockDisplay(dpy);
129a5602400Smrg    GetReq(SyncInitialize, req);
130a5602400Smrg    req->reqType = codes.major_opcode;
131a5602400Smrg    req->syncReqType = X_SyncInitialize;
132a5602400Smrg    req->majorVersion = SYNC_MAJOR_VERSION;
133a5602400Smrg    req->minorVersion = SYNC_MINOR_VERSION;
134a5602400Smrg    if (!_XReply(dpy, (xReply *) & rep, 0, xTrue))
135a5602400Smrg    {
136a5602400Smrg	UnlockDisplay(dpy);
137a5602400Smrg	SyncHandle();
138a5602400Smrg	return NULL;
139a5602400Smrg    }
140a5602400Smrg    UnlockDisplay(dpy);
141a5602400Smrg    SyncHandle();
142a5602400Smrg
143a5602400Smrg    for (i = 0; i < NUM_VERSIONS; i++) {
144a5602400Smrg	if (supported_versions[i].major == rep.majorVersion &&
145a5602400Smrg	    supported_versions[i].minor == rep.minorVersion) {
146a5602400Smrg	    return &supported_versions[i];
147a5602400Smrg	}
148a5602400Smrg    }
149a5602400Smrg
150a5602400Smrg    return NULL;
151a5602400Smrg}
152caade7ccSmrg
153caade7ccSmrgstatic
154a5602400SmrgXExtDisplayInfo *find_display_create_optional(Display *dpy, Bool create)
155a5602400Smrg{
156a5602400Smrg    XExtDisplayInfo *dpyinfo;
157a5602400Smrg
158a5602400Smrg    if (!sync_info) {
159a5602400Smrg        if (!(sync_info = XextCreateExtension())) return NULL;
160a5602400Smrg    }
161a5602400Smrg
162a5602400Smrg    if (!(dpyinfo = XextFindDisplay (sync_info, dpy)) && create) {
163a5602400Smrg        dpyinfo = XextAddDisplay(sync_info, dpy,
164a5602400Smrg                                 sync_extension_name,
165a5602400Smrg                                 &sync_extension_hooks,
166a5602400Smrg                                 XSyncNumberEvents,
167a5602400Smrg                                 (XPointer)GetVersionInfo(dpy));
168a5602400Smrg    }
169a5602400Smrg
170a5602400Smrg    return dpyinfo;
171a5602400Smrg}
172caade7ccSmrg
173caade7ccSmrgstatic
174a5602400SmrgXExtDisplayInfo *find_display (Display *dpy)
175a5602400Smrg{
176a5602400Smrg    return find_display_create_optional(dpy, True);
177a5602400Smrg}
178caade7ccSmrg
179a5602400Smrgstatic
180a5602400SmrgXEXT_GENERATE_CLOSE_DISPLAY(close_display, sync_info)
181a5602400Smrg
182a5602400Smrgstatic
183a5602400Smrgchar *error_string(Display *dpy, int code, XExtCodes *codes, char *buf, int n)
184a5602400Smrg{
185a5602400Smrg    XExtDisplayInfo *info = find_display_create_optional(dpy, False);
186a5602400Smrg    int nerr = IS_VERSION_SUPPORTED(info) ? GET_VERSION(info)->num_errors : 0;
187a5602400Smrg
188a5602400Smrg    code -= codes->first_error;
189a5602400Smrg    if (code >= 0 && code < nerr) {
190a5602400Smrg	char tmp[256];
1919b530083Smrg	snprintf (tmp, sizeof(tmp), "%s.%d", sync_extension_name, code);
192a5602400Smrg	XGetErrorDatabaseText (dpy, "XProtoError", tmp, sync_error_list[code], buf, n);
193a5602400Smrg	return buf;
194a5602400Smrg    }
195a5602400Smrg    return (char *)0;
196a5602400Smrg}
197caade7ccSmrg
198caade7ccSmrgstatic Bool
199caade7ccSmrgwire_to_event(Display *dpy, XEvent *event, xEvent *wire)
200caade7ccSmrg{
201caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
202caade7ccSmrg    XSyncCounterNotifyEvent *aevent;
203caade7ccSmrg    xSyncCounterNotifyEvent *awire;
204caade7ccSmrg    XSyncAlarmNotifyEvent *anl;
205caade7ccSmrg    xSyncAlarmNotifyEvent *ane;
206caade7ccSmrg
207caade7ccSmrg    SyncCheckExtension(dpy, info, False);
208caade7ccSmrg
209caade7ccSmrg    switch ((wire->u.u.type & 0x7F) - info->codes->first_event)
210caade7ccSmrg    {
211caade7ccSmrg      case XSyncCounterNotify:
212caade7ccSmrg	awire = (xSyncCounterNotifyEvent *) wire;
213caade7ccSmrg	aevent = (XSyncCounterNotifyEvent *) event;
214caade7ccSmrg	aevent->type = awire->type & 0x7F;
215caade7ccSmrg	aevent->serial = _XSetLastRequestRead(dpy,
216caade7ccSmrg					      (xGenericReply *) wire);
217caade7ccSmrg	aevent->send_event = (awire->type & 0x80) != 0;
218caade7ccSmrg	aevent->display = dpy;
219caade7ccSmrg	aevent->counter = awire->counter;
220caade7ccSmrg	XSyncIntsToValue(&aevent->wait_value, awire->wait_value_lo,
221caade7ccSmrg				    awire->wait_value_hi);
222caade7ccSmrg	XSyncIntsToValue(&aevent->counter_value,
223caade7ccSmrg				    awire->counter_value_lo,
224caade7ccSmrg				    awire->counter_value_hi);
225caade7ccSmrg	aevent->time = awire->time;
226caade7ccSmrg	aevent->count = awire->count;
227caade7ccSmrg	aevent->destroyed = awire->destroyed;
228caade7ccSmrg	return True;
229caade7ccSmrg
230caade7ccSmrg      case XSyncAlarmNotify:
231caade7ccSmrg	ane = (xSyncAlarmNotifyEvent *) wire;	/* ENCODING EVENT PTR */
232caade7ccSmrg	anl = (XSyncAlarmNotifyEvent *) event;	/* LIBRARY EVENT PTR */
233caade7ccSmrg	anl->type = ane->type & 0x7F;
234caade7ccSmrg	anl->serial = _XSetLastRequestRead(dpy,
235caade7ccSmrg					   (xGenericReply *) wire);
236caade7ccSmrg	anl->send_event = (ane->type & 0x80) != 0;
237caade7ccSmrg	anl->display = dpy;
238caade7ccSmrg	anl->alarm = ane->alarm;
239caade7ccSmrg	XSyncIntsToValue(&anl->counter_value,
240caade7ccSmrg				    ane->counter_value_lo,
241caade7ccSmrg				    ane->counter_value_hi);
242caade7ccSmrg	XSyncIntsToValue(&anl->alarm_value,
243caade7ccSmrg				    ane->alarm_value_lo,
244caade7ccSmrg				    ane->alarm_value_hi);
245caade7ccSmrg	anl->state = (XSyncAlarmState)ane->state;
246caade7ccSmrg	anl->time = ane->time;
247caade7ccSmrg	return True;
248caade7ccSmrg    }
249caade7ccSmrg
250caade7ccSmrg    return False;
251caade7ccSmrg}
252caade7ccSmrg
253caade7ccSmrgstatic Status
254caade7ccSmrgevent_to_wire(Display *dpy, XEvent *event, xEvent *wire)
255caade7ccSmrg{
256caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
257caade7ccSmrg    XSyncCounterNotifyEvent *aevent;
258caade7ccSmrg    xSyncCounterNotifyEvent *awire;
259caade7ccSmrg    XSyncAlarmNotifyEvent *anl;
260caade7ccSmrg    xSyncAlarmNotifyEvent *ane;
261caade7ccSmrg
262caade7ccSmrg    SyncCheckExtension(dpy, info, False);
263caade7ccSmrg
264caade7ccSmrg    switch ((event->type & 0x7F) - info->codes->first_event)
265caade7ccSmrg    {
266caade7ccSmrg      case XSyncCounterNotify:
267caade7ccSmrg	awire = (xSyncCounterNotifyEvent *) wire;
268caade7ccSmrg	aevent = (XSyncCounterNotifyEvent *) event;
269caade7ccSmrg	awire->type = aevent->type | (aevent->send_event ? 0x80 : 0);
270caade7ccSmrg	awire->sequenceNumber = aevent->serial & 0xFFFF;
271caade7ccSmrg	awire->counter = aevent->counter;
272caade7ccSmrg	awire->wait_value_lo = XSyncValueLow32(aevent->wait_value);
273caade7ccSmrg	awire->wait_value_hi = XSyncValueHigh32(aevent->wait_value);
274caade7ccSmrg	awire->counter_value_lo = XSyncValueLow32(aevent->counter_value);
275caade7ccSmrg	awire->counter_value_hi = XSyncValueHigh32(aevent->counter_value);
276caade7ccSmrg	awire->time = aevent->time;
277caade7ccSmrg	awire->count = aevent->count;
278caade7ccSmrg	awire->destroyed = aevent->destroyed;
279caade7ccSmrg	return True;
280caade7ccSmrg
281caade7ccSmrg      case XSyncAlarmNotify:
282caade7ccSmrg	ane = (xSyncAlarmNotifyEvent *) wire;	/* ENCODING EVENT PTR */
283caade7ccSmrg	anl = (XSyncAlarmNotifyEvent *) event;	/* LIBRARY EVENT PTR */
284caade7ccSmrg	ane->type = anl->type | (anl->send_event ? 0x80 : 0);
285caade7ccSmrg	ane->sequenceNumber = anl->serial & 0xFFFF;
286caade7ccSmrg	ane->alarm = anl->alarm;
287caade7ccSmrg	ane->counter_value_lo = XSyncValueLow32(anl->counter_value);
288caade7ccSmrg	ane->counter_value_hi = XSyncValueHigh32(anl->counter_value);
289caade7ccSmrg	ane->alarm_value_lo = XSyncValueLow32(anl->alarm_value);
290caade7ccSmrg	ane->alarm_value_hi = XSyncValueHigh32(anl->alarm_value);
291caade7ccSmrg	ane->state = anl->state;
292caade7ccSmrg	ane->time = anl->time;
293caade7ccSmrg	return True;
294caade7ccSmrg    }
295caade7ccSmrg    return False;
296caade7ccSmrg}
297caade7ccSmrg
298caade7ccSmrgStatus
299caade7ccSmrgXSyncQueryExtension(
300caade7ccSmrg    Display *dpy,
301caade7ccSmrg    int *event_base_return, int *error_base_return)
302caade7ccSmrg{
303caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
304caade7ccSmrg
305caade7ccSmrg    if (XextHasExtension(info))
306caade7ccSmrg    {
307caade7ccSmrg	*event_base_return = info->codes->first_event;
308caade7ccSmrg	*error_base_return = info->codes->first_error;
309caade7ccSmrg	return True;
310caade7ccSmrg    }
311caade7ccSmrg    else
312caade7ccSmrg	return False;
313caade7ccSmrg}
314caade7ccSmrg
315caade7ccSmrgStatus
316caade7ccSmrgXSyncInitialize(
317caade7ccSmrg    Display *dpy,
318caade7ccSmrg    int *major_version_return, int *minor_version_return)
319caade7ccSmrg{
320caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
321caade7ccSmrg
322caade7ccSmrg    SyncCheckExtension(dpy, info, False);
323caade7ccSmrg
324a5602400Smrg    if (IS_VERSION_SUPPORTED(info)) {
325a5602400Smrg	*major_version_return = GET_VERSION(info)->major;
326a5602400Smrg	*minor_version_return = GET_VERSION(info)->minor;
327a5602400Smrg
328a5602400Smrg	return True;
329a5602400Smrg    } else {
330caade7ccSmrg	return False;
331caade7ccSmrg    }
332caade7ccSmrg}
333caade7ccSmrg
334caade7ccSmrgXSyncSystemCounter *
335caade7ccSmrgXSyncListSystemCounters(Display *dpy, int *n_counters_return)
336caade7ccSmrg{
337caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
338caade7ccSmrg    xSyncListSystemCountersReply rep;
339caade7ccSmrg    xSyncListSystemCountersReq *req;
340caade7ccSmrg    XSyncSystemCounter *list = NULL;
341caade7ccSmrg
342caade7ccSmrg    SyncCheckExtension(dpy, info, NULL);
343caade7ccSmrg
344caade7ccSmrg    LockDisplay(dpy);
345caade7ccSmrg    GetReq(SyncListSystemCounters, req);
346caade7ccSmrg    req->reqType = info->codes->major_opcode;
347caade7ccSmrg    req->syncReqType = X_SyncListSystemCounters;
348caade7ccSmrg    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse))
349caade7ccSmrg	goto bail;
350caade7ccSmrg
351caade7ccSmrg    *n_counters_return = rep.nCounters;
352caade7ccSmrg    if (rep.nCounters > 0)
353caade7ccSmrg    {
354caade7ccSmrg	xSyncSystemCounter *pWireSysCounter, *pNextWireSysCounter;
3552d7aecc9Smrg	xSyncSystemCounter *pLastWireSysCounter;
356caade7ccSmrg	XSyncCounter counter;
3572d7aecc9Smrg	unsigned int replylen;
358caade7ccSmrg	int i;
359caade7ccSmrg
3602d7aecc9Smrg	if (rep.nCounters < (INT_MAX / sizeof(XSyncSystemCounter)))
3612d7aecc9Smrg	    list = Xmalloc(rep.nCounters * sizeof(XSyncSystemCounter));
3622d7aecc9Smrg	if (rep.length < (INT_MAX >> 2)) {
3632d7aecc9Smrg	    replylen = rep.length << 2;
3642d7aecc9Smrg	    pWireSysCounter = Xmalloc (replylen + sizeof(XSyncCounter));
3652d7aecc9Smrg	    /* +1 to leave room for last counter read-ahead */
3662d7aecc9Smrg	    pLastWireSysCounter = (xSyncSystemCounter *)
3672d7aecc9Smrg		((char *)pWireSysCounter) + replylen;
3682d7aecc9Smrg	} else {
3692d7aecc9Smrg	    replylen = 0;
3702d7aecc9Smrg	    pWireSysCounter = NULL;
3712d7aecc9Smrg	}
372caade7ccSmrg
373caade7ccSmrg	if ((!list) || (!pWireSysCounter))
374caade7ccSmrg	{
3752d7aecc9Smrg	    Xfree(list);
3762d7aecc9Smrg	    Xfree(pWireSysCounter);
3772d7aecc9Smrg	    _XEatDataWords(dpy, rep.length);
378caade7ccSmrg	    list = NULL;
379caade7ccSmrg	    goto bail;
380caade7ccSmrg	}
381caade7ccSmrg
382caade7ccSmrg	_XReadPad(dpy, (char *)pWireSysCounter, replylen);
383caade7ccSmrg
384caade7ccSmrg	counter = pWireSysCounter->counter;
385caade7ccSmrg	for (i = 0; i < rep.nCounters; i++)
386caade7ccSmrg	{
387caade7ccSmrg	    list[i].counter = counter;
388caade7ccSmrg	    XSyncIntsToValue(&list[i].resolution,
389caade7ccSmrg					pWireSysCounter->resolution_lo,
390caade7ccSmrg					pWireSysCounter->resolution_hi);
391caade7ccSmrg
392caade7ccSmrg	    /* we may be about to clobber the counter field of the
393caade7ccSmrg	     * next syscounter because we have to add a null terminator
394caade7ccSmrg	     * to the counter name string.  So we save the next counter
395caade7ccSmrg	     * here.
396caade7ccSmrg	     */
397caade7ccSmrg	    pNextWireSysCounter = (xSyncSystemCounter *)
398caade7ccSmrg		(((char *)pWireSysCounter) + ((SIZEOF(xSyncSystemCounter) +
399caade7ccSmrg				     pWireSysCounter->name_length + 3) & ~3));
4002d7aecc9Smrg	    /* Make sure we haven't gone too far */
4012d7aecc9Smrg	    if (pNextWireSysCounter > pLastWireSysCounter) {
4022d7aecc9Smrg		Xfree(list);
4032d7aecc9Smrg		Xfree(pWireSysCounter);
4042d7aecc9Smrg		list = NULL;
4052d7aecc9Smrg		goto bail;
4062d7aecc9Smrg	    }
4072d7aecc9Smrg
408caade7ccSmrg	    counter = pNextWireSysCounter->counter;
409caade7ccSmrg
410caade7ccSmrg	    list[i].name = ((char *)pWireSysCounter) +
411caade7ccSmrg						SIZEOF(xSyncSystemCounter);
412caade7ccSmrg	    /* null-terminate the string */
413caade7ccSmrg	    *(list[i].name + pWireSysCounter->name_length) = '\0';
414caade7ccSmrg	    pWireSysCounter = pNextWireSysCounter;
415caade7ccSmrg	}
416caade7ccSmrg    }
417caade7ccSmrg
418caade7ccSmrgbail:
419caade7ccSmrg    UnlockDisplay(dpy);
420caade7ccSmrg    SyncHandle();
421caade7ccSmrg    return list;
422caade7ccSmrg}
423caade7ccSmrg
424caade7ccSmrgvoid
425caade7ccSmrgXSyncFreeSystemCounterList(XSyncSystemCounter *list)
426caade7ccSmrg{
427caade7ccSmrg    if (list)
428caade7ccSmrg    {
429caade7ccSmrg	Xfree( ((char *)list[0].name) - SIZEOF(xSyncSystemCounter));
430caade7ccSmrg	Xfree(list);
431caade7ccSmrg    }
432caade7ccSmrg}
433caade7ccSmrg
434caade7ccSmrg
4352d7aecc9SmrgXSyncCounter
436caade7ccSmrgXSyncCreateCounter(Display *dpy, XSyncValue initial_value)
437caade7ccSmrg{
438caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
439caade7ccSmrg    xSyncCreateCounterReq *req;
440caade7ccSmrg
441caade7ccSmrg    SyncCheckExtension(dpy, info, None);
442caade7ccSmrg
443caade7ccSmrg    LockDisplay(dpy);
444caade7ccSmrg    GetReq(SyncCreateCounter, req);
445caade7ccSmrg    req->reqType = info->codes->major_opcode;
446caade7ccSmrg    req->syncReqType = X_SyncCreateCounter;
447caade7ccSmrg
448caade7ccSmrg    req->cid = XAllocID(dpy);
449caade7ccSmrg    req->initial_value_lo = XSyncValueLow32(initial_value);
450caade7ccSmrg    req->initial_value_hi = XSyncValueHigh32(initial_value);
451caade7ccSmrg
452caade7ccSmrg    UnlockDisplay(dpy);
453caade7ccSmrg    SyncHandle();
454caade7ccSmrg    return req->cid;
455caade7ccSmrg}
456caade7ccSmrg
457caade7ccSmrgStatus
458caade7ccSmrgXSyncSetCounter(Display *dpy, XSyncCounter counter, XSyncValue value)
459caade7ccSmrg{
460caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
461caade7ccSmrg    xSyncSetCounterReq *req;
462caade7ccSmrg
463caade7ccSmrg    SyncCheckExtension(dpy, info, False);
464caade7ccSmrg
465caade7ccSmrg    LockDisplay(dpy);
466caade7ccSmrg    GetReq(SyncSetCounter, req);
467caade7ccSmrg    req->reqType = info->codes->major_opcode;
468caade7ccSmrg    req->syncReqType = X_SyncSetCounter;
469caade7ccSmrg    req->cid = counter;
470caade7ccSmrg    req->value_lo = XSyncValueLow32(value);
471caade7ccSmrg    req->value_hi = XSyncValueHigh32(value);
472caade7ccSmrg    UnlockDisplay(dpy);
473caade7ccSmrg    SyncHandle();
474caade7ccSmrg    return True;
475caade7ccSmrg}
476caade7ccSmrg
477caade7ccSmrgStatus
478caade7ccSmrgXSyncChangeCounter(Display *dpy, XSyncCounter counter, XSyncValue value)
479caade7ccSmrg{
480caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
481caade7ccSmrg    xSyncChangeCounterReq *req;
482caade7ccSmrg
483caade7ccSmrg    SyncCheckExtension(dpy, info, False);
484caade7ccSmrg
485caade7ccSmrg    LockDisplay(dpy);
486caade7ccSmrg    GetReq(SyncChangeCounter, req);
487caade7ccSmrg    req->reqType = info->codes->major_opcode;
488caade7ccSmrg    req->syncReqType = X_SyncChangeCounter;
489caade7ccSmrg    req->cid = counter;
490caade7ccSmrg    req->value_lo = XSyncValueLow32(value);
491caade7ccSmrg    req->value_hi = XSyncValueHigh32(value);
492caade7ccSmrg    UnlockDisplay(dpy);
493caade7ccSmrg    SyncHandle();
494caade7ccSmrg    return True;
495caade7ccSmrg}
496caade7ccSmrg
497caade7ccSmrgStatus
498caade7ccSmrgXSyncDestroyCounter(Display *dpy, XSyncCounter counter)
499caade7ccSmrg{
500caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
501caade7ccSmrg    xSyncDestroyCounterReq *req;
502caade7ccSmrg
503caade7ccSmrg    SyncCheckExtension(dpy, info, False);
504caade7ccSmrg
505caade7ccSmrg    LockDisplay(dpy);
506caade7ccSmrg    GetReq(SyncDestroyCounter, req);
507caade7ccSmrg    req->reqType = info->codes->major_opcode;
508caade7ccSmrg    req->syncReqType = X_SyncDestroyCounter;
509caade7ccSmrg    req->counter = counter;
510caade7ccSmrg    UnlockDisplay(dpy);
511caade7ccSmrg    SyncHandle();
512caade7ccSmrg
513caade7ccSmrg    return True;
514caade7ccSmrg}
515caade7ccSmrg
516caade7ccSmrgStatus
517caade7ccSmrgXSyncQueryCounter(Display *dpy, XSyncCounter counter, XSyncValue *value_return)
518caade7ccSmrg{
519caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
520caade7ccSmrg    xSyncQueryCounterReply rep;
521caade7ccSmrg    xSyncQueryCounterReq *req;
522caade7ccSmrg
523caade7ccSmrg    SyncCheckExtension(dpy, info, False);
524caade7ccSmrg
525caade7ccSmrg    LockDisplay(dpy);
526caade7ccSmrg    GetReq(SyncQueryCounter, req);
527caade7ccSmrg    req->reqType = info->codes->major_opcode;
528caade7ccSmrg    req->syncReqType = X_SyncQueryCounter;
529caade7ccSmrg    req->counter = counter;
530caade7ccSmrg    if (!_XReply(dpy, (xReply *) & rep, 0, xTrue))
531caade7ccSmrg    {
532caade7ccSmrg	UnlockDisplay(dpy);
533caade7ccSmrg	SyncHandle();
534caade7ccSmrg	return False;
535caade7ccSmrg    }
536caade7ccSmrg    XSyncIntsToValue(value_return, rep.value_lo, rep.value_hi);
537caade7ccSmrg    UnlockDisplay(dpy);
538caade7ccSmrg    SyncHandle();
539caade7ccSmrg
540caade7ccSmrg    return True;
541caade7ccSmrg}
542caade7ccSmrg
543caade7ccSmrg
544caade7ccSmrgStatus
545caade7ccSmrgXSyncAwait(Display *dpy, XSyncWaitCondition *wait_list, int n_conditions)
546caade7ccSmrg{
547caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
548caade7ccSmrg    XSyncWaitCondition *wait_item = wait_list;
549caade7ccSmrg    xSyncAwaitReq  *req;
550caade7ccSmrg    unsigned int    len;
551caade7ccSmrg
552caade7ccSmrg    SyncCheckExtension(dpy, info, False);
553caade7ccSmrg
554caade7ccSmrg    LockDisplay(dpy);
555caade7ccSmrg    GetReq(SyncAwait, req);
556caade7ccSmrg    req->reqType = info->codes->major_opcode;
557caade7ccSmrg    req->syncReqType = X_SyncAwait;
558caade7ccSmrg    len = (n_conditions * SIZEOF(xSyncWaitCondition)) >> 2;
559caade7ccSmrg    SetReqLen(req, len, len /* XXX */ );
560caade7ccSmrg
561caade7ccSmrg    while (n_conditions--)
562caade7ccSmrg    {
563caade7ccSmrg	xSyncWaitCondition  wc;
564caade7ccSmrg	wc.counter = wait_item->trigger.counter;
565caade7ccSmrg	wc.value_type = wait_item->trigger.value_type;
566caade7ccSmrg	wc.wait_value_lo = XSyncValueLow32(wait_item->trigger.wait_value);
567caade7ccSmrg	wc.wait_value_hi = XSyncValueHigh32(wait_item->trigger.wait_value);
568caade7ccSmrg	wc.test_type = wait_item->trigger.test_type;
569caade7ccSmrg	wc.event_threshold_lo = XSyncValueLow32(wait_item->event_threshold);
570caade7ccSmrg	wc.event_threshold_hi = XSyncValueHigh32(wait_item->event_threshold);
571caade7ccSmrg	Data(dpy, (char *)&wc, SIZEOF(xSyncWaitCondition));
572caade7ccSmrg	wait_item++;		/* get next trigger */
573caade7ccSmrg    }
574caade7ccSmrg
575caade7ccSmrg    UnlockDisplay(dpy);
576caade7ccSmrg    SyncHandle();
577caade7ccSmrg    return True;
578caade7ccSmrg}
579caade7ccSmrg
580caade7ccSmrgstatic void
581caade7ccSmrg_XProcessAlarmAttributes(Display *dpy, xSyncChangeAlarmReq *req,
582caade7ccSmrg			 unsigned long valuemask,
583caade7ccSmrg			 XSyncAlarmAttributes *attributes)
584caade7ccSmrg{
585caade7ccSmrg
586caade7ccSmrg    unsigned long  values[32];
587caade7ccSmrg    unsigned long *value = values;
588caade7ccSmrg    unsigned int    nvalues;
589caade7ccSmrg
590caade7ccSmrg    if (valuemask & XSyncCACounter)
591caade7ccSmrg	*value++ = attributes->trigger.counter;
592caade7ccSmrg
593caade7ccSmrg    if (valuemask & XSyncCAValueType)
594caade7ccSmrg	*value++ = attributes->trigger.value_type;
595caade7ccSmrg
596caade7ccSmrg    if (valuemask & XSyncCAValue)
597caade7ccSmrg    {
598caade7ccSmrg	*value++ = XSyncValueHigh32(attributes->trigger.wait_value);
599caade7ccSmrg	*value++ = XSyncValueLow32(attributes->trigger.wait_value);
600caade7ccSmrg    }
601caade7ccSmrg
602caade7ccSmrg    if (valuemask & XSyncCATestType)
603caade7ccSmrg	*value++ = attributes->trigger.test_type;
604caade7ccSmrg
605caade7ccSmrg    if (valuemask & XSyncCADelta)
606caade7ccSmrg    {
607caade7ccSmrg	*value++ = XSyncValueHigh32(attributes->delta);
608caade7ccSmrg	*value++ = XSyncValueLow32(attributes->delta);
609caade7ccSmrg    }
610caade7ccSmrg
611caade7ccSmrg    if (valuemask & XSyncCAEvents)
612caade7ccSmrg	*value++ = attributes->events;
613caade7ccSmrg
614caade7ccSmrg    /* N.B. the 'state' field cannot be set or changed */
615caade7ccSmrg    req->length += (nvalues = value - values);
616caade7ccSmrg    nvalues <<= 2;		/* watch out for macros... */
617caade7ccSmrg
618caade7ccSmrg    Data32(dpy, (long *) values, (long) nvalues);
619caade7ccSmrg}
620caade7ccSmrg
621caade7ccSmrgXSyncAlarm
622caade7ccSmrgXSyncCreateAlarm(
623caade7ccSmrg    Display *dpy,
624caade7ccSmrg    unsigned long values_mask,
625caade7ccSmrg    XSyncAlarmAttributes *values)
626caade7ccSmrg{
627caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
628caade7ccSmrg    xSyncCreateAlarmReq *req;
629caade7ccSmrg    XSyncAlarm      aid;
630caade7ccSmrg
631caade7ccSmrg    SyncCheckExtension(dpy, info, False);
632caade7ccSmrg
633caade7ccSmrg    LockDisplay(dpy);
634caade7ccSmrg    GetReq(SyncCreateAlarm, req);
635caade7ccSmrg    req->reqType = info->codes->major_opcode;
636caade7ccSmrg    req->syncReqType = X_SyncCreateAlarm;
637caade7ccSmrg    req->id = aid = XAllocID(dpy);
638caade7ccSmrg    values_mask &= XSyncCACounter | XSyncCAValueType | XSyncCAValue
639caade7ccSmrg			| XSyncCATestType | XSyncCADelta | XSyncCAEvents;
640caade7ccSmrg    if ((req->valueMask = values_mask))
641caade7ccSmrg	_XProcessAlarmAttributes(dpy, (xSyncChangeAlarmReq *) req,
642caade7ccSmrg				 values_mask, values);
643caade7ccSmrg    UnlockDisplay(dpy);
644caade7ccSmrg    SyncHandle();
645caade7ccSmrg    return aid;
646caade7ccSmrg}
647caade7ccSmrg
648caade7ccSmrgStatus
649caade7ccSmrgXSyncDestroyAlarm(Display *dpy, XSyncAlarm alarm)
650caade7ccSmrg{
651caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
652caade7ccSmrg    xSyncDestroyAlarmReq *req;
653caade7ccSmrg
654caade7ccSmrg    SyncCheckExtension(dpy, info, False);
655caade7ccSmrg
656caade7ccSmrg    LockDisplay(dpy);
657caade7ccSmrg    GetReq(SyncDestroyAlarm, req);
658caade7ccSmrg    req->reqType = info->codes->major_opcode;
659caade7ccSmrg    req->syncReqType = X_SyncDestroyAlarm;
660caade7ccSmrg    req->alarm = alarm;
661caade7ccSmrg    UnlockDisplay(dpy);
662caade7ccSmrg    SyncHandle();
663caade7ccSmrg    return True;
664caade7ccSmrg}
665caade7ccSmrg
666caade7ccSmrgStatus
667caade7ccSmrgXSyncQueryAlarm(
668caade7ccSmrg    Display *dpy,
669caade7ccSmrg    XSyncAlarm alarm,
670caade7ccSmrg    XSyncAlarmAttributes *values_return)
671caade7ccSmrg{
672caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
673caade7ccSmrg    xSyncQueryAlarmReq *req;
674caade7ccSmrg    xSyncQueryAlarmReply rep;
675caade7ccSmrg
676caade7ccSmrg    SyncCheckExtension(dpy, info, False);
677caade7ccSmrg
678caade7ccSmrg    LockDisplay(dpy);
679caade7ccSmrg    GetReq(SyncQueryAlarm, req);
680caade7ccSmrg    req->reqType = info->codes->major_opcode;
681caade7ccSmrg    req->syncReqType = X_SyncQueryAlarm;
682caade7ccSmrg    req->alarm = alarm;
683caade7ccSmrg
684caade7ccSmrg    if (!(_XReply(dpy, (xReply *) & rep,
685caade7ccSmrg    ((SIZEOF(xSyncQueryAlarmReply) - SIZEOF(xGenericReply)) >> 2), xFalse)))
686caade7ccSmrg    {
687caade7ccSmrg	UnlockDisplay(dpy);
688caade7ccSmrg	SyncHandle();
689caade7ccSmrg	return False;
690caade7ccSmrg    }
691caade7ccSmrg
692caade7ccSmrg    values_return->trigger.counter = rep.counter;
693caade7ccSmrg    values_return->trigger.value_type = (XSyncValueType)rep.value_type;
694caade7ccSmrg    XSyncIntsToValue(&values_return->trigger.wait_value,
695caade7ccSmrg				rep.wait_value_lo, rep.wait_value_hi);
696caade7ccSmrg    values_return->trigger.test_type = (XSyncTestType)rep.test_type;
697caade7ccSmrg    XSyncIntsToValue(&values_return->delta, rep.delta_lo,
698caade7ccSmrg				rep.delta_hi);
699caade7ccSmrg    values_return->events = rep.events;
700caade7ccSmrg    values_return->state = (XSyncAlarmState)rep.state;
701caade7ccSmrg    UnlockDisplay(dpy);
702caade7ccSmrg    SyncHandle();
703caade7ccSmrg    return True;
704caade7ccSmrg}
705caade7ccSmrg
706caade7ccSmrgStatus
707caade7ccSmrgXSyncChangeAlarm(
708caade7ccSmrg    Display *dpy,
709caade7ccSmrg    XSyncAlarm alarm,
710caade7ccSmrg    unsigned long values_mask,
711caade7ccSmrg    XSyncAlarmAttributes *values)
712caade7ccSmrg{
713caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
714caade7ccSmrg    xSyncChangeAlarmReq *req;
715caade7ccSmrg
716caade7ccSmrg    SyncCheckExtension(dpy, info, False);
717caade7ccSmrg
718caade7ccSmrg    LockDisplay(dpy);
719caade7ccSmrg    GetReq(SyncChangeAlarm, req);
720caade7ccSmrg    req->reqType = info->codes->major_opcode;
721caade7ccSmrg    req->syncReqType = X_SyncChangeAlarm;
722caade7ccSmrg    req->alarm = alarm;
723caade7ccSmrg    values_mask &= XSyncCACounter | XSyncCAValueType | XSyncCAValue
724caade7ccSmrg		 | XSyncCATestType | XSyncCADelta | XSyncCAEvents;
725caade7ccSmrg    if ((req->valueMask = values_mask))
726caade7ccSmrg	_XProcessAlarmAttributes(dpy, req, values_mask, values);
727caade7ccSmrg    UnlockDisplay(dpy);
728caade7ccSmrg    SyncHandle();
729caade7ccSmrg    return True;
730caade7ccSmrg}
731caade7ccSmrg
732caade7ccSmrgStatus
733caade7ccSmrgXSyncSetPriority(
734caade7ccSmrg    Display *dpy,
735caade7ccSmrg    XID client_resource_id,
736caade7ccSmrg    int priority)
737caade7ccSmrg{
738caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
739caade7ccSmrg    xSyncSetPriorityReq *req;
740caade7ccSmrg
741caade7ccSmrg    SyncCheckExtension(dpy, info, False);
742caade7ccSmrg
743caade7ccSmrg    LockDisplay(dpy);
744caade7ccSmrg    GetReq(SyncSetPriority, req);
745caade7ccSmrg    req->reqType = info->codes->major_opcode;
746caade7ccSmrg    req->syncReqType = X_SyncSetPriority;
747caade7ccSmrg    req->id = client_resource_id;
748caade7ccSmrg    req->priority = priority;
749caade7ccSmrg    UnlockDisplay(dpy);
750caade7ccSmrg    SyncHandle();
751caade7ccSmrg    return True;
752caade7ccSmrg}
753caade7ccSmrg
754caade7ccSmrgStatus
755caade7ccSmrgXSyncGetPriority(Display *dpy, XID client_resource_id, int *return_priority)
756caade7ccSmrg{
757caade7ccSmrg    XExtDisplayInfo *info = find_display(dpy);
758caade7ccSmrg    xSyncGetPriorityReply rep;
759caade7ccSmrg    xSyncGetPriorityReq *req;
760caade7ccSmrg
761caade7ccSmrg    SyncCheckExtension(dpy, info, False);
762caade7ccSmrg
763caade7ccSmrg    LockDisplay(dpy);
764caade7ccSmrg    GetReq(SyncGetPriority, req);
765caade7ccSmrg    req->reqType = info->codes->major_opcode;
766caade7ccSmrg    req->syncReqType = X_SyncGetPriority;
767caade7ccSmrg    req->id = client_resource_id;
768caade7ccSmrg
769caade7ccSmrg    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse))
770caade7ccSmrg    {
771caade7ccSmrg	UnlockDisplay(dpy);
772caade7ccSmrg	SyncHandle();
773caade7ccSmrg	return False;
774caade7ccSmrg    }
775caade7ccSmrg    if (return_priority)
776caade7ccSmrg	*return_priority = rep.priority;
777caade7ccSmrg
778caade7ccSmrg    UnlockDisplay(dpy);
779caade7ccSmrg    SyncHandle();
780caade7ccSmrg    return True;
781caade7ccSmrg}
782caade7ccSmrg
783a5602400SmrgXSyncFence
784a5602400SmrgXSyncCreateFence(Display *dpy, Drawable d, Bool initially_triggered)
785a5602400Smrg{
786a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
787a5602400Smrg    xSyncCreateFenceReq *req;
788a5602400Smrg    XSyncFence id;
789a5602400Smrg
790a5602400Smrg    SyncCheckExtension(dpy, info, None);
791a5602400Smrg
792a5602400Smrg    LockDisplay(dpy);
793a5602400Smrg    GetReq(SyncCreateFence, req);
794a5602400Smrg    req->reqType = info->codes->major_opcode;
795a5602400Smrg    req->syncReqType = X_SyncCreateFence;
796a5602400Smrg
797a5602400Smrg    req->d = d;
798a5602400Smrg    id = req->fid = XAllocID(dpy);
799a5602400Smrg    req->initially_triggered = initially_triggered;
800a5602400Smrg
801a5602400Smrg    UnlockDisplay(dpy);
802a5602400Smrg    SyncHandle();
803a5602400Smrg    return id;
804a5602400Smrg}
805a5602400Smrg
806a5602400SmrgBool
807a5602400SmrgXSyncTriggerFence(Display *dpy, XSyncFence fence)
808a5602400Smrg{
809a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
810a5602400Smrg    xSyncTriggerFenceReq *req;
811a5602400Smrg
812a5602400Smrg    SyncCheckExtension(dpy, info, None);
813a5602400Smrg
814a5602400Smrg    LockDisplay(dpy);
815a5602400Smrg    GetReq(SyncTriggerFence, req);
816a5602400Smrg    req->reqType = info->codes->major_opcode;
817a5602400Smrg    req->syncReqType = X_SyncTriggerFence;
818a5602400Smrg
819a5602400Smrg    req->fid = fence;
820a5602400Smrg
821a5602400Smrg    UnlockDisplay(dpy);
822a5602400Smrg    SyncHandle();
823a5602400Smrg    return True;
824a5602400Smrg}
825a5602400Smrg
826a5602400SmrgBool
827a5602400SmrgXSyncResetFence(Display *dpy, XSyncFence fence)
828a5602400Smrg{
829a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
830a5602400Smrg    xSyncResetFenceReq *req;
831a5602400Smrg
832a5602400Smrg    SyncCheckExtension(dpy, info, None);
833a5602400Smrg
834a5602400Smrg    LockDisplay(dpy);
835a5602400Smrg    GetReq(SyncResetFence, req);
836a5602400Smrg    req->reqType = info->codes->major_opcode;
837a5602400Smrg    req->syncReqType = X_SyncResetFence;
838a5602400Smrg
839a5602400Smrg    req->fid = fence;
840a5602400Smrg
841a5602400Smrg    UnlockDisplay(dpy);
842a5602400Smrg    SyncHandle();
843a5602400Smrg    return True;
844a5602400Smrg}
845a5602400Smrg
846a5602400SmrgBool
847a5602400SmrgXSyncDestroyFence(Display *dpy, XSyncFence fence)
848a5602400Smrg{
849a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
850a5602400Smrg    xSyncDestroyFenceReq *req;
851a5602400Smrg
852a5602400Smrg    SyncCheckExtension(dpy, info, None);
853a5602400Smrg
854a5602400Smrg    LockDisplay(dpy);
855a5602400Smrg    GetReq(SyncDestroyFence, req);
856a5602400Smrg    req->reqType = info->codes->major_opcode;
857a5602400Smrg    req->syncReqType = X_SyncDestroyFence;
858a5602400Smrg
859a5602400Smrg    req->fid = fence;
860a5602400Smrg
861a5602400Smrg    UnlockDisplay(dpy);
862a5602400Smrg    SyncHandle();
863a5602400Smrg    return True;
864a5602400Smrg}
865a5602400Smrg
866a5602400SmrgBool
867a5602400SmrgXSyncQueryFence(Display *dpy, XSyncFence fence, Bool *triggered)
868a5602400Smrg{
869a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
870a5602400Smrg    xSyncQueryFenceReply rep;
871a5602400Smrg    xSyncQueryFenceReq *req;
872a5602400Smrg
873a5602400Smrg    SyncCheckExtension(dpy, info, None);
874a5602400Smrg
875a5602400Smrg    LockDisplay(dpy);
876a5602400Smrg    GetReq(SyncQueryFence, req);
877a5602400Smrg    req->reqType = info->codes->major_opcode;
878a5602400Smrg    req->syncReqType = X_SyncQueryFence;
879a5602400Smrg    req->fid = fence;
880a5602400Smrg
881a5602400Smrg    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse))
882a5602400Smrg    {
883a5602400Smrg	UnlockDisplay(dpy);
884a5602400Smrg	SyncHandle();
885a5602400Smrg	return False;
886a5602400Smrg    }
887a5602400Smrg    if (triggered)
888a5602400Smrg	*triggered = rep.triggered;
889a5602400Smrg
890a5602400Smrg    UnlockDisplay(dpy);
891a5602400Smrg    SyncHandle();
892a5602400Smrg    return True;
893a5602400Smrg}
894a5602400Smrg
895a5602400SmrgBool
896a5602400SmrgXSyncAwaitFence(Display *dpy, const XSyncFence *fence_list, int n_fences)
897a5602400Smrg{
898a5602400Smrg    XExtDisplayInfo *info = find_display(dpy);
899a5602400Smrg    xSyncAwaitFenceReq  *req;
900a5602400Smrg
901a5602400Smrg    SyncCheckExtension(dpy, info, False);
902a5602400Smrg
903a5602400Smrg    LockDisplay(dpy);
904a5602400Smrg    GetReq(SyncAwaitFence, req);
905a5602400Smrg    req->reqType = info->codes->major_opcode;
906a5602400Smrg    req->syncReqType = X_SyncAwaitFence;
907a5602400Smrg    SetReqLen(req, n_fences, n_fences);
908a5602400Smrg
909a5602400Smrg    Data32(dpy, (char *)fence_list, sizeof(CARD32) * n_fences);
910a5602400Smrg
911a5602400Smrg    UnlockDisplay(dpy);
912a5602400Smrg    SyncHandle();
913a5602400Smrg    return True;
914a5602400Smrg}
915a5602400Smrg
916caade7ccSmrg/*
917caade7ccSmrg *  Functions corresponding to the macros for manipulating 64-bit values
918caade7ccSmrg */
919caade7ccSmrg
920caade7ccSmrgvoid
921caade7ccSmrgXSyncIntToValue(XSyncValue *pv, int i)
922caade7ccSmrg{
923caade7ccSmrg    _XSyncIntToValue(pv,i);
924caade7ccSmrg}
925caade7ccSmrg
926caade7ccSmrgvoid
927caade7ccSmrgXSyncIntsToValue(XSyncValue *pv, unsigned int l, int h)
928caade7ccSmrg{
929caade7ccSmrg    _XSyncIntsToValue(pv, l, h);
930caade7ccSmrg}
931caade7ccSmrg
932caade7ccSmrgBool
933caade7ccSmrgXSyncValueGreaterThan(XSyncValue a, XSyncValue b)
934caade7ccSmrg{
935caade7ccSmrg    return _XSyncValueGreaterThan(a, b);
936caade7ccSmrg}
937caade7ccSmrg
938caade7ccSmrgBool
939caade7ccSmrgXSyncValueLessThan(XSyncValue a, XSyncValue b)
940caade7ccSmrg{
941caade7ccSmrg    return _XSyncValueLessThan(a, b);
942caade7ccSmrg}
943caade7ccSmrg
944caade7ccSmrgBool
945caade7ccSmrgXSyncValueGreaterOrEqual(XSyncValue a, XSyncValue b)
946caade7ccSmrg{
947caade7ccSmrg    return _XSyncValueGreaterOrEqual(a, b);
948caade7ccSmrg}
949caade7ccSmrg
950caade7ccSmrgBool
951caade7ccSmrgXSyncValueLessOrEqual(XSyncValue a, XSyncValue b)
952caade7ccSmrg{
953caade7ccSmrg    return _XSyncValueLessOrEqual(a, b);
954caade7ccSmrg}
955caade7ccSmrg
956caade7ccSmrgBool
957caade7ccSmrgXSyncValueEqual(XSyncValue a, XSyncValue b)
958caade7ccSmrg{
959caade7ccSmrg    return _XSyncValueEqual(a, b);
960caade7ccSmrg}
961caade7ccSmrg
962caade7ccSmrgBool
963caade7ccSmrgXSyncValueIsNegative(XSyncValue v)
964caade7ccSmrg{
965caade7ccSmrg    return _XSyncValueIsNegative(v);
966caade7ccSmrg}
967caade7ccSmrg
968caade7ccSmrgBool
969caade7ccSmrgXSyncValueIsZero(XSyncValue a)
970caade7ccSmrg{
971caade7ccSmrg    return _XSyncValueIsZero(a);
972caade7ccSmrg}
973caade7ccSmrg
974caade7ccSmrgBool
975caade7ccSmrgXSyncValueIsPositive(XSyncValue v)
976caade7ccSmrg{
977caade7ccSmrg    return _XSyncValueIsPositive(v);
978caade7ccSmrg}
979caade7ccSmrg
980caade7ccSmrgunsigned int
981caade7ccSmrgXSyncValueLow32(XSyncValue v)
982caade7ccSmrg{
983caade7ccSmrg    return _XSyncValueLow32(v);
984caade7ccSmrg}
985caade7ccSmrg
986caade7ccSmrgint
987caade7ccSmrgXSyncValueHigh32(XSyncValue v)
988caade7ccSmrg{
989caade7ccSmrg    return _XSyncValueHigh32(v);
990caade7ccSmrg}
991caade7ccSmrg
992caade7ccSmrgvoid
993caade7ccSmrgXSyncValueAdd(XSyncValue *presult, XSyncValue a, XSyncValue b, Bool *poverflow)
994caade7ccSmrg{
995caade7ccSmrg    _XSyncValueAdd(presult, a, b, poverflow);
996caade7ccSmrg}
997caade7ccSmrg
998caade7ccSmrgvoid
999caade7ccSmrgXSyncValueSubtract(
1000caade7ccSmrg    XSyncValue *presult,
1001caade7ccSmrg    XSyncValue a, XSyncValue b,
1002caade7ccSmrg    Bool *poverflow)
1003caade7ccSmrg{
1004caade7ccSmrg    _XSyncValueSubtract(presult, a, b, poverflow);
1005caade7ccSmrg}
1006caade7ccSmrg
1007caade7ccSmrgvoid
1008caade7ccSmrgXSyncMaxValue(XSyncValue *pv)
1009caade7ccSmrg{
1010caade7ccSmrg    _XSyncMaxValue(pv);
1011caade7ccSmrg}
1012caade7ccSmrg
1013caade7ccSmrgvoid
1014caade7ccSmrgXSyncMinValue(XSyncValue *pv)
1015caade7ccSmrg{
1016caade7ccSmrg    _XSyncMinValue(pv);
1017caade7ccSmrg}
1018