Home | History | Annotate | Download | only in windows
      1 /*
      2  * Copyright  2014 Jon Turney
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  */
     23 
     24 /* THIS IS NOT AN X CONSORTIUM STANDARD */
     25 
     26 #include <X11/Xlibint.h>
     27 #include <X11/extensions/Xext.h>
     28 #include <X11/extensions/extutil.h>
     29 #include "windowsdristr.h"
     30 #include "xwindowsdri.h"
     31 #include <stdio.h>
     32 
     33 static XExtensionInfo _windowsdri_info_data;
     34 static XExtensionInfo *windowsdri_info = &_windowsdri_info_data;
     35 static char *windowsdri_extension_name = WINDOWSDRINAME;
     36 
     37 #define WindowsDRICheckExtension(dpy,i,val) \
     38   XextCheckExtension (dpy, i, windowsdri_extension_name, val)
     39 
     40 /*****************************************************************************
     41  *                                                                           *
     42  *                         private utility routines                          *
     43  *                                                                           *
     44  *****************************************************************************/
     45 
     46 static int close_display(Display * dpy, XExtCodes * extCodes);
     47 
     48 static /* const */ XExtensionHooks windowsdri_extension_hooks = {
     49    NULL,                        /* create_gc */
     50    NULL,                        /* copy_gc */
     51    NULL,                        /* flush_gc */
     52    NULL,                        /* free_gc */
     53    NULL,                        /* create_font */
     54    NULL,                        /* free_font */
     55    close_display,               /* close_display */
     56    NULL,                        /* wire_to_event */
     57    NULL,                        /* event_to_wire */
     58    NULL,                        /* error */
     59    NULL,                        /* error_string */
     60 };
     61 
     62 static
     63 XEXT_GENERATE_FIND_DISPLAY(find_display, windowsdri_info,
     64                            windowsdri_extension_name,
     65                            &windowsdri_extension_hooks,
     66                            WindowsDRINumberEvents, NULL)
     67 
     68 static
     69 XEXT_GENERATE_CLOSE_DISPLAY(close_display, windowsdri_info)
     70 
     71 /*****************************************************************************
     72  *                                                                           *
     73  *                 public Windows-DRI Extension routines                     *
     74  *                                                                           *
     75  *****************************************************************************/
     76 
     77 #if 0
     78 #include <stdio.h>
     79 #define TRACE(msg, ...)  fprintf(stderr, "WindowsDRI" msg "\n", ##__VA_ARGS__);
     80 #else
     81 #define TRACE(msg, ...)
     82 #endif
     83 
     84 Bool
     85 XWindowsDRIQueryExtension(dpy, event_basep, error_basep)
     86      Display *dpy;
     87      int *event_basep, *error_basep;
     88 {
     89    XExtDisplayInfo *info = find_display(dpy);
     90 
     91    TRACE("QueryExtension:");
     92    if (XextHasExtension(info)) {
     93       *event_basep = info->codes->first_event;
     94       *error_basep = info->codes->first_error;
     95       TRACE("QueryExtension: return True");
     96       return True;
     97    }
     98    else {
     99       TRACE("QueryExtension: return False");
    100       return False;
    101    }
    102 }
    103 
    104 Bool
    105 XWindowsDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
    106      Display *dpy;
    107      int *majorVersion;
    108      int *minorVersion;
    109      int *patchVersion;
    110 {
    111    XExtDisplayInfo *info = find_display(dpy);
    112    xWindowsDRIQueryVersionReply rep;
    113    xWindowsDRIQueryVersionReq *req;
    114 
    115    TRACE("QueryVersion:");
    116    WindowsDRICheckExtension(dpy, info, False);
    117 
    118    LockDisplay(dpy);
    119    GetReq(WindowsDRIQueryVersion, req);
    120    req->reqType = info->codes->major_opcode;
    121    req->driReqType = X_WindowsDRIQueryVersion;
    122    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
    123       UnlockDisplay(dpy);
    124       SyncHandle();
    125       TRACE("QueryVersion: return False");
    126       return False;
    127    }
    128    *majorVersion = rep.majorVersion;
    129    *minorVersion = rep.minorVersion;
    130    *patchVersion = rep.patchVersion;
    131    UnlockDisplay(dpy);
    132    SyncHandle();
    133    TRACE("QueryVersion: %d.%d.%d", *majorVersion, *minorVersion, *patchVersion);
    134    return True;
    135 }
    136 
    137 Bool
    138 XWindowsDRIQueryDirectRenderingCapable(dpy, screen, isCapable)
    139      Display *dpy;
    140      int screen;
    141      Bool *isCapable;
    142 {
    143    XExtDisplayInfo *info = find_display(dpy);
    144    xWindowsDRIQueryDirectRenderingCapableReply rep;
    145    xWindowsDRIQueryDirectRenderingCapableReq *req;
    146 
    147    TRACE("QueryDirectRenderingCapable:");
    148    WindowsDRICheckExtension(dpy, info, False);
    149 
    150    LockDisplay(dpy);
    151    GetReq(WindowsDRIQueryDirectRenderingCapable, req);
    152    req->reqType = info->codes->major_opcode;
    153    req->driReqType = X_WindowsDRIQueryDirectRenderingCapable;
    154    req->screen = screen;
    155    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
    156       UnlockDisplay(dpy);
    157       SyncHandle();
    158       TRACE("QueryDirectRenderingCapable: return False");
    159       return False;
    160    }
    161    *isCapable = rep.isCapable;
    162    UnlockDisplay(dpy);
    163    SyncHandle();
    164    TRACE("QueryDirectRenderingCapable:return True");
    165    return True;
    166 }
    167 
    168 Bool
    169 XWindowsDRIQueryDrawable(Display *dpy, int screen, Drawable drawable,
    170                         unsigned int * type, void ** handle)
    171 {
    172    XExtDisplayInfo *info = find_display(dpy);
    173    xWindowsDRIQueryDrawableReply rep;
    174    xWindowsDRIQueryDrawableReq *req;
    175 
    176    TRACE("QueryDrawable: XID %lx", drawable);
    177    WindowsDRICheckExtension(dpy, info, False);
    178 
    179    LockDisplay(dpy);
    180    GetReq(WindowsDRIQueryDrawable, req);
    181    req->reqType = info->codes->major_opcode;
    182    req->driReqType = X_WindowsDRIQueryDrawable;
    183    req->screen = screen;
    184    req->drawable = drawable;
    185 
    186    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
    187       UnlockDisplay(dpy);
    188       SyncHandle();
    189       TRACE("QueryDrawable: return False");
    190       return False;
    191    }
    192 
    193    *type = rep.drawable_type;
    194 
    195    // Note that despite being a derived type of void *, HANDLEs are defined to
    196    // be a sign-extended 32 bit value (so they can be passed to 32-bit
    197    // processes safely)
    198    *handle = (void *)(intptr_t)rep.handle;
    199 
    200    UnlockDisplay(dpy);
    201    SyncHandle();
    202    TRACE("QueryDrawable: type %d, handle %p", *type, *handle);
    203    return True;
    204 }
    205 
    206 Bool
    207 XWindowsDRIFBConfigToPixelFormat(Display *dpy, int screen, int fbConfigID,
    208                                 int *pxfi)
    209 {
    210    XExtDisplayInfo *info = find_display(dpy);
    211    xWindowsDRIFBConfigToPixelFormatReply rep;
    212    xWindowsDRIFBConfigToPixelFormatReq *req;
    213 
    214    TRACE("FBConfigToPixelFormat: fbConfigID 0x%x", fbConfigID);
    215    WindowsDRICheckExtension(dpy, info, False);
    216 
    217    LockDisplay(dpy);
    218    GetReq(WindowsDRIFBConfigToPixelFormat, req);
    219    req->reqType = info->codes->major_opcode;
    220    req->driReqType = X_WindowsDRIFBConfigToPixelFormat;
    221    req->screen = screen;
    222    req->fbConfigID = fbConfigID;
    223 
    224    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
    225       UnlockDisplay(dpy);
    226       SyncHandle();
    227       TRACE("FBConfigToPixelFormat: return False");
    228       return False;
    229    }
    230 
    231    *pxfi = rep.pixelFormatIndex;
    232 
    233    UnlockDisplay(dpy);
    234    SyncHandle();
    235    TRACE("FBConfigToPixelFormat: pixelformatindex %d", *pxfi);
    236    return True;
    237 }
    238