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