1d722e3fbSopenharmony_ci/* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.13 2002/10/30 12:51:25 alanh Exp $ */ 2d722e3fbSopenharmony_ci/************************************************************************** 3d722e3fbSopenharmony_ci 4d722e3fbSopenharmony_ciCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 5d722e3fbSopenharmony_ciCopyright 2000 VA Linux Systems, Inc. 6d722e3fbSopenharmony_ciAll Rights Reserved. 7d722e3fbSopenharmony_ci 8d722e3fbSopenharmony_ciPermission is hereby granted, free of charge, to any person obtaining a 9d722e3fbSopenharmony_cicopy of this software and associated documentation files (the 10d722e3fbSopenharmony_ci"Software"), to deal in the Software without restriction, including 11d722e3fbSopenharmony_ciwithout limitation the rights to use, copy, modify, merge, publish, 12d722e3fbSopenharmony_cidistribute, sub license, and/or sell copies of the Software, and to 13d722e3fbSopenharmony_cipermit persons to whom the Software is furnished to do so, subject to 14d722e3fbSopenharmony_cithe following conditions: 15d722e3fbSopenharmony_ci 16d722e3fbSopenharmony_ciThe above copyright notice and this permission notice (including the 17d722e3fbSopenharmony_cinext paragraph) shall be included in all copies or substantial portions 18d722e3fbSopenharmony_ciof the Software. 19d722e3fbSopenharmony_ci 20d722e3fbSopenharmony_ciTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21d722e3fbSopenharmony_ciOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22d722e3fbSopenharmony_ciMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 23d722e3fbSopenharmony_ciIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 24d722e3fbSopenharmony_ciANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 25d722e3fbSopenharmony_ciTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26d722e3fbSopenharmony_ciSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27d722e3fbSopenharmony_ci 28d722e3fbSopenharmony_ci**************************************************************************/ 29d722e3fbSopenharmony_ci 30d722e3fbSopenharmony_ci/* 31d722e3fbSopenharmony_ci * Authors: 32d722e3fbSopenharmony_ci * Kevin E. Martin <martin@valinux.com> 33d722e3fbSopenharmony_ci * Jens Owen <jens@tungstengraphics.com> 34d722e3fbSopenharmony_ci * Rickard E. (Rik) Faith <faith@valinux.com> 35d722e3fbSopenharmony_ci * 36d722e3fbSopenharmony_ci */ 37d722e3fbSopenharmony_ci 38d722e3fbSopenharmony_ci/* THIS IS NOT AN X CONSORTIUM STANDARD */ 39d722e3fbSopenharmony_ci 40d722e3fbSopenharmony_ci#ifdef HAVE_CONFIG_H 41d722e3fbSopenharmony_ci#include "config.h" 42d722e3fbSopenharmony_ci#endif 43d722e3fbSopenharmony_ci 44d722e3fbSopenharmony_ci#include <X11/Xlibint.h> 45d722e3fbSopenharmony_ci#include <X11/extensions/Xext.h> 46d722e3fbSopenharmony_ci#include <X11/extensions/extutil.h> 47d722e3fbSopenharmony_ci#include <stdint.h> 48d722e3fbSopenharmony_ci#include "xf86dristr.h" 49d722e3fbSopenharmony_ci 50d722e3fbSopenharmony_cistatic XExtensionInfo _xf86dri_info_data; 51d722e3fbSopenharmony_cistatic XExtensionInfo *xf86dri_info = &_xf86dri_info_data; 52d722e3fbSopenharmony_cistatic char xf86dri_extension_name[] = XF86DRINAME; 53d722e3fbSopenharmony_ci 54d722e3fbSopenharmony_ci#define uniDRICheckExtension(dpy,i,val) \ 55d722e3fbSopenharmony_ci XextCheckExtension (dpy, i, xf86dri_extension_name, val) 56d722e3fbSopenharmony_ci 57d722e3fbSopenharmony_ci/***************************************************************************** 58d722e3fbSopenharmony_ci * * 59d722e3fbSopenharmony_ci * private utility routines * 60d722e3fbSopenharmony_ci * * 61d722e3fbSopenharmony_ci *****************************************************************************/ 62d722e3fbSopenharmony_ci 63d722e3fbSopenharmony_cistatic int close_display(Display * dpy, XExtCodes * extCodes); 64d722e3fbSopenharmony_cistatic /* const */ XExtensionHooks xf86dri_extension_hooks = { 65d722e3fbSopenharmony_ci NULL, /* create_gc */ 66d722e3fbSopenharmony_ci NULL, /* copy_gc */ 67d722e3fbSopenharmony_ci NULL, /* flush_gc */ 68d722e3fbSopenharmony_ci NULL, /* free_gc */ 69d722e3fbSopenharmony_ci NULL, /* create_font */ 70d722e3fbSopenharmony_ci NULL, /* free_font */ 71d722e3fbSopenharmony_ci close_display, /* close_display */ 72d722e3fbSopenharmony_ci NULL, /* wire_to_event */ 73d722e3fbSopenharmony_ci NULL, /* event_to_wire */ 74d722e3fbSopenharmony_ci NULL, /* error */ 75d722e3fbSopenharmony_ci NULL, /* error_string */ 76d722e3fbSopenharmony_ci}; 77d722e3fbSopenharmony_ci 78d722e3fbSopenharmony_cistatic 79d722e3fbSopenharmony_ciXEXT_GENERATE_FIND_DISPLAY(find_display, xf86dri_info, 80d722e3fbSopenharmony_ci xf86dri_extension_name, &xf86dri_extension_hooks, 0, NULL) 81d722e3fbSopenharmony_ci 82d722e3fbSopenharmony_ci static XEXT_GENERATE_CLOSE_DISPLAY(close_display, xf86dri_info) 83d722e3fbSopenharmony_ci 84d722e3fbSopenharmony_ci/***************************************************************************** 85d722e3fbSopenharmony_ci * * 86d722e3fbSopenharmony_ci * public XFree86-DRI Extension routines * 87d722e3fbSopenharmony_ci * * 88d722e3fbSopenharmony_ci *****************************************************************************/ 89d722e3fbSopenharmony_ci#if 0 90d722e3fbSopenharmony_ci#include <stdio.h> 91d722e3fbSopenharmony_ci#define TRACE(msg) fprintf(stderr,"uniDRI%s\n", msg); 92d722e3fbSopenharmony_ci#else 93d722e3fbSopenharmony_ci#define TRACE(msg) 94d722e3fbSopenharmony_ci#endif 95d722e3fbSopenharmony_ci Bool uniDRIQueryExtension(dpy, event_basep, error_basep) 96d722e3fbSopenharmony_ci Display *dpy; 97d722e3fbSopenharmony_ci int *event_basep, *error_basep; 98d722e3fbSopenharmony_ci{ 99d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 100d722e3fbSopenharmony_ci 101d722e3fbSopenharmony_ci TRACE("QueryExtension..."); 102d722e3fbSopenharmony_ci if (XextHasExtension(info)) { 103d722e3fbSopenharmony_ci *event_basep = info->codes->first_event; 104d722e3fbSopenharmony_ci *error_basep = info->codes->first_error; 105d722e3fbSopenharmony_ci TRACE("QueryExtension... return True"); 106d722e3fbSopenharmony_ci return True; 107d722e3fbSopenharmony_ci } else { 108d722e3fbSopenharmony_ci TRACE("QueryExtension... return False"); 109d722e3fbSopenharmony_ci return False; 110d722e3fbSopenharmony_ci } 111d722e3fbSopenharmony_ci} 112d722e3fbSopenharmony_ci 113d722e3fbSopenharmony_ciBool 114d722e3fbSopenharmony_ciuniDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion) 115d722e3fbSopenharmony_ci Display *dpy; 116d722e3fbSopenharmony_ci int *majorVersion; 117d722e3fbSopenharmony_ci int *minorVersion; 118d722e3fbSopenharmony_ci int *patchVersion; 119d722e3fbSopenharmony_ci{ 120d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 121d722e3fbSopenharmony_ci xXF86DRIQueryVersionReply rep; 122d722e3fbSopenharmony_ci xXF86DRIQueryVersionReq *req; 123d722e3fbSopenharmony_ci 124d722e3fbSopenharmony_ci TRACE("QueryVersion..."); 125d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 126d722e3fbSopenharmony_ci 127d722e3fbSopenharmony_ci LockDisplay(dpy); 128d722e3fbSopenharmony_ci GetReq(XF86DRIQueryVersion, req); 129d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 130d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIQueryVersion; 131d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 132d722e3fbSopenharmony_ci UnlockDisplay(dpy); 133d722e3fbSopenharmony_ci SyncHandle(); 134d722e3fbSopenharmony_ci TRACE("QueryVersion... return False"); 135d722e3fbSopenharmony_ci return False; 136d722e3fbSopenharmony_ci } 137d722e3fbSopenharmony_ci *majorVersion = rep.majorVersion; 138d722e3fbSopenharmony_ci *minorVersion = rep.minorVersion; 139d722e3fbSopenharmony_ci *patchVersion = rep.patchVersion; 140d722e3fbSopenharmony_ci UnlockDisplay(dpy); 141d722e3fbSopenharmony_ci SyncHandle(); 142d722e3fbSopenharmony_ci TRACE("QueryVersion... return True"); 143d722e3fbSopenharmony_ci return True; 144d722e3fbSopenharmony_ci} 145d722e3fbSopenharmony_ci 146d722e3fbSopenharmony_ciBool 147d722e3fbSopenharmony_ciuniDRIQueryDirectRenderingCapable(dpy, screen, isCapable) 148d722e3fbSopenharmony_ci Display *dpy; 149d722e3fbSopenharmony_ci int screen; 150d722e3fbSopenharmony_ci Bool *isCapable; 151d722e3fbSopenharmony_ci{ 152d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 153d722e3fbSopenharmony_ci xXF86DRIQueryDirectRenderingCapableReply rep; 154d722e3fbSopenharmony_ci xXF86DRIQueryDirectRenderingCapableReq *req; 155d722e3fbSopenharmony_ci 156d722e3fbSopenharmony_ci TRACE("QueryDirectRenderingCapable..."); 157d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 158d722e3fbSopenharmony_ci 159d722e3fbSopenharmony_ci LockDisplay(dpy); 160d722e3fbSopenharmony_ci GetReq(XF86DRIQueryDirectRenderingCapable, req); 161d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 162d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIQueryDirectRenderingCapable; 163d722e3fbSopenharmony_ci req->screen = screen; 164d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 165d722e3fbSopenharmony_ci UnlockDisplay(dpy); 166d722e3fbSopenharmony_ci SyncHandle(); 167d722e3fbSopenharmony_ci TRACE("QueryDirectRenderingCapable... return False"); 168d722e3fbSopenharmony_ci return False; 169d722e3fbSopenharmony_ci } 170d722e3fbSopenharmony_ci *isCapable = rep.isCapable; 171d722e3fbSopenharmony_ci UnlockDisplay(dpy); 172d722e3fbSopenharmony_ci SyncHandle(); 173d722e3fbSopenharmony_ci TRACE("QueryDirectRenderingCapable... return True"); 174d722e3fbSopenharmony_ci return True; 175d722e3fbSopenharmony_ci} 176d722e3fbSopenharmony_ci 177d722e3fbSopenharmony_ciBool 178d722e3fbSopenharmony_ciuniDRIOpenConnection(dpy, screen, hSAREA, busIdString) 179d722e3fbSopenharmony_ci Display *dpy; 180d722e3fbSopenharmony_ci int screen; 181d722e3fbSopenharmony_ci drm_handle_t *hSAREA; 182d722e3fbSopenharmony_ci char **busIdString; 183d722e3fbSopenharmony_ci{ 184d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 185d722e3fbSopenharmony_ci xXF86DRIOpenConnectionReply rep; 186d722e3fbSopenharmony_ci xXF86DRIOpenConnectionReq *req; 187d722e3fbSopenharmony_ci 188d722e3fbSopenharmony_ci TRACE("OpenConnection..."); 189d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 190d722e3fbSopenharmony_ci 191d722e3fbSopenharmony_ci LockDisplay(dpy); 192d722e3fbSopenharmony_ci GetReq(XF86DRIOpenConnection, req); 193d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 194d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIOpenConnection; 195d722e3fbSopenharmony_ci req->screen = screen; 196d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 197d722e3fbSopenharmony_ci UnlockDisplay(dpy); 198d722e3fbSopenharmony_ci SyncHandle(); 199d722e3fbSopenharmony_ci TRACE("OpenConnection... return False"); 200d722e3fbSopenharmony_ci return False; 201d722e3fbSopenharmony_ci } 202d722e3fbSopenharmony_ci 203d722e3fbSopenharmony_ci *hSAREA = rep.hSAREALow; 204d722e3fbSopenharmony_ci#ifdef LONG64 205d722e3fbSopenharmony_ci if (sizeof(drm_handle_t) == 8) { 206d722e3fbSopenharmony_ci *hSAREA |= ((unsigned long)rep.hSAREAHigh) << 32; 207d722e3fbSopenharmony_ci } 208d722e3fbSopenharmony_ci#endif 209d722e3fbSopenharmony_ci if (rep.length) { 210d722e3fbSopenharmony_ci if (!(*busIdString = (char *)Xcalloc(rep.busIdStringLength + 1, 1))) { 211d722e3fbSopenharmony_ci _XEatData(dpy, ((rep.busIdStringLength + 3) & ~3)); 212d722e3fbSopenharmony_ci UnlockDisplay(dpy); 213d722e3fbSopenharmony_ci SyncHandle(); 214d722e3fbSopenharmony_ci TRACE("OpenConnection... return False"); 215d722e3fbSopenharmony_ci return False; 216d722e3fbSopenharmony_ci } 217d722e3fbSopenharmony_ci _XReadPad(dpy, *busIdString, rep.busIdStringLength); 218d722e3fbSopenharmony_ci } else { 219d722e3fbSopenharmony_ci *busIdString = NULL; 220d722e3fbSopenharmony_ci } 221d722e3fbSopenharmony_ci UnlockDisplay(dpy); 222d722e3fbSopenharmony_ci SyncHandle(); 223d722e3fbSopenharmony_ci TRACE("OpenConnection... return True"); 224d722e3fbSopenharmony_ci return True; 225d722e3fbSopenharmony_ci} 226d722e3fbSopenharmony_ci 227d722e3fbSopenharmony_ciBool 228d722e3fbSopenharmony_ciuniDRIAuthConnection(dpy, screen, magic) 229d722e3fbSopenharmony_ci Display *dpy; 230d722e3fbSopenharmony_ci int screen; 231d722e3fbSopenharmony_ci drm_magic_t magic; 232d722e3fbSopenharmony_ci{ 233d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 234d722e3fbSopenharmony_ci xXF86DRIAuthConnectionReq *req; 235d722e3fbSopenharmony_ci xXF86DRIAuthConnectionReply rep; 236d722e3fbSopenharmony_ci 237d722e3fbSopenharmony_ci TRACE("AuthConnection..."); 238d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 239d722e3fbSopenharmony_ci 240d722e3fbSopenharmony_ci LockDisplay(dpy); 241d722e3fbSopenharmony_ci GetReq(XF86DRIAuthConnection, req); 242d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 243d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIAuthConnection; 244d722e3fbSopenharmony_ci req->screen = screen; 245d722e3fbSopenharmony_ci req->magic = magic; 246d722e3fbSopenharmony_ci rep.authenticated = 0; 247d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 0, xFalse) || !rep.authenticated) { 248d722e3fbSopenharmony_ci UnlockDisplay(dpy); 249d722e3fbSopenharmony_ci SyncHandle(); 250d722e3fbSopenharmony_ci TRACE("AuthConnection... return False"); 251d722e3fbSopenharmony_ci return False; 252d722e3fbSopenharmony_ci } 253d722e3fbSopenharmony_ci UnlockDisplay(dpy); 254d722e3fbSopenharmony_ci SyncHandle(); 255d722e3fbSopenharmony_ci TRACE("AuthConnection... return True"); 256d722e3fbSopenharmony_ci return True; 257d722e3fbSopenharmony_ci} 258d722e3fbSopenharmony_ci 259d722e3fbSopenharmony_ciBool 260d722e3fbSopenharmony_ciuniDRICloseConnection(dpy, screen) 261d722e3fbSopenharmony_ci Display *dpy; 262d722e3fbSopenharmony_ci int screen; 263d722e3fbSopenharmony_ci{ 264d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 265d722e3fbSopenharmony_ci xXF86DRICloseConnectionReq *req; 266d722e3fbSopenharmony_ci 267d722e3fbSopenharmony_ci TRACE("CloseConnection..."); 268d722e3fbSopenharmony_ci 269d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 270d722e3fbSopenharmony_ci 271d722e3fbSopenharmony_ci LockDisplay(dpy); 272d722e3fbSopenharmony_ci GetReq(XF86DRICloseConnection, req); 273d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 274d722e3fbSopenharmony_ci req->driReqType = X_XF86DRICloseConnection; 275d722e3fbSopenharmony_ci req->screen = screen; 276d722e3fbSopenharmony_ci UnlockDisplay(dpy); 277d722e3fbSopenharmony_ci SyncHandle(); 278d722e3fbSopenharmony_ci TRACE("CloseConnection... return True"); 279d722e3fbSopenharmony_ci return True; 280d722e3fbSopenharmony_ci} 281d722e3fbSopenharmony_ci 282d722e3fbSopenharmony_ciBool 283d722e3fbSopenharmony_ciuniDRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion, 284d722e3fbSopenharmony_ci ddxDriverMinorVersion, ddxDriverPatchVersion, clientDriverName) 285d722e3fbSopenharmony_ci Display *dpy; 286d722e3fbSopenharmony_ci int screen; 287d722e3fbSopenharmony_ci int *ddxDriverMajorVersion; 288d722e3fbSopenharmony_ci int *ddxDriverMinorVersion; 289d722e3fbSopenharmony_ci int *ddxDriverPatchVersion; 290d722e3fbSopenharmony_ci char **clientDriverName; 291d722e3fbSopenharmony_ci{ 292d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 293d722e3fbSopenharmony_ci xXF86DRIGetClientDriverNameReply rep; 294d722e3fbSopenharmony_ci xXF86DRIGetClientDriverNameReq *req; 295d722e3fbSopenharmony_ci 296d722e3fbSopenharmony_ci TRACE("GetClientDriverName..."); 297d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 298d722e3fbSopenharmony_ci 299d722e3fbSopenharmony_ci LockDisplay(dpy); 300d722e3fbSopenharmony_ci GetReq(XF86DRIGetClientDriverName, req); 301d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 302d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIGetClientDriverName; 303d722e3fbSopenharmony_ci req->screen = screen; 304d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 305d722e3fbSopenharmony_ci UnlockDisplay(dpy); 306d722e3fbSopenharmony_ci SyncHandle(); 307d722e3fbSopenharmony_ci TRACE("GetClientDriverName... return False"); 308d722e3fbSopenharmony_ci return False; 309d722e3fbSopenharmony_ci } 310d722e3fbSopenharmony_ci 311d722e3fbSopenharmony_ci *ddxDriverMajorVersion = rep.ddxDriverMajorVersion; 312d722e3fbSopenharmony_ci *ddxDriverMinorVersion = rep.ddxDriverMinorVersion; 313d722e3fbSopenharmony_ci *ddxDriverPatchVersion = rep.ddxDriverPatchVersion; 314d722e3fbSopenharmony_ci 315d722e3fbSopenharmony_ci if (rep.length) { 316d722e3fbSopenharmony_ci if (!(*clientDriverName = 317d722e3fbSopenharmony_ci (char *)Xcalloc(rep.clientDriverNameLength + 1, 1))) { 318d722e3fbSopenharmony_ci _XEatData(dpy, ((rep.clientDriverNameLength + 3) & ~3)); 319d722e3fbSopenharmony_ci UnlockDisplay(dpy); 320d722e3fbSopenharmony_ci SyncHandle(); 321d722e3fbSopenharmony_ci TRACE("GetClientDriverName... return False"); 322d722e3fbSopenharmony_ci return False; 323d722e3fbSopenharmony_ci } 324d722e3fbSopenharmony_ci _XReadPad(dpy, *clientDriverName, rep.clientDriverNameLength); 325d722e3fbSopenharmony_ci } else { 326d722e3fbSopenharmony_ci *clientDriverName = NULL; 327d722e3fbSopenharmony_ci } 328d722e3fbSopenharmony_ci UnlockDisplay(dpy); 329d722e3fbSopenharmony_ci SyncHandle(); 330d722e3fbSopenharmony_ci TRACE("GetClientDriverName... return True"); 331d722e3fbSopenharmony_ci return True; 332d722e3fbSopenharmony_ci} 333d722e3fbSopenharmony_ci 334d722e3fbSopenharmony_ciBool 335d722e3fbSopenharmony_ciuniDRICreateContextWithConfig(dpy, screen, configID, context, hHWContext) 336d722e3fbSopenharmony_ci Display *dpy; 337d722e3fbSopenharmony_ci int screen; 338d722e3fbSopenharmony_ci int configID; 339d722e3fbSopenharmony_ci XID *context; 340d722e3fbSopenharmony_ci drm_context_t *hHWContext; 341d722e3fbSopenharmony_ci{ 342d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 343d722e3fbSopenharmony_ci xXF86DRICreateContextReply rep; 344d722e3fbSopenharmony_ci xXF86DRICreateContextReq *req; 345d722e3fbSopenharmony_ci 346d722e3fbSopenharmony_ci TRACE("CreateContext..."); 347d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 348d722e3fbSopenharmony_ci 349d722e3fbSopenharmony_ci LockDisplay(dpy); 350d722e3fbSopenharmony_ci GetReq(XF86DRICreateContext, req); 351d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 352d722e3fbSopenharmony_ci req->driReqType = X_XF86DRICreateContext; 353d722e3fbSopenharmony_ci req->visual = configID; 354d722e3fbSopenharmony_ci req->screen = screen; 355d722e3fbSopenharmony_ci *context = XAllocID(dpy); 356d722e3fbSopenharmony_ci req->context = *context; 357d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 358d722e3fbSopenharmony_ci UnlockDisplay(dpy); 359d722e3fbSopenharmony_ci SyncHandle(); 360d722e3fbSopenharmony_ci TRACE("CreateContext... return False"); 361d722e3fbSopenharmony_ci return False; 362d722e3fbSopenharmony_ci } 363d722e3fbSopenharmony_ci *hHWContext = rep.hHWContext; 364d722e3fbSopenharmony_ci UnlockDisplay(dpy); 365d722e3fbSopenharmony_ci SyncHandle(); 366d722e3fbSopenharmony_ci TRACE("CreateContext... return True"); 367d722e3fbSopenharmony_ci return True; 368d722e3fbSopenharmony_ci} 369d722e3fbSopenharmony_ci 370d722e3fbSopenharmony_ciBool 371d722e3fbSopenharmony_ciuniDRICreateContext(dpy, screen, visual, context, hHWContext) 372d722e3fbSopenharmony_ci Display *dpy; 373d722e3fbSopenharmony_ci int screen; 374d722e3fbSopenharmony_ci Visual *visual; 375d722e3fbSopenharmony_ci XID *context; 376d722e3fbSopenharmony_ci drm_context_t *hHWContext; 377d722e3fbSopenharmony_ci{ 378d722e3fbSopenharmony_ci return uniDRICreateContextWithConfig(dpy, screen, visual->visualid, 379d722e3fbSopenharmony_ci context, hHWContext); 380d722e3fbSopenharmony_ci} 381d722e3fbSopenharmony_ci 382d722e3fbSopenharmony_ciBool 383d722e3fbSopenharmony_ciuniDRIDestroyContext(Display * ndpy, int screen, XID context) 384d722e3fbSopenharmony_ci{ 385d722e3fbSopenharmony_ci Display *const dpy = (Display *) ndpy; 386d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 387d722e3fbSopenharmony_ci xXF86DRIDestroyContextReq *req; 388d722e3fbSopenharmony_ci 389d722e3fbSopenharmony_ci TRACE("DestroyContext..."); 390d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 391d722e3fbSopenharmony_ci 392d722e3fbSopenharmony_ci LockDisplay(dpy); 393d722e3fbSopenharmony_ci GetReq(XF86DRIDestroyContext, req); 394d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 395d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIDestroyContext; 396d722e3fbSopenharmony_ci req->screen = screen; 397d722e3fbSopenharmony_ci req->context = context; 398d722e3fbSopenharmony_ci UnlockDisplay(dpy); 399d722e3fbSopenharmony_ci SyncHandle(); 400d722e3fbSopenharmony_ci TRACE("DestroyContext... return True"); 401d722e3fbSopenharmony_ci return True; 402d722e3fbSopenharmony_ci} 403d722e3fbSopenharmony_ci 404d722e3fbSopenharmony_ciBool 405d722e3fbSopenharmony_ciuniDRICreateDrawable(Display * ndpy, int screen, 406d722e3fbSopenharmony_ci Drawable drawable, drm_drawable_t * hHWDrawable) 407d722e3fbSopenharmony_ci{ 408d722e3fbSopenharmony_ci Display *const dpy = (Display *) ndpy; 409d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 410d722e3fbSopenharmony_ci xXF86DRICreateDrawableReply rep; 411d722e3fbSopenharmony_ci xXF86DRICreateDrawableReq *req; 412d722e3fbSopenharmony_ci 413d722e3fbSopenharmony_ci TRACE("CreateDrawable..."); 414d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 415d722e3fbSopenharmony_ci 416d722e3fbSopenharmony_ci LockDisplay(dpy); 417d722e3fbSopenharmony_ci GetReq(XF86DRICreateDrawable, req); 418d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 419d722e3fbSopenharmony_ci req->driReqType = X_XF86DRICreateDrawable; 420d722e3fbSopenharmony_ci req->screen = screen; 421d722e3fbSopenharmony_ci req->drawable = drawable; 422d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 423d722e3fbSopenharmony_ci UnlockDisplay(dpy); 424d722e3fbSopenharmony_ci SyncHandle(); 425d722e3fbSopenharmony_ci TRACE("CreateDrawable... return False"); 426d722e3fbSopenharmony_ci return False; 427d722e3fbSopenharmony_ci } 428d722e3fbSopenharmony_ci *hHWDrawable = rep.hHWDrawable; 429d722e3fbSopenharmony_ci UnlockDisplay(dpy); 430d722e3fbSopenharmony_ci SyncHandle(); 431d722e3fbSopenharmony_ci TRACE("CreateDrawable... return True"); 432d722e3fbSopenharmony_ci return True; 433d722e3fbSopenharmony_ci} 434d722e3fbSopenharmony_ci 435d722e3fbSopenharmony_ciBool 436d722e3fbSopenharmony_ciuniDRIDestroyDrawable(Display * ndpy, int screen, Drawable drawable) 437d722e3fbSopenharmony_ci{ 438d722e3fbSopenharmony_ci Display *const dpy = (Display *) ndpy; 439d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 440d722e3fbSopenharmony_ci xXF86DRIDestroyDrawableReq *req; 441d722e3fbSopenharmony_ci 442d722e3fbSopenharmony_ci TRACE("DestroyDrawable..."); 443d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 444d722e3fbSopenharmony_ci 445d722e3fbSopenharmony_ci LockDisplay(dpy); 446d722e3fbSopenharmony_ci GetReq(XF86DRIDestroyDrawable, req); 447d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 448d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIDestroyDrawable; 449d722e3fbSopenharmony_ci req->screen = screen; 450d722e3fbSopenharmony_ci req->drawable = drawable; 451d722e3fbSopenharmony_ci UnlockDisplay(dpy); 452d722e3fbSopenharmony_ci SyncHandle(); 453d722e3fbSopenharmony_ci TRACE("DestroyDrawable... return True"); 454d722e3fbSopenharmony_ci return True; 455d722e3fbSopenharmony_ci} 456d722e3fbSopenharmony_ci 457d722e3fbSopenharmony_ciBool 458d722e3fbSopenharmony_ciuniDRIGetDrawableInfo(Display * dpy, int screen, Drawable drawable, 459d722e3fbSopenharmony_ci unsigned int *index, unsigned int *stamp, 460d722e3fbSopenharmony_ci int *X, int *Y, int *W, int *H, 461d722e3fbSopenharmony_ci int *numClipRects, drm_clip_rect_t ** pClipRects, 462d722e3fbSopenharmony_ci int *backX, int *backY, 463d722e3fbSopenharmony_ci int *numBackClipRects, drm_clip_rect_t ** pBackClipRects) 464d722e3fbSopenharmony_ci{ 465d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 466d722e3fbSopenharmony_ci xXF86DRIGetDrawableInfoReply rep; 467d722e3fbSopenharmony_ci xXF86DRIGetDrawableInfoReq *req; 468d722e3fbSopenharmony_ci int total_rects; 469d722e3fbSopenharmony_ci 470d722e3fbSopenharmony_ci TRACE("GetDrawableInfo..."); 471d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 472d722e3fbSopenharmony_ci 473d722e3fbSopenharmony_ci LockDisplay(dpy); 474d722e3fbSopenharmony_ci GetReq(XF86DRIGetDrawableInfo, req); 475d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 476d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIGetDrawableInfo; 477d722e3fbSopenharmony_ci req->screen = screen; 478d722e3fbSopenharmony_ci req->drawable = drawable; 479d722e3fbSopenharmony_ci 480d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 1, xFalse)) { 481d722e3fbSopenharmony_ci UnlockDisplay(dpy); 482d722e3fbSopenharmony_ci SyncHandle(); 483d722e3fbSopenharmony_ci TRACE("GetDrawableInfo... return False"); 484d722e3fbSopenharmony_ci return False; 485d722e3fbSopenharmony_ci } 486d722e3fbSopenharmony_ci *index = rep.drawableTableIndex; 487d722e3fbSopenharmony_ci *stamp = rep.drawableTableStamp; 488d722e3fbSopenharmony_ci *X = (int)rep.drawableX; 489d722e3fbSopenharmony_ci *Y = (int)rep.drawableY; 490d722e3fbSopenharmony_ci *W = (int)rep.drawableWidth; 491d722e3fbSopenharmony_ci *H = (int)rep.drawableHeight; 492d722e3fbSopenharmony_ci *numClipRects = rep.numClipRects; 493d722e3fbSopenharmony_ci total_rects = *numClipRects; 494d722e3fbSopenharmony_ci 495d722e3fbSopenharmony_ci *backX = rep.backX; 496d722e3fbSopenharmony_ci *backY = rep.backY; 497d722e3fbSopenharmony_ci *numBackClipRects = rep.numBackClipRects; 498d722e3fbSopenharmony_ci total_rects += *numBackClipRects; 499d722e3fbSopenharmony_ci 500d722e3fbSopenharmony_ci#if 0 501d722e3fbSopenharmony_ci /* Because of the fix in Xserver/GL/dri/xf86dri.c, this check breaks 502d722e3fbSopenharmony_ci * backwards compatibility (Because of the >> 2 shift) but the fix 503d722e3fbSopenharmony_ci * enables multi-threaded apps to work. 504d722e3fbSopenharmony_ci */ 505d722e3fbSopenharmony_ci if (rep.length != ((((SIZEOF(xXF86DRIGetDrawableInfoReply) - 506d722e3fbSopenharmony_ci SIZEOF(xGenericReply) + 507d722e3fbSopenharmony_ci total_rects * sizeof(drm_clip_rect_t)) + 508d722e3fbSopenharmony_ci 3) & ~3) >> 2)) { 509d722e3fbSopenharmony_ci _XEatData(dpy, rep.length); 510d722e3fbSopenharmony_ci UnlockDisplay(dpy); 511d722e3fbSopenharmony_ci SyncHandle(); 512d722e3fbSopenharmony_ci TRACE("GetDrawableInfo... return False"); 513d722e3fbSopenharmony_ci return False; 514d722e3fbSopenharmony_ci } 515d722e3fbSopenharmony_ci#endif 516d722e3fbSopenharmony_ci 517d722e3fbSopenharmony_ci if (*numClipRects) { 518d722e3fbSopenharmony_ci int len = sizeof(drm_clip_rect_t) * (*numClipRects); 519d722e3fbSopenharmony_ci 520d722e3fbSopenharmony_ci *pClipRects = (drm_clip_rect_t *) Xcalloc(len, 1); 521d722e3fbSopenharmony_ci if (*pClipRects) 522d722e3fbSopenharmony_ci _XRead(dpy, (char *)*pClipRects, len); 523d722e3fbSopenharmony_ci } else { 524d722e3fbSopenharmony_ci *pClipRects = NULL; 525d722e3fbSopenharmony_ci } 526d722e3fbSopenharmony_ci 527d722e3fbSopenharmony_ci if (*numBackClipRects) { 528d722e3fbSopenharmony_ci int len = sizeof(drm_clip_rect_t) * (*numBackClipRects); 529d722e3fbSopenharmony_ci 530d722e3fbSopenharmony_ci *pBackClipRects = (drm_clip_rect_t *) Xcalloc(len, 1); 531d722e3fbSopenharmony_ci if (*pBackClipRects) 532d722e3fbSopenharmony_ci _XRead(dpy, (char *)*pBackClipRects, len); 533d722e3fbSopenharmony_ci } else { 534d722e3fbSopenharmony_ci *pBackClipRects = NULL; 535d722e3fbSopenharmony_ci } 536d722e3fbSopenharmony_ci 537d722e3fbSopenharmony_ci UnlockDisplay(dpy); 538d722e3fbSopenharmony_ci SyncHandle(); 539d722e3fbSopenharmony_ci TRACE("GetDrawableInfo... return True"); 540d722e3fbSopenharmony_ci return True; 541d722e3fbSopenharmony_ci} 542d722e3fbSopenharmony_ci 543d722e3fbSopenharmony_ciBool 544d722e3fbSopenharmony_ciuniDRIGetDeviceInfo(dpy, screen, hFrameBuffer, 545d722e3fbSopenharmony_ci fbOrigin, fbSize, fbStride, devPrivateSize, pDevPrivate) 546d722e3fbSopenharmony_ci Display *dpy; 547d722e3fbSopenharmony_ci int screen; 548d722e3fbSopenharmony_ci drm_handle_t *hFrameBuffer; 549d722e3fbSopenharmony_ci int *fbOrigin; 550d722e3fbSopenharmony_ci int *fbSize; 551d722e3fbSopenharmony_ci int *fbStride; 552d722e3fbSopenharmony_ci int *devPrivateSize; 553d722e3fbSopenharmony_ci void **pDevPrivate; 554d722e3fbSopenharmony_ci{ 555d722e3fbSopenharmony_ci XExtDisplayInfo *info = find_display(dpy); 556d722e3fbSopenharmony_ci xXF86DRIGetDeviceInfoReply rep; 557d722e3fbSopenharmony_ci xXF86DRIGetDeviceInfoReq *req; 558d722e3fbSopenharmony_ci 559d722e3fbSopenharmony_ci TRACE("GetDeviceInfo..."); 560d722e3fbSopenharmony_ci uniDRICheckExtension(dpy, info, False); 561d722e3fbSopenharmony_ci 562d722e3fbSopenharmony_ci LockDisplay(dpy); 563d722e3fbSopenharmony_ci GetReq(XF86DRIGetDeviceInfo, req); 564d722e3fbSopenharmony_ci req->reqType = info->codes->major_opcode; 565d722e3fbSopenharmony_ci req->driReqType = X_XF86DRIGetDeviceInfo; 566d722e3fbSopenharmony_ci req->screen = screen; 567d722e3fbSopenharmony_ci if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 568d722e3fbSopenharmony_ci UnlockDisplay(dpy); 569d722e3fbSopenharmony_ci SyncHandle(); 570d722e3fbSopenharmony_ci TRACE("GetDeviceInfo... return False"); 571d722e3fbSopenharmony_ci return False; 572d722e3fbSopenharmony_ci } 573d722e3fbSopenharmony_ci 574d722e3fbSopenharmony_ci *hFrameBuffer = rep.hFrameBufferLow; 575d722e3fbSopenharmony_ci#ifdef LONG64 576d722e3fbSopenharmony_ci if (sizeof(drm_handle_t) == 8) { 577d722e3fbSopenharmony_ci *hFrameBuffer |= ((unsigned long)rep.hFrameBufferHigh) << 32; 578d722e3fbSopenharmony_ci } 579d722e3fbSopenharmony_ci#endif 580d722e3fbSopenharmony_ci 581d722e3fbSopenharmony_ci *fbOrigin = rep.framebufferOrigin; 582d722e3fbSopenharmony_ci *fbSize = rep.framebufferSize; 583d722e3fbSopenharmony_ci *fbStride = rep.framebufferStride; 584d722e3fbSopenharmony_ci *devPrivateSize = rep.devPrivateSize; 585d722e3fbSopenharmony_ci 586d722e3fbSopenharmony_ci if (rep.length) { 587d722e3fbSopenharmony_ci if (!(*pDevPrivate = (void *)Xcalloc(rep.devPrivateSize, 1))) { 588d722e3fbSopenharmony_ci _XEatData(dpy, ((rep.devPrivateSize + 3) & ~3)); 589d722e3fbSopenharmony_ci UnlockDisplay(dpy); 590d722e3fbSopenharmony_ci SyncHandle(); 591d722e3fbSopenharmony_ci TRACE("GetDeviceInfo... return False"); 592d722e3fbSopenharmony_ci return False; 593d722e3fbSopenharmony_ci } 594d722e3fbSopenharmony_ci _XRead(dpy, (char *)*pDevPrivate, rep.devPrivateSize); 595d722e3fbSopenharmony_ci } else { 596d722e3fbSopenharmony_ci *pDevPrivate = NULL; 597d722e3fbSopenharmony_ci } 598d722e3fbSopenharmony_ci 599d722e3fbSopenharmony_ci UnlockDisplay(dpy); 600d722e3fbSopenharmony_ci SyncHandle(); 601d722e3fbSopenharmony_ci TRACE("GetDeviceInfo... return True"); 602d722e3fbSopenharmony_ci return True; 603d722e3fbSopenharmony_ci} 604