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