| /* |
| * Copyright © 2014 Jon Turney |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice (including the next |
| * paragraph) shall be included in all copies or substantial portions of the |
| * Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
| * IN THE SOFTWARE. |
| */ |
| |
| /* THIS IS NOT AN X CONSORTIUM STANDARD */ |
| |
| #include <X11/Xlibint.h> |
| #include <X11/extensions/Xext.h> |
| #include <X11/extensions/extutil.h> |
| #include "windowsdristr.h" |
| #include "xwindowsdri.h" |
| #include <stdio.h> |
| |
| static XExtensionInfo _windowsdri_info_data; |
| static XExtensionInfo *windowsdri_info = &_windowsdri_info_data; |
| static char *windowsdri_extension_name = WINDOWSDRINAME; |
| |
| #define WindowsDRICheckExtension(dpy,i,val) \ |
| XextCheckExtension (dpy, i, windowsdri_extension_name, val) |
| |
| /***************************************************************************** |
| * * |
| * private utility routines * |
| * * |
| *****************************************************************************/ |
| |
| static int close_display(Display * dpy, XExtCodes * extCodes); |
| |
| static /* const */ XExtensionHooks windowsdri_extension_hooks = { |
| NULL, /* create_gc */ |
| NULL, /* copy_gc */ |
| NULL, /* flush_gc */ |
| NULL, /* free_gc */ |
| NULL, /* create_font */ |
| NULL, /* free_font */ |
| close_display, /* close_display */ |
| NULL, /* wire_to_event */ |
| NULL, /* event_to_wire */ |
| NULL, /* error */ |
| NULL, /* error_string */ |
| }; |
| |
| static |
| XEXT_GENERATE_FIND_DISPLAY(find_display, windowsdri_info, |
| windowsdri_extension_name, |
| &windowsdri_extension_hooks, |
| WindowsDRINumberEvents, NULL) |
| |
| static |
| XEXT_GENERATE_CLOSE_DISPLAY(close_display, windowsdri_info) |
| |
| /***************************************************************************** |
| * * |
| * public Windows-DRI Extension routines * |
| * * |
| *****************************************************************************/ |
| |
| #if 0 |
| #include <stdio.h> |
| #define TRACE(msg, ...) fprintf(stderr, "WindowsDRI" msg "\n", ##__VA_ARGS__); |
| #else |
| #define TRACE(msg, ...) |
| #endif |
| |
| Bool |
| XWindowsDRIQueryExtension(dpy, event_basep, error_basep) |
| Display *dpy; |
| int *event_basep, *error_basep; |
| { |
| XExtDisplayInfo *info = find_display(dpy); |
| |
| TRACE("QueryExtension:"); |
| if (XextHasExtension(info)) { |
| *event_basep = info->codes->first_event; |
| *error_basep = info->codes->first_error; |
| TRACE("QueryExtension: return True"); |
| return True; |
| } |
| else { |
| TRACE("QueryExtension: return False"); |
| return False; |
| } |
| } |
| |
| Bool |
| XWindowsDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion) |
| Display *dpy; |
| int *majorVersion; |
| int *minorVersion; |
| int *patchVersion; |
| { |
| XExtDisplayInfo *info = find_display(dpy); |
| xWindowsDRIQueryVersionReply rep; |
| xWindowsDRIQueryVersionReq *req; |
| |
| TRACE("QueryVersion:"); |
| WindowsDRICheckExtension(dpy, info, False); |
| |
| LockDisplay(dpy); |
| GetReq(WindowsDRIQueryVersion, req); |
| req->reqType = info->codes->major_opcode; |
| req->driReqType = X_WindowsDRIQueryVersion; |
| if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { |
| UnlockDisplay(dpy); |
| SyncHandle(); |
| TRACE("QueryVersion: return False"); |
| return False; |
| } |
| *majorVersion = rep.majorVersion; |
| *minorVersion = rep.minorVersion; |
| *patchVersion = rep.patchVersion; |
| UnlockDisplay(dpy); |
| SyncHandle(); |
| TRACE("QueryVersion: %d.%d.%d", *majorVersion, *minorVersion, *patchVersion); |
| return True; |
| } |
| |
| Bool |
| XWindowsDRIQueryDirectRenderingCapable(dpy, screen, isCapable) |
| Display *dpy; |
| int screen; |
| Bool *isCapable; |
| { |
| XExtDisplayInfo *info = find_display(dpy); |
| xWindowsDRIQueryDirectRenderingCapableReply rep; |
| xWindowsDRIQueryDirectRenderingCapableReq *req; |
| |
| TRACE("QueryDirectRenderingCapable:"); |
| WindowsDRICheckExtension(dpy, info, False); |
| |
| LockDisplay(dpy); |
| GetReq(WindowsDRIQueryDirectRenderingCapable, req); |
| req->reqType = info->codes->major_opcode; |
| req->driReqType = X_WindowsDRIQueryDirectRenderingCapable; |
| req->screen = screen; |
| if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { |
| UnlockDisplay(dpy); |
| SyncHandle(); |
| TRACE("QueryDirectRenderingCapable: return False"); |
| return False; |
| } |
| *isCapable = rep.isCapable; |
| UnlockDisplay(dpy); |
| SyncHandle(); |
| TRACE("QueryDirectRenderingCapable:return True"); |
| return True; |
| } |
| |
| Bool |
| XWindowsDRIQueryDrawable(Display *dpy, int screen, Drawable drawable, |
| unsigned int * type, void ** handle) |
| { |
| XExtDisplayInfo *info = find_display(dpy); |
| xWindowsDRIQueryDrawableReply rep; |
| xWindowsDRIQueryDrawableReq *req; |
| |
| TRACE("QueryDrawable: XID %lx", drawable); |
| WindowsDRICheckExtension(dpy, info, False); |
| |
| LockDisplay(dpy); |
| GetReq(WindowsDRIQueryDrawable, req); |
| req->reqType = info->codes->major_opcode; |
| req->driReqType = X_WindowsDRIQueryDrawable; |
| req->screen = screen; |
| req->drawable = drawable; |
| |
| if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { |
| UnlockDisplay(dpy); |
| SyncHandle(); |
| TRACE("QueryDrawable: return False"); |
| return False; |
| } |
| |
| *type = rep.drawable_type; |
| |
| // Note that despite being a derived type of void *, HANDLEs are defined to |
| // be a sign-extended 32 bit value (so they can be passed to 32-bit |
| // processes safely) |
| *handle = (void *)(intptr_t)rep.handle; |
| |
| UnlockDisplay(dpy); |
| SyncHandle(); |
| TRACE("QueryDrawable: type %d, handle %p", *type, *handle); |
| return True; |
| } |
| |
| Bool |
| XWindowsDRIFBConfigToPixelFormat(Display *dpy, int screen, int fbConfigID, |
| int *pxfi) |
| { |
| XExtDisplayInfo *info = find_display(dpy); |
| xWindowsDRIFBConfigToPixelFormatReply rep; |
| xWindowsDRIFBConfigToPixelFormatReq *req; |
| |
| TRACE("FBConfigToPixelFormat: fbConfigID 0x%x", fbConfigID); |
| WindowsDRICheckExtension(dpy, info, False); |
| |
| LockDisplay(dpy); |
| GetReq(WindowsDRIFBConfigToPixelFormat, req); |
| req->reqType = info->codes->major_opcode; |
| req->driReqType = X_WindowsDRIFBConfigToPixelFormat; |
| req->screen = screen; |
| req->fbConfigID = fbConfigID; |
| |
| if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { |
| UnlockDisplay(dpy); |
| SyncHandle(); |
| TRACE("FBConfigToPixelFormat: return False"); |
| return False; |
| } |
| |
| *pxfi = rep.pixelFormatIndex; |
| |
| UnlockDisplay(dpy); |
| SyncHandle(); |
| TRACE("FBConfigToPixelFormat: pixelformatindex %d", *pxfi); |
| return True; |
| } |