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