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