XF86dri.c revision 4a22ae8d446855d839cc199df8eb1b057045cb88
1cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.13 2002/10/30 12:51:25 alanh Exp $ */
2cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**************************************************************************
3cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
5cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonCopyright 2000 VA Linux Systems, Inc.
6cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonAll Rights Reserved.
7cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonPermission is hereby granted, free of charge, to any person obtaining a
9cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksoncopy of this software and associated documentation files (the
10cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson"Software"), to deal in the Software without restriction, including
11cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonwithout limitation the rights to use, copy, modify, merge, publish,
12cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksondistribute, sub license, and/or sell copies of the Software, and to
13cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonpermit persons to whom the Software is furnished to do so, subject to
14cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonthe following conditions:
15cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonThe above copyright notice and this permission notice (including the
17cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonnext paragraph) shall be included in all copies or substantial portions
18cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonof the Software.
19cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
23cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
24cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
28cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson**************************************************************************/
29cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
30cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
31cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Authors:
32cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *   Kevin E. Martin <martin@valinux.com>
33cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *   Jens Owen <jens@tungstengraphics.com>
34cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *   Rickard E. (Rik) Faith <faith@valinux.com>
35cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
36cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
37cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
38cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* THIS IS NOT AN X CONSORTIUM STANDARD */
39cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
40be85fde82b148c4fc3639fcf3cfedb5de9381fc8Adam Jackson#ifdef GLX_DIRECT_RENDERING
41be85fde82b148c4fc3639fcf3cfedb5de9381fc8Adam Jackson
42cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define NEED_REPLIES
43cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <X11/Xlibint.h>
44cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <X11/extensions/Xext.h>
4582dfd4b71f932f46e116743b204d0077a0875ab8Brian Paul#include <X11/extensions/extutil.h>
464890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam Jackson#include "glheader.h"
471074eae704f4f68a721cfb9810cd0fde3d3aed07Adam Jackson#include "xf86dristr.h"
48cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
49cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic XExtensionInfo _xf86dri_info_data;
50cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic XExtensionInfo *xf86dri_info = &_xf86dri_info_data;
515dd18e95d9aba8cc444a511808a1df15ca7a037aAdam Jacksonstatic char xf86dri_extension_name[] = XF86DRINAME;
52cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
53cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define XF86DRICheckExtension(dpy,i,val) \
54cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson  XextCheckExtension (dpy, i, xf86dri_extension_name, val)
55cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
56cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*****************************************************************************
57cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                                                                           *
58cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *			   private utility routines                          *
59cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                                                                           *
60cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *****************************************************************************/
61cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
62cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int close_display(Display *dpy, XExtCodes *extCodes);
63cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic /* const */ XExtensionHooks xf86dri_extension_hooks = {
64cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* create_gc */
65cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* copy_gc */
66cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* flush_gc */
67cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* free_gc */
68cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* create_font */
69cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* free_font */
70cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    close_display,			/* close_display */
71cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* wire_to_event */
72cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* event_to_wire */
73cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* error */
74cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* error_string */
75cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson};
76cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
77cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xf86dri_info,
78cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson				   xf86dri_extension_name,
79cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson				   &xf86dri_extension_hooks,
80cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson				   0, NULL)
81cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
82cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, xf86dri_info)
83cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
84cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
85cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*****************************************************************************
86cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                                                                           *
87cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *		    public XFree86-DRI Extension routines                    *
88cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                                                                           *
89cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *****************************************************************************/
90cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
91cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if 0
92cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <stdio.h>
93cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define TRACE(msg)  fprintf(stderr,"XF86DRI%s\n", msg);
94cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
95cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define TRACE(msg)
96cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
97cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
98cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
994890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIQueryExtension (dpy, event_basep, error_basep)
100cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display *dpy;
101cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int *event_basep, *error_basep;
102cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
103cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
104cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
105cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryExtension...");
106cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (XextHasExtension(info)) {
107cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	*event_basep = info->codes->first_event;
108cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	*error_basep = info->codes->first_error;
109cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("QueryExtension... return True");
110cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return True;
111cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
112cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("QueryExtension... return False");
113cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
114cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
115cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
116cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1174890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
118cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
119cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* majorVersion;
120cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* minorVersion;
121cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* patchVersion;
122cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
123cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
124cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIQueryVersionReply rep;
125cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIQueryVersionReq *req;
126cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
127cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryVersion...");
128cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
129cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
130cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
131cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIQueryVersion, req);
132cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
133cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIQueryVersion;
134cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
135cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
136cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
137cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("QueryVersion... return False");
138cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
139cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
140cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *majorVersion = rep.majorVersion;
141cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *minorVersion = rep.minorVersion;
142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *patchVersion = rep.patchVersion;
143cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
144cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryVersion... return True");
146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
148cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1494890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIQueryDirectRenderingCapable(dpy, screen, isCapable)
150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
151cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Bool* isCapable;
153cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
154cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIQueryDirectRenderingCapableReply rep;
156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIQueryDirectRenderingCapableReq *req;
157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
158cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryDirectRenderingCapable...");
159cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
160cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIQueryDirectRenderingCapable, req);
163cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
164cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIQueryDirectRenderingCapable;
165cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
166cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
168cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
169cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("QueryDirectRenderingCapable... return False");
170cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
171cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
172cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *isCapable = rep.isCapable;
173cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
174cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
175cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryDirectRenderingCapable... return True");
176cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
177cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
178cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1794890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIOpenConnection(dpy, screen, hSAREA, busIdString)
180cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
181cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
182cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_handle_t * hSAREA;
183cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    char **busIdString;
184cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
185cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
186cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIOpenConnectionReply rep;
187cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIOpenConnectionReq *req;
188cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
189cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("OpenConnection...");
190cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
191cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
192cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
193cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIOpenConnection, req);
194cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
195cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIOpenConnection;
196cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
197cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
198cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
199cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
200cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("OpenConnection... return False");
201cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
202cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
203cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
204cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hSAREA = rep.hSAREALow;
2051b3128cc9a6b51874bf98871ec1b171049770d71Brian Paul    if (sizeof(drm_handle_t) == 8) {
20633d2835182f5f8a1f283811cbd13afe79cf6ea21Alan Hourihane       int shift = 32; /* var to prevent warning on next line */
2071b3128cc9a6b51874bf98871ec1b171049770d71Brian Paul       *hSAREA |= ((drm_handle_t) rep.hSAREAHigh) << shift;
2081b3128cc9a6b51874bf98871ec1b171049770d71Brian Paul    }
209cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
210cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (rep.length) {
211cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        if (!(*busIdString = (char *)Xcalloc(rep.busIdStringLength + 1, 1))) {
212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            _XEatData(dpy, ((rep.busIdStringLength+3) & ~3));
213cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            UnlockDisplay(dpy);
214cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            SyncHandle();
215cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            TRACE("OpenConnection... return False");
216cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            return False;
217cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        }
218cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	_XReadPad(dpy, *busIdString, rep.busIdStringLength);
219cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
220cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *busIdString = NULL;
221cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
222cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
224cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("OpenConnection... return True");
225cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
226cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
227cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2284890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIAuthConnection(dpy, screen, magic)
229cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
230cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
231cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_magic_t magic;
232cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
233cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
234cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIAuthConnectionReq *req;
235cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIAuthConnectionReply rep;
236cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
237cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("AuthConnection...");
238cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
239cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
240cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
241cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIAuthConnection, req);
242cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
243cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIAuthConnection;
244cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
245cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->magic = magic;
246cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    rep.authenticated = 0;
247cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse) || !rep.authenticated) {
248cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
249cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
250cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("AuthConnection... return False");
251cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
252cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
253cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
254cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
255cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("AuthConnection... return True");
256cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
257cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
258cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2594890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRICloseConnection(dpy, screen)
260cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
261cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
262cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
263cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
264cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICloseConnectionReq *req;
265cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CloseConnection...");
267cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
268cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
269cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
270cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
271cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRICloseConnection, req);
272cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
273cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRICloseConnection;
274cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
275cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
276cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
277cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CloseConnection... return True");
278cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2814890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion,
282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	ddxDriverMinorVersion, ddxDriverPatchVersion, clientDriverName)
283cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
284cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* ddxDriverMajorVersion;
286cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* ddxDriverMinorVersion;
287cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* ddxDriverPatchVersion;
288cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    char** clientDriverName;
289cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
290cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
291cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetClientDriverNameReply rep;
292cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetClientDriverNameReq *req;
293cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
294cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetClientDriverName...");
295cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
297cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
298cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIGetClientDriverName, req);
299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIGetClientDriverName;
301cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
302cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
303cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
304cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
305cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("GetClientDriverName... return False");
306cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
307cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
308cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
309cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *ddxDriverMajorVersion = rep.ddxDriverMajorVersion;
310cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *ddxDriverMinorVersion = rep.ddxDriverMinorVersion;
311cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *ddxDriverPatchVersion = rep.ddxDriverPatchVersion;
312cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
313cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (rep.length) {
314cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        if (!(*clientDriverName = (char *)Xcalloc(rep.clientDriverNameLength + 1, 1))) {
315cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            _XEatData(dpy, ((rep.clientDriverNameLength+3) & ~3));
316cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            UnlockDisplay(dpy);
317cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            SyncHandle();
318cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            TRACE("GetClientDriverName... return False");
319cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            return False;
320cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        }
321cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	_XReadPad(dpy, *clientDriverName, rep.clientDriverNameLength);
322cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
323cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *clientDriverName = NULL;
324cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
325cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
326cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
327cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetClientDriverName... return True");
328cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
329cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
330cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3314890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRICreateContextWithConfig(dpy, screen, configID, context,
3324890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam Jackson	hHWContext)
333cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
334cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
335cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int configID;
336cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XID* context;
337cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_context_t * hHWContext;
338cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
339cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
340cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICreateContextReply rep;
341cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICreateContextReq *req;
342cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
343cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CreateContext...");
344cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
345cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
346cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
347cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRICreateContext, req);
348cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
349cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRICreateContext;
350cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->visual = configID;
351cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
352cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *context = XAllocID(dpy);
353cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->context = *context;
354cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
355cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
356cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
357cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("CreateContext... return False");
358cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
359cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
360cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hHWContext = rep.hHWContext;
361cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
362cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
363cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CreateContext... return True");
364cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
365cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
366cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3674890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRICreateContext(dpy, screen, visual, context, hHWContext)
368cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
369cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
370cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Visual* visual;
371cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XID* context;
372cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_context_t * hHWContext;
373cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
374cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return XF86DRICreateContextWithConfig( dpy, screen, visual->visualid,
375cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson					   context, hHWContext );
376cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
377cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3784890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC GLboolean XF86DRIDestroyContext( __DRInativeDisplay * ndpy, int screen,
379cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    __DRIid context )
380cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
381cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display * const dpy = (Display *) ndpy;
382cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
383cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIDestroyContextReq *req;
384cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
385cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("DestroyContext...");
386cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
387cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
388cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
389cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIDestroyContext, req);
390cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
391cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIDestroyContext;
392cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
393cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->context = context;
394cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
395cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
396cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("DestroyContext... return True");
397cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
398cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
399cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4004890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC GLboolean XF86DRICreateDrawable( __DRInativeDisplay * ndpy, int screen,
401cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    __DRIid drawable, drm_drawable_t * hHWDrawable )
402cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
403cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display * const dpy = (Display *) ndpy;
404cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
405cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICreateDrawableReply rep;
406cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICreateDrawableReq *req;
407cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
408cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CreateDrawable...");
409cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
412cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRICreateDrawable, req);
413cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
414cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRICreateDrawable;
415cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
416cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->drawable = drawable;
417cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
418cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
419cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
420cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("CreateDrawable... return False");
421cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
422cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
423cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hHWDrawable = rep.hHWDrawable;
424cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
425cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
426cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CreateDrawable... return True");
427cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
428cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
429cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4304a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsbergstatic int noopErrorHandler(Display *dpy, XErrorEvent *xerr)
4314a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg{
4324a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg    return 0;
4334a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg}
4344a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
4354890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC GLboolean XF86DRIDestroyDrawable( __DRInativeDisplay * ndpy, int screen,
436cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    __DRIid drawable )
437cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
438cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display * const dpy = (Display *) ndpy;
439cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
440cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIDestroyDrawableReq *req;
4414a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg    int (*oldXErrorHandler)(Display *, XErrorEvent *);
442cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
443cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("DestroyDrawable...");
444cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
445cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4464a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg    /* This is called from the DRI driver, which used call it like this
4474a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     *
4484a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     *   if (windowExists(drawable))
4494a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     *     destroyDrawable(drawable);
4504a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     *
4514a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     * which is a textbook race condition - the window may disappear
4524a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     * from the server between checking for its existance and
4534a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     * destroying it.  Instead we change the semantics of
4544a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     * __DRIinterfaceMethodsRec::destroyDrawable() to succeed even if
4554a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     * the windows is gone, by wrapping the destroy call in an error
4564a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg     * handler. */
4574a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
4584a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg    XSync(dpy, GL_FALSE);
4594a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg    oldXErrorHandler = XSetErrorHandler(noopErrorHandler);
4604a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
461cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
462cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIDestroyDrawable, req);
463cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
464cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIDestroyDrawable;
465cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
466cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->drawable = drawable;
467cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
468cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
4694a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
4704a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg    XSetErrorHandler(oldXErrorHandler);
4714a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
472cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("DestroyDrawable... return True");
473cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
474cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
475cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4764890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIGetDrawableInfo(Display* dpy, int screen, Drawable drawable,
477cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    unsigned int* index, unsigned int* stamp,
478cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* X, int* Y, int* W, int* H,
479cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* numClipRects, drm_clip_rect_t ** pClipRects,
480cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* backX, int* backY,
481cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* numBackClipRects, drm_clip_rect_t ** pBackClipRects )
482cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
483cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
484cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetDrawableInfoReply rep;
485cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetDrawableInfoReq *req;
486cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int total_rects;
487cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
488cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetDrawableInfo...");
489cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
490cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
491cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
492cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIGetDrawableInfo, req);
493cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
494cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIGetDrawableInfo;
495cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
496cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->drawable = drawable;
497cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
498cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 1, xFalse))
499cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    {
500cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
501cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
502cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("GetDrawableInfo... return False");
503cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
504cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
505cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *index = rep.drawableTableIndex;
506cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *stamp = rep.drawableTableStamp;
507cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *X = (int)rep.drawableX;
508cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *Y = (int)rep.drawableY;
509cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *W = (int)rep.drawableWidth;
510cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *H = (int)rep.drawableHeight;
511cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *numClipRects = rep.numClipRects;
512cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    total_rects = *numClipRects;
513cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
514cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *backX = rep.backX;
515cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *backY = rep.backY;
516cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *numBackClipRects = rep.numBackClipRects;
517cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    total_rects += *numBackClipRects;
518cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
519cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if 0
520cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    /* Because of the fix in Xserver/GL/dri/xf86dri.c, this check breaks
521cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     * backwards compatibility (Because of the >> 2 shift) but the fix
522cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     * enables multi-threaded apps to work.
523cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     */
524cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (rep.length !=  ((((SIZEOF(xXF86DRIGetDrawableInfoReply) -
525cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson		       SIZEOF(xGenericReply) +
526cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson		       total_rects * sizeof(drm_clip_rect_t)) + 3) & ~3) >> 2)) {
527cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        _XEatData(dpy, rep.length);
528cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
529cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
530cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("GetDrawableInfo... return False");
531cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        return False;
532cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
533cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
534cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
535cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (*numClipRects) {
536cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       int len = sizeof(drm_clip_rect_t) * (*numClipRects);
537cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
538cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       *pClipRects = (drm_clip_rect_t *)Xcalloc(len, 1);
539cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       if (*pClipRects)
540cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	  _XRead(dpy, (char*)*pClipRects, len);
541cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
542cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *pClipRects = NULL;
543cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
544cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
545cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (*numBackClipRects) {
546cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       int len = sizeof(drm_clip_rect_t) * (*numBackClipRects);
547cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
548cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       *pBackClipRects = (drm_clip_rect_t *)Xcalloc(len, 1);
549cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       if (*pBackClipRects)
550cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	  _XRead(dpy, (char*)*pBackClipRects, len);
551cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
552cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *pBackClipRects = NULL;
553cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
554cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
555cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
556cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
557cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetDrawableInfo... return True");
558cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
559cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
560cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
5614890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIGetDeviceInfo(dpy, screen, hFrameBuffer,
562cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	fbOrigin, fbSize, fbStride, devPrivateSize, pDevPrivate)
563cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
564cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
565cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_handle_t * hFrameBuffer;
566cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* fbOrigin;
567cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* fbSize;
568cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* fbStride;
569cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* devPrivateSize;
570cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    void** pDevPrivate;
571cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
572cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
573cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetDeviceInfoReply rep;
574cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetDeviceInfoReq *req;
575cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
576cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetDeviceInfo...");
577cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
578cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
579cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
580cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIGetDeviceInfo, req);
581cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
582cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIGetDeviceInfo;
583cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
584cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
585cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
586cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
587cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("GetDeviceInfo... return False");
588cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
589cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
590cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
591cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hFrameBuffer = rep.hFrameBufferLow;
5921b3128cc9a6b51874bf98871ec1b171049770d71Brian Paul    if (sizeof(drm_handle_t) == 8) {
59333d2835182f5f8a1f283811cbd13afe79cf6ea21Alan Hourihane       int shift = 32; /* var to prevent warning on next line */
5941b3128cc9a6b51874bf98871ec1b171049770d71Brian Paul       *hFrameBuffer |= ((drm_handle_t) rep.hFrameBufferHigh) << shift;
5951b3128cc9a6b51874bf98871ec1b171049770d71Brian Paul    }
596cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
597cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *fbOrigin = rep.framebufferOrigin;
598cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *fbSize = rep.framebufferSize;
599cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *fbStride = rep.framebufferStride;
600cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *devPrivateSize = rep.devPrivateSize;
601cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
602cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (rep.length) {
603cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        if (!(*pDevPrivate = (void *)Xcalloc(rep.devPrivateSize, 1))) {
604cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            _XEatData(dpy, ((rep.devPrivateSize+3) & ~3));
605cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            UnlockDisplay(dpy);
606cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            SyncHandle();
607cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            TRACE("GetDeviceInfo... return False");
608cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            return False;
609cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        }
610cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	_XRead(dpy, (char*)*pDevPrivate, rep.devPrivateSize);
611cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
612cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *pDevPrivate = NULL;
613cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
614cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
615cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
616cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
617cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetDeviceInfo... return True");
618cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
619cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
620cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6214890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRIOpenFullScreen(dpy, screen, drawable)
622cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
623cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
624cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Drawable drawable;
625cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
626cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    /* This function and the underlying X protocol are deprecated.
627cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     */
628cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) dpy;
629cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) screen;
630cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) drawable;
631cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return False;
632cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
633cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6344890f2605ea7f0d8ad157add2ca0dc2d3b19e848Adam JacksonPUBLIC Bool XF86DRICloseFullScreen(dpy, screen, drawable)
635cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
636cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
637cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Drawable drawable;
638cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
639cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    /* This function and the underlying X protocol are deprecated.
640cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     */
641cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) dpy;
642cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) screen;
643cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) drawable;
644cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
645cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
646be85fde82b148c4fc3639fcf3cfedb5de9381fc8Adam Jackson
647be85fde82b148c4fc3639fcf3cfedb5de9381fc8Adam Jackson#endif /* GLX_DIRECT_RENDERING */
648