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