XF86dri.c revision 5dd18e95d9aba8cc444a511808a1df15ca7a037a
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
40cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define NEED_REPLIES
41cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <X11/Xlibint.h>
42cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "xf86dristr.h"
43cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <X11/extensions/Xext.h>
44cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "extutil.h"
45cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
46cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic XExtensionInfo _xf86dri_info_data;
47cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic XExtensionInfo *xf86dri_info = &_xf86dri_info_data;
485dd18e95d9aba8cc444a511808a1df15ca7a037aAdam Jacksonstatic char xf86dri_extension_name[] = XF86DRINAME;
49cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
50cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define XF86DRICheckExtension(dpy,i,val) \
51cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson  XextCheckExtension (dpy, i, xf86dri_extension_name, val)
52cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
53cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*****************************************************************************
54cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                                                                           *
55cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *			   private utility routines                          *
56cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                                                                           *
57cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *****************************************************************************/
58cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
59cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int close_display(Display *dpy, XExtCodes *extCodes);
60cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic /* const */ XExtensionHooks xf86dri_extension_hooks = {
61cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* create_gc */
62cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* copy_gc */
63cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* flush_gc */
64cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* free_gc */
65cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* create_font */
66cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* free_font */
67cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    close_display,			/* close_display */
68cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* wire_to_event */
69cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* event_to_wire */
70cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* error */
71cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    NULL,				/* error_string */
72cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson};
73cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
74cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xf86dri_info,
75cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson				   xf86dri_extension_name,
76cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson				   &xf86dri_extension_hooks,
77cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson				   0, NULL)
78cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
79cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, xf86dri_info)
80cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
81cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
82cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*****************************************************************************
83cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                                                                           *
84cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *		    public XFree86-DRI Extension routines                    *
85cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                                                                           *
86cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *****************************************************************************/
87cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
88cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if 0
89cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <stdio.h>
90cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define TRACE(msg)  fprintf(stderr,"XF86DRI%s\n", msg);
91cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
92cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define TRACE(msg)
93cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
94cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
95cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
96cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIQueryExtension (dpy, event_basep, error_basep)
97cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display *dpy;
98cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int *event_basep, *error_basep;
99cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
100cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
101cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
102cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryExtension...");
103cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (XextHasExtension(info)) {
104cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	*event_basep = info->codes->first_event;
105cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	*error_basep = info->codes->first_error;
106cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("QueryExtension... return True");
107cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return True;
108cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
109cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("QueryExtension... return False");
110cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
111cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
112cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
113cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
114cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
115cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
116cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* majorVersion;
117cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* minorVersion;
118cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* patchVersion;
119cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
120cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
121cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIQueryVersionReply rep;
122cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIQueryVersionReq *req;
123cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
124cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryVersion...");
125cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
126cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
127cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
128cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIQueryVersion, req);
129cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
130cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIQueryVersion;
131cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
132cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
133cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
134cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("QueryVersion... return False");
135cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
136cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
137cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *majorVersion = rep.majorVersion;
138cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *minorVersion = rep.minorVersion;
139cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *patchVersion = rep.patchVersion;
140cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
141cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryVersion... return True");
143cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
144cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
146cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIQueryDirectRenderingCapable(dpy, screen, isCapable)
147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
148cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
149cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Bool* isCapable;
150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
151cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIQueryDirectRenderingCapableReply rep;
153cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIQueryDirectRenderingCapableReq *req;
154cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryDirectRenderingCapable...");
156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
158cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
159cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIQueryDirectRenderingCapable, req);
160cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIQueryDirectRenderingCapable;
162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
163cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
164cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
165cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
166cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("QueryDirectRenderingCapable... return False");
167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
168cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
169cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *isCapable = rep.isCapable;
170cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
171cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
172cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("QueryDirectRenderingCapable... return True");
173cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
174cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
175cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
176cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIOpenConnection(dpy, screen, hSAREA, busIdString)
177cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
178cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
179cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_handle_t * hSAREA;
180cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    char **busIdString;
181cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
182cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
183cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIOpenConnectionReply rep;
184cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIOpenConnectionReq *req;
185cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
186cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("OpenConnection...");
187cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
188cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
189cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
190cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIOpenConnection, req);
191cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
192cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIOpenConnection;
193cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
194cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
195cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
196cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
197cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("OpenConnection... return False");
198cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
199cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
200cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
201cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hSAREA = rep.hSAREALow;
202cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#ifdef LONG64
203cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hSAREA |= ((drm_handle_t)rep.hSAREAHigh) << 32;
204cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
205cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
206cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (rep.length) {
207cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        if (!(*busIdString = (char *)Xcalloc(rep.busIdStringLength + 1, 1))) {
208cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            _XEatData(dpy, ((rep.busIdStringLength+3) & ~3));
209cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            UnlockDisplay(dpy);
210cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            SyncHandle();
211cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            TRACE("OpenConnection... return False");
212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            return False;
213cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        }
214cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	_XReadPad(dpy, *busIdString, rep.busIdStringLength);
215cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
216cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *busIdString = NULL;
217cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
218cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
219cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
220cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("OpenConnection... return True");
221cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
222cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
224cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIAuthConnection(dpy, screen, magic)
225cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
226cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
227cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_magic_t magic;
228cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
229cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
230cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIAuthConnectionReq *req;
231cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIAuthConnectionReply rep;
232cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
233cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("AuthConnection...");
234cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
235cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
236cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
237cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIAuthConnection, req);
238cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
239cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIAuthConnection;
240cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
241cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->magic = magic;
242cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    rep.authenticated = 0;
243cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse) || !rep.authenticated) {
244cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
245cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
246cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("AuthConnection... return False");
247cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
248cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
249cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
250cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
251cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("AuthConnection... return True");
252cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
253cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
254cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
255cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRICloseConnection(dpy, screen)
256cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
257cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
258cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
259cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
260cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICloseConnectionReq *req;
261cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
262cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CloseConnection...");
263cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
264cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
265cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
267cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRICloseConnection, req);
268cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
269cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRICloseConnection;
270cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
271cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
272cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
273cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CloseConnection... return True");
274cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
275cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
276cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
277cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion,
278cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	ddxDriverMinorVersion, ddxDriverPatchVersion, clientDriverName)
279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
281cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* ddxDriverMajorVersion;
282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* ddxDriverMinorVersion;
283cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* ddxDriverPatchVersion;
284cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    char** clientDriverName;
285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
286cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
287cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetClientDriverNameReply rep;
288cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetClientDriverNameReq *req;
289cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
290cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetClientDriverName...");
291cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
292cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
293cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
294cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIGetClientDriverName, req);
295cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIGetClientDriverName;
297cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
298cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
301cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("GetClientDriverName... return False");
302cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
303cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
304cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
305cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *ddxDriverMajorVersion = rep.ddxDriverMajorVersion;
306cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *ddxDriverMinorVersion = rep.ddxDriverMinorVersion;
307cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *ddxDriverPatchVersion = rep.ddxDriverPatchVersion;
308cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
309cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (rep.length) {
310cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        if (!(*clientDriverName = (char *)Xcalloc(rep.clientDriverNameLength + 1, 1))) {
311cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            _XEatData(dpy, ((rep.clientDriverNameLength+3) & ~3));
312cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            UnlockDisplay(dpy);
313cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            SyncHandle();
314cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            TRACE("GetClientDriverName... return False");
315cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            return False;
316cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        }
317cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	_XReadPad(dpy, *clientDriverName, rep.clientDriverNameLength);
318cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
319cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *clientDriverName = NULL;
320cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
321cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
322cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
323cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetClientDriverName... return True");
324cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
325cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
326cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
327cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRICreateContextWithConfig(dpy, screen, configID, context, hHWContext)
328cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
329cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
330cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int configID;
331cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XID* context;
332cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_context_t * hHWContext;
333cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
334cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
335cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICreateContextReply rep;
336cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICreateContextReq *req;
337cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
338cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CreateContext...");
339cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
340cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
341cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
342cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRICreateContext, req);
343cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
344cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRICreateContext;
345cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->visual = configID;
346cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
347cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *context = XAllocID(dpy);
348cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->context = *context;
349cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
350cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
351cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
352cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("CreateContext... return False");
353cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
354cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
355cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hHWContext = rep.hHWContext;
356cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
357cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
358cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CreateContext... return True");
359cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
360cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
361cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
362cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRICreateContext(dpy, screen, visual, context, hHWContext)
363cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
364cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
365cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Visual* visual;
366cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XID* context;
367cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_context_t * hHWContext;
368cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
369cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return XF86DRICreateContextWithConfig( dpy, screen, visual->visualid,
370cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson					   context, hHWContext );
371cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
372cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
373cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonGLboolean XF86DRIDestroyContext( __DRInativeDisplay * ndpy, int screen,
374cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    __DRIid context )
375cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
376cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display * const dpy = (Display *) ndpy;
377cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
378cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIDestroyContextReq *req;
379cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
380cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("DestroyContext...");
381cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
382cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
383cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
384cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIDestroyContext, req);
385cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
386cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIDestroyContext;
387cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
388cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->context = context;
389cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
390cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
391cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("DestroyContext... return True");
392cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
393cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
394cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
395cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonGLboolean XF86DRICreateDrawable( __DRInativeDisplay * ndpy, int screen,
396cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    __DRIid drawable, drm_drawable_t * hHWDrawable )
397cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
398cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display * const dpy = (Display *) ndpy;
399cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
400cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICreateDrawableReply rep;
401cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRICreateDrawableReq *req;
402cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
403cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CreateDrawable...");
404cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
405cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
406cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
407cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRICreateDrawable, req);
408cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
409cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRICreateDrawable;
410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->drawable = drawable;
412cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
413cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
414cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
415cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("CreateDrawable... return False");
416cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
417cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
418cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hHWDrawable = rep.hHWDrawable;
419cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
420cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
421cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("CreateDrawable... return True");
422cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
423cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
424cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
425cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonGLboolean XF86DRIDestroyDrawable( __DRInativeDisplay * ndpy, int screen,
426cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    __DRIid drawable )
427cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
428cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display * const dpy = (Display *) ndpy;
429cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
430cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIDestroyDrawableReq *req;
431cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
432cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("DestroyDrawable...");
433cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
434cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
435cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
436cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIDestroyDrawable, req);
437cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
438cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIDestroyDrawable;
439cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
440cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->drawable = drawable;
441cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
442cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
443cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("DestroyDrawable... return True");
444cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
445cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
446cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
447cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIGetDrawableInfo(Display* dpy, int screen, Drawable drawable,
448cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    unsigned int* index, unsigned int* stamp,
449cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* X, int* Y, int* W, int* H,
450cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* numClipRects, drm_clip_rect_t ** pClipRects,
451cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* backX, int* backY,
452cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* numBackClipRects, drm_clip_rect_t ** pBackClipRects )
453cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
454cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
455cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetDrawableInfoReply rep;
456cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetDrawableInfoReq *req;
457cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int total_rects;
458cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
459cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetDrawableInfo...");
460cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
461cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
462cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
463cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIGetDrawableInfo, req);
464cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
465cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIGetDrawableInfo;
466cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
467cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->drawable = drawable;
468cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
469cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 1, xFalse))
470cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    {
471cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
472cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
473cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("GetDrawableInfo... return False");
474cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
475cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
476cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *index = rep.drawableTableIndex;
477cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *stamp = rep.drawableTableStamp;
478cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *X = (int)rep.drawableX;
479cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *Y = (int)rep.drawableY;
480cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *W = (int)rep.drawableWidth;
481cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *H = (int)rep.drawableHeight;
482cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *numClipRects = rep.numClipRects;
483cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    total_rects = *numClipRects;
484cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
485cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *backX = rep.backX;
486cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *backY = rep.backY;
487cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *numBackClipRects = rep.numBackClipRects;
488cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    total_rects += *numBackClipRects;
489cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
490cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if 0
491cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    /* Because of the fix in Xserver/GL/dri/xf86dri.c, this check breaks
492cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     * backwards compatibility (Because of the >> 2 shift) but the fix
493cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     * enables multi-threaded apps to work.
494cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     */
495cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (rep.length !=  ((((SIZEOF(xXF86DRIGetDrawableInfoReply) -
496cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson		       SIZEOF(xGenericReply) +
497cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson		       total_rects * sizeof(drm_clip_rect_t)) + 3) & ~3) >> 2)) {
498cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        _XEatData(dpy, rep.length);
499cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
500cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
501cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("GetDrawableInfo... return False");
502cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        return False;
503cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
504cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
505cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
506cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (*numClipRects) {
507cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       int len = sizeof(drm_clip_rect_t) * (*numClipRects);
508cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
509cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       *pClipRects = (drm_clip_rect_t *)Xcalloc(len, 1);
510cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       if (*pClipRects)
511cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	  _XRead(dpy, (char*)*pClipRects, len);
512cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
513cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *pClipRects = NULL;
514cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
515cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
516cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (*numBackClipRects) {
517cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       int len = sizeof(drm_clip_rect_t) * (*numBackClipRects);
518cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
519cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       *pBackClipRects = (drm_clip_rect_t *)Xcalloc(len, 1);
520cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson       if (*pBackClipRects)
521cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	  _XRead(dpy, (char*)*pBackClipRects, len);
522cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
523cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *pBackClipRects = NULL;
524cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
525cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
526cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
527cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
528cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetDrawableInfo... return True");
529cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
530cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
531cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
532cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIGetDeviceInfo(dpy, screen, hFrameBuffer,
533cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	fbOrigin, fbSize, fbStride, devPrivateSize, pDevPrivate)
534cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
535cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
536cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    drm_handle_t * hFrameBuffer;
537cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* fbOrigin;
538cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* fbSize;
539cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* fbStride;
540cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int* devPrivateSize;
541cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    void** pDevPrivate;
542cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
543cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XExtDisplayInfo *info = find_display (dpy);
544cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetDeviceInfoReply rep;
545cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    xXF86DRIGetDeviceInfoReq *req;
546cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
547cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetDeviceInfo...");
548cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    XF86DRICheckExtension (dpy, info, False);
549cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
550cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    LockDisplay(dpy);
551cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    GetReq(XF86DRIGetDeviceInfo, req);
552cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->reqType = info->codes->major_opcode;
553cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->driReqType = X_XF86DRIGetDeviceInfo;
554cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    req->screen = screen;
555cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
556cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	UnlockDisplay(dpy);
557cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	SyncHandle();
558cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        TRACE("GetDeviceInfo... return False");
559cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	return False;
560cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
561cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
562cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hFrameBuffer = rep.hFrameBufferLow;
563cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#ifdef LONG64
564cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *hFrameBuffer |= ((drm_handle_t)rep.hFrameBufferHigh) << 32;
565cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
566cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
567cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *fbOrigin = rep.framebufferOrigin;
568cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *fbSize = rep.framebufferSize;
569cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *fbStride = rep.framebufferStride;
570cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    *devPrivateSize = rep.devPrivateSize;
571cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
572cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    if (rep.length) {
573cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        if (!(*pDevPrivate = (void *)Xcalloc(rep.devPrivateSize, 1))) {
574cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            _XEatData(dpy, ((rep.devPrivateSize+3) & ~3));
575cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            UnlockDisplay(dpy);
576cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            SyncHandle();
577cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            TRACE("GetDeviceInfo... return False");
578cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson            return False;
579cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        }
580cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson	_XRead(dpy, (char*)*pDevPrivate, rep.devPrivateSize);
581cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    } else {
582cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson        *pDevPrivate = NULL;
583cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    }
584cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
585cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    UnlockDisplay(dpy);
586cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    SyncHandle();
587cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    TRACE("GetDeviceInfo... return True");
588cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
589cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
590cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
591cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRIOpenFullScreen(dpy, screen, drawable)
592cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
593cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
594cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Drawable drawable;
595cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
596cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    /* This function and the underlying X protocol are deprecated.
597cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     */
598cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) dpy;
599cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) screen;
600cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) drawable;
601cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return False;
602cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
603cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
604cb3610e37c4c0a40520441b8515d044dabcc8854Adam JacksonBool XF86DRICloseFullScreen(dpy, screen, drawable)
605cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Display* dpy;
606cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    int screen;
607cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    Drawable drawable;
608cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
609cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    /* This function and the underlying X protocol are deprecated.
610cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson     */
611cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) dpy;
612cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) screen;
613cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    (void) drawable;
614cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    return True;
615cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
616