xref: /aosp_15_r20/external/libdrm/tests/ttmtest/src/xf86dri.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.13 2002/10/30 12:51:25 alanh Exp $ */
2*7688df22SAndroid Build Coastguard Worker /**************************************************************************
3*7688df22SAndroid Build Coastguard Worker 
4*7688df22SAndroid Build Coastguard Worker Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
5*7688df22SAndroid Build Coastguard Worker Copyright 2000 VA Linux Systems, Inc.
6*7688df22SAndroid Build Coastguard Worker All Rights Reserved.
7*7688df22SAndroid Build Coastguard Worker 
8*7688df22SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
9*7688df22SAndroid Build Coastguard Worker copy of this software and associated documentation files (the
10*7688df22SAndroid Build Coastguard Worker "Software"), to deal in the Software without restriction, including
11*7688df22SAndroid Build Coastguard Worker without limitation the rights to use, copy, modify, merge, publish,
12*7688df22SAndroid Build Coastguard Worker distribute, sub license, and/or sell copies of the Software, and to
13*7688df22SAndroid Build Coastguard Worker permit persons to whom the Software is furnished to do so, subject to
14*7688df22SAndroid Build Coastguard Worker the following conditions:
15*7688df22SAndroid Build Coastguard Worker 
16*7688df22SAndroid Build Coastguard Worker The above copyright notice and this permission notice (including the
17*7688df22SAndroid Build Coastguard Worker next paragraph) shall be included in all copies or substantial portions
18*7688df22SAndroid Build Coastguard Worker of the Software.
19*7688df22SAndroid Build Coastguard Worker 
20*7688df22SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21*7688df22SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22*7688df22SAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
23*7688df22SAndroid Build Coastguard Worker IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
24*7688df22SAndroid Build Coastguard Worker ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25*7688df22SAndroid Build Coastguard Worker TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26*7688df22SAndroid Build Coastguard Worker SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27*7688df22SAndroid Build Coastguard Worker 
28*7688df22SAndroid Build Coastguard Worker **************************************************************************/
29*7688df22SAndroid Build Coastguard Worker 
30*7688df22SAndroid Build Coastguard Worker /*
31*7688df22SAndroid Build Coastguard Worker  * Authors:
32*7688df22SAndroid Build Coastguard Worker  *   Kevin E. Martin <[email protected]>
33*7688df22SAndroid Build Coastguard Worker  *   Jens Owen <[email protected]>
34*7688df22SAndroid Build Coastguard Worker  *   Rickard E. (Rik) Faith <[email protected]>
35*7688df22SAndroid Build Coastguard Worker  *
36*7688df22SAndroid Build Coastguard Worker  */
37*7688df22SAndroid Build Coastguard Worker 
38*7688df22SAndroid Build Coastguard Worker /* THIS IS NOT AN X CONSORTIUM STANDARD */
39*7688df22SAndroid Build Coastguard Worker 
40*7688df22SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
41*7688df22SAndroid Build Coastguard Worker #include "config.h"
42*7688df22SAndroid Build Coastguard Worker #endif
43*7688df22SAndroid Build Coastguard Worker 
44*7688df22SAndroid Build Coastguard Worker #include <X11/Xlibint.h>
45*7688df22SAndroid Build Coastguard Worker #include <X11/extensions/Xext.h>
46*7688df22SAndroid Build Coastguard Worker #include <X11/extensions/extutil.h>
47*7688df22SAndroid Build Coastguard Worker #include <stdint.h>
48*7688df22SAndroid Build Coastguard Worker #include "xf86dristr.h"
49*7688df22SAndroid Build Coastguard Worker 
50*7688df22SAndroid Build Coastguard Worker static XExtensionInfo _xf86dri_info_data;
51*7688df22SAndroid Build Coastguard Worker static XExtensionInfo *xf86dri_info = &_xf86dri_info_data;
52*7688df22SAndroid Build Coastguard Worker static char xf86dri_extension_name[] = XF86DRINAME;
53*7688df22SAndroid Build Coastguard Worker 
54*7688df22SAndroid Build Coastguard Worker #define uniDRICheckExtension(dpy,i,val) \
55*7688df22SAndroid Build Coastguard Worker   XextCheckExtension (dpy, i, xf86dri_extension_name, val)
56*7688df22SAndroid Build Coastguard Worker 
57*7688df22SAndroid Build Coastguard Worker /*****************************************************************************
58*7688df22SAndroid Build Coastguard Worker  *                                                                           *
59*7688df22SAndroid Build Coastguard Worker  *			   private utility routines                          *
60*7688df22SAndroid Build Coastguard Worker  *                                                                           *
61*7688df22SAndroid Build Coastguard Worker  *****************************************************************************/
62*7688df22SAndroid Build Coastguard Worker 
63*7688df22SAndroid Build Coastguard Worker static int close_display(Display * dpy, XExtCodes * extCodes);
64*7688df22SAndroid Build Coastguard Worker static /* const */ XExtensionHooks xf86dri_extension_hooks = {
65*7688df22SAndroid Build Coastguard Worker     NULL,			       /* create_gc */
66*7688df22SAndroid Build Coastguard Worker     NULL,			       /* copy_gc */
67*7688df22SAndroid Build Coastguard Worker     NULL,			       /* flush_gc */
68*7688df22SAndroid Build Coastguard Worker     NULL,			       /* free_gc */
69*7688df22SAndroid Build Coastguard Worker     NULL,			       /* create_font */
70*7688df22SAndroid Build Coastguard Worker     NULL,			       /* free_font */
71*7688df22SAndroid Build Coastguard Worker     close_display,		       /* close_display */
72*7688df22SAndroid Build Coastguard Worker     NULL,			       /* wire_to_event */
73*7688df22SAndroid Build Coastguard Worker     NULL,			       /* event_to_wire */
74*7688df22SAndroid Build Coastguard Worker     NULL,			       /* error */
75*7688df22SAndroid Build Coastguard Worker     NULL,			       /* error_string */
76*7688df22SAndroid Build Coastguard Worker };
77*7688df22SAndroid Build Coastguard Worker 
78*7688df22SAndroid Build Coastguard Worker static
79*7688df22SAndroid Build Coastguard Worker XEXT_GENERATE_FIND_DISPLAY(find_display, xf86dri_info,
80*7688df22SAndroid Build Coastguard Worker     xf86dri_extension_name, &xf86dri_extension_hooks, 0, NULL)
81*7688df22SAndroid Build Coastguard Worker 
82*7688df22SAndroid Build Coastguard Worker     static XEXT_GENERATE_CLOSE_DISPLAY(close_display, xf86dri_info)
83*7688df22SAndroid Build Coastguard Worker 
84*7688df22SAndroid Build Coastguard Worker /*****************************************************************************
85*7688df22SAndroid Build Coastguard Worker  *                                                                           *
86*7688df22SAndroid Build Coastguard Worker  *		    public XFree86-DRI Extension routines                    *
87*7688df22SAndroid Build Coastguard Worker  *                                                                           *
88*7688df22SAndroid Build Coastguard Worker  *****************************************************************************/
89*7688df22SAndroid Build Coastguard Worker #if 0
90*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
91*7688df22SAndroid Build Coastguard Worker #define TRACE(msg)  fprintf(stderr,"uniDRI%s\n", msg);
92*7688df22SAndroid Build Coastguard Worker #else
93*7688df22SAndroid Build Coastguard Worker #define TRACE(msg)
94*7688df22SAndroid Build Coastguard Worker #endif
95*7688df22SAndroid Build Coastguard Worker     Bool uniDRIQueryExtension(dpy, event_basep, error_basep)
96*7688df22SAndroid Build Coastguard Worker     Display *dpy;
97*7688df22SAndroid Build Coastguard Worker     int *event_basep, *error_basep;
98*7688df22SAndroid Build Coastguard Worker {
99*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
100*7688df22SAndroid Build Coastguard Worker 
101*7688df22SAndroid Build Coastguard Worker     TRACE("QueryExtension...");
102*7688df22SAndroid Build Coastguard Worker     if (XextHasExtension(info)) {
103*7688df22SAndroid Build Coastguard Worker 	*event_basep = info->codes->first_event;
104*7688df22SAndroid Build Coastguard Worker 	*error_basep = info->codes->first_error;
105*7688df22SAndroid Build Coastguard Worker 	TRACE("QueryExtension... return True");
106*7688df22SAndroid Build Coastguard Worker 	return True;
107*7688df22SAndroid Build Coastguard Worker     } else {
108*7688df22SAndroid Build Coastguard Worker 	TRACE("QueryExtension... return False");
109*7688df22SAndroid Build Coastguard Worker 	return False;
110*7688df22SAndroid Build Coastguard Worker     }
111*7688df22SAndroid Build Coastguard Worker }
112*7688df22SAndroid Build Coastguard Worker 
113*7688df22SAndroid Build Coastguard Worker Bool
uniDRIQueryVersion(dpy,majorVersion,minorVersion,patchVersion)114*7688df22SAndroid Build Coastguard Worker uniDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
115*7688df22SAndroid Build Coastguard Worker     Display *dpy;
116*7688df22SAndroid Build Coastguard Worker     int *majorVersion;
117*7688df22SAndroid Build Coastguard Worker     int *minorVersion;
118*7688df22SAndroid Build Coastguard Worker     int *patchVersion;
119*7688df22SAndroid Build Coastguard Worker {
120*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
121*7688df22SAndroid Build Coastguard Worker     xXF86DRIQueryVersionReply rep;
122*7688df22SAndroid Build Coastguard Worker     xXF86DRIQueryVersionReq *req;
123*7688df22SAndroid Build Coastguard Worker 
124*7688df22SAndroid Build Coastguard Worker     TRACE("QueryVersion...");
125*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
126*7688df22SAndroid Build Coastguard Worker 
127*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
128*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIQueryVersion, req);
129*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
130*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIQueryVersion;
131*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
132*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
133*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
134*7688df22SAndroid Build Coastguard Worker 	TRACE("QueryVersion... return False");
135*7688df22SAndroid Build Coastguard Worker 	return False;
136*7688df22SAndroid Build Coastguard Worker     }
137*7688df22SAndroid Build Coastguard Worker     *majorVersion = rep.majorVersion;
138*7688df22SAndroid Build Coastguard Worker     *minorVersion = rep.minorVersion;
139*7688df22SAndroid Build Coastguard Worker     *patchVersion = rep.patchVersion;
140*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
141*7688df22SAndroid Build Coastguard Worker     SyncHandle();
142*7688df22SAndroid Build Coastguard Worker     TRACE("QueryVersion... return True");
143*7688df22SAndroid Build Coastguard Worker     return True;
144*7688df22SAndroid Build Coastguard Worker }
145*7688df22SAndroid Build Coastguard Worker 
146*7688df22SAndroid Build Coastguard Worker Bool
uniDRIQueryDirectRenderingCapable(dpy,screen,isCapable)147*7688df22SAndroid Build Coastguard Worker uniDRIQueryDirectRenderingCapable(dpy, screen, isCapable)
148*7688df22SAndroid Build Coastguard Worker     Display *dpy;
149*7688df22SAndroid Build Coastguard Worker     int screen;
150*7688df22SAndroid Build Coastguard Worker     Bool *isCapable;
151*7688df22SAndroid Build Coastguard Worker {
152*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
153*7688df22SAndroid Build Coastguard Worker     xXF86DRIQueryDirectRenderingCapableReply rep;
154*7688df22SAndroid Build Coastguard Worker     xXF86DRIQueryDirectRenderingCapableReq *req;
155*7688df22SAndroid Build Coastguard Worker 
156*7688df22SAndroid Build Coastguard Worker     TRACE("QueryDirectRenderingCapable...");
157*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
158*7688df22SAndroid Build Coastguard Worker 
159*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
160*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIQueryDirectRenderingCapable, req);
161*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
162*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIQueryDirectRenderingCapable;
163*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
164*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
165*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
166*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
167*7688df22SAndroid Build Coastguard Worker 	TRACE("QueryDirectRenderingCapable... return False");
168*7688df22SAndroid Build Coastguard Worker 	return False;
169*7688df22SAndroid Build Coastguard Worker     }
170*7688df22SAndroid Build Coastguard Worker     *isCapable = rep.isCapable;
171*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
172*7688df22SAndroid Build Coastguard Worker     SyncHandle();
173*7688df22SAndroid Build Coastguard Worker     TRACE("QueryDirectRenderingCapable... return True");
174*7688df22SAndroid Build Coastguard Worker     return True;
175*7688df22SAndroid Build Coastguard Worker }
176*7688df22SAndroid Build Coastguard Worker 
177*7688df22SAndroid Build Coastguard Worker Bool
uniDRIOpenConnection(dpy,screen,hSAREA,busIdString)178*7688df22SAndroid Build Coastguard Worker uniDRIOpenConnection(dpy, screen, hSAREA, busIdString)
179*7688df22SAndroid Build Coastguard Worker     Display *dpy;
180*7688df22SAndroid Build Coastguard Worker     int screen;
181*7688df22SAndroid Build Coastguard Worker     drm_handle_t *hSAREA;
182*7688df22SAndroid Build Coastguard Worker     char **busIdString;
183*7688df22SAndroid Build Coastguard Worker {
184*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
185*7688df22SAndroid Build Coastguard Worker     xXF86DRIOpenConnectionReply rep;
186*7688df22SAndroid Build Coastguard Worker     xXF86DRIOpenConnectionReq *req;
187*7688df22SAndroid Build Coastguard Worker 
188*7688df22SAndroid Build Coastguard Worker     TRACE("OpenConnection...");
189*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
190*7688df22SAndroid Build Coastguard Worker 
191*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
192*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIOpenConnection, req);
193*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
194*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIOpenConnection;
195*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
196*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
197*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
198*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
199*7688df22SAndroid Build Coastguard Worker 	TRACE("OpenConnection... return False");
200*7688df22SAndroid Build Coastguard Worker 	return False;
201*7688df22SAndroid Build Coastguard Worker     }
202*7688df22SAndroid Build Coastguard Worker 
203*7688df22SAndroid Build Coastguard Worker     *hSAREA = rep.hSAREALow;
204*7688df22SAndroid Build Coastguard Worker #ifdef LONG64
205*7688df22SAndroid Build Coastguard Worker     if (sizeof(drm_handle_t) == 8) {
206*7688df22SAndroid Build Coastguard Worker 	*hSAREA |= ((unsigned long)rep.hSAREAHigh) << 32;
207*7688df22SAndroid Build Coastguard Worker     }
208*7688df22SAndroid Build Coastguard Worker #endif
209*7688df22SAndroid Build Coastguard Worker     if (rep.length) {
210*7688df22SAndroid Build Coastguard Worker 	if (!(*busIdString = (char *)Xcalloc(rep.busIdStringLength + 1, 1))) {
211*7688df22SAndroid Build Coastguard Worker 	    _XEatData(dpy, ((rep.busIdStringLength + 3) & ~3));
212*7688df22SAndroid Build Coastguard Worker 	    UnlockDisplay(dpy);
213*7688df22SAndroid Build Coastguard Worker 	    SyncHandle();
214*7688df22SAndroid Build Coastguard Worker 	    TRACE("OpenConnection... return False");
215*7688df22SAndroid Build Coastguard Worker 	    return False;
216*7688df22SAndroid Build Coastguard Worker 	}
217*7688df22SAndroid Build Coastguard Worker 	_XReadPad(dpy, *busIdString, rep.busIdStringLength);
218*7688df22SAndroid Build Coastguard Worker     } else {
219*7688df22SAndroid Build Coastguard Worker 	*busIdString = NULL;
220*7688df22SAndroid Build Coastguard Worker     }
221*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
222*7688df22SAndroid Build Coastguard Worker     SyncHandle();
223*7688df22SAndroid Build Coastguard Worker     TRACE("OpenConnection... return True");
224*7688df22SAndroid Build Coastguard Worker     return True;
225*7688df22SAndroid Build Coastguard Worker }
226*7688df22SAndroid Build Coastguard Worker 
227*7688df22SAndroid Build Coastguard Worker Bool
uniDRIAuthConnection(dpy,screen,magic)228*7688df22SAndroid Build Coastguard Worker uniDRIAuthConnection(dpy, screen, magic)
229*7688df22SAndroid Build Coastguard Worker     Display *dpy;
230*7688df22SAndroid Build Coastguard Worker     int screen;
231*7688df22SAndroid Build Coastguard Worker     drm_magic_t magic;
232*7688df22SAndroid Build Coastguard Worker {
233*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
234*7688df22SAndroid Build Coastguard Worker     xXF86DRIAuthConnectionReq *req;
235*7688df22SAndroid Build Coastguard Worker     xXF86DRIAuthConnectionReply rep;
236*7688df22SAndroid Build Coastguard Worker 
237*7688df22SAndroid Build Coastguard Worker     TRACE("AuthConnection...");
238*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
239*7688df22SAndroid Build Coastguard Worker 
240*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
241*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIAuthConnection, req);
242*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
243*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIAuthConnection;
244*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
245*7688df22SAndroid Build Coastguard Worker     req->magic = magic;
246*7688df22SAndroid Build Coastguard Worker     rep.authenticated = 0;
247*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 0, xFalse) || !rep.authenticated) {
248*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
249*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
250*7688df22SAndroid Build Coastguard Worker 	TRACE("AuthConnection... return False");
251*7688df22SAndroid Build Coastguard Worker 	return False;
252*7688df22SAndroid Build Coastguard Worker     }
253*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
254*7688df22SAndroid Build Coastguard Worker     SyncHandle();
255*7688df22SAndroid Build Coastguard Worker     TRACE("AuthConnection... return True");
256*7688df22SAndroid Build Coastguard Worker     return True;
257*7688df22SAndroid Build Coastguard Worker }
258*7688df22SAndroid Build Coastguard Worker 
259*7688df22SAndroid Build Coastguard Worker Bool
uniDRICloseConnection(dpy,screen)260*7688df22SAndroid Build Coastguard Worker uniDRICloseConnection(dpy, screen)
261*7688df22SAndroid Build Coastguard Worker     Display *dpy;
262*7688df22SAndroid Build Coastguard Worker     int screen;
263*7688df22SAndroid Build Coastguard Worker {
264*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
265*7688df22SAndroid Build Coastguard Worker     xXF86DRICloseConnectionReq *req;
266*7688df22SAndroid Build Coastguard Worker 
267*7688df22SAndroid Build Coastguard Worker     TRACE("CloseConnection...");
268*7688df22SAndroid Build Coastguard Worker 
269*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
270*7688df22SAndroid Build Coastguard Worker 
271*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
272*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRICloseConnection, req);
273*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
274*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRICloseConnection;
275*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
276*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
277*7688df22SAndroid Build Coastguard Worker     SyncHandle();
278*7688df22SAndroid Build Coastguard Worker     TRACE("CloseConnection... return True");
279*7688df22SAndroid Build Coastguard Worker     return True;
280*7688df22SAndroid Build Coastguard Worker }
281*7688df22SAndroid Build Coastguard Worker 
282*7688df22SAndroid Build Coastguard Worker Bool
uniDRIGetClientDriverName(dpy,screen,ddxDriverMajorVersion,ddxDriverMinorVersion,ddxDriverPatchVersion,clientDriverName)283*7688df22SAndroid Build Coastguard Worker uniDRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion,
284*7688df22SAndroid Build Coastguard Worker     ddxDriverMinorVersion, ddxDriverPatchVersion, clientDriverName)
285*7688df22SAndroid Build Coastguard Worker     Display *dpy;
286*7688df22SAndroid Build Coastguard Worker     int screen;
287*7688df22SAndroid Build Coastguard Worker     int *ddxDriverMajorVersion;
288*7688df22SAndroid Build Coastguard Worker     int *ddxDriverMinorVersion;
289*7688df22SAndroid Build Coastguard Worker     int *ddxDriverPatchVersion;
290*7688df22SAndroid Build Coastguard Worker     char **clientDriverName;
291*7688df22SAndroid Build Coastguard Worker {
292*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
293*7688df22SAndroid Build Coastguard Worker     xXF86DRIGetClientDriverNameReply rep;
294*7688df22SAndroid Build Coastguard Worker     xXF86DRIGetClientDriverNameReq *req;
295*7688df22SAndroid Build Coastguard Worker 
296*7688df22SAndroid Build Coastguard Worker     TRACE("GetClientDriverName...");
297*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
298*7688df22SAndroid Build Coastguard Worker 
299*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
300*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIGetClientDriverName, req);
301*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
302*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIGetClientDriverName;
303*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
304*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
305*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
306*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
307*7688df22SAndroid Build Coastguard Worker 	TRACE("GetClientDriverName... return False");
308*7688df22SAndroid Build Coastguard Worker 	return False;
309*7688df22SAndroid Build Coastguard Worker     }
310*7688df22SAndroid Build Coastguard Worker 
311*7688df22SAndroid Build Coastguard Worker     *ddxDriverMajorVersion = rep.ddxDriverMajorVersion;
312*7688df22SAndroid Build Coastguard Worker     *ddxDriverMinorVersion = rep.ddxDriverMinorVersion;
313*7688df22SAndroid Build Coastguard Worker     *ddxDriverPatchVersion = rep.ddxDriverPatchVersion;
314*7688df22SAndroid Build Coastguard Worker 
315*7688df22SAndroid Build Coastguard Worker     if (rep.length) {
316*7688df22SAndroid Build Coastguard Worker 	if (!(*clientDriverName =
317*7688df22SAndroid Build Coastguard Worker 		(char *)Xcalloc(rep.clientDriverNameLength + 1, 1))) {
318*7688df22SAndroid Build Coastguard Worker 	    _XEatData(dpy, ((rep.clientDriverNameLength + 3) & ~3));
319*7688df22SAndroid Build Coastguard Worker 	    UnlockDisplay(dpy);
320*7688df22SAndroid Build Coastguard Worker 	    SyncHandle();
321*7688df22SAndroid Build Coastguard Worker 	    TRACE("GetClientDriverName... return False");
322*7688df22SAndroid Build Coastguard Worker 	    return False;
323*7688df22SAndroid Build Coastguard Worker 	}
324*7688df22SAndroid Build Coastguard Worker 	_XReadPad(dpy, *clientDriverName, rep.clientDriverNameLength);
325*7688df22SAndroid Build Coastguard Worker     } else {
326*7688df22SAndroid Build Coastguard Worker 	*clientDriverName = NULL;
327*7688df22SAndroid Build Coastguard Worker     }
328*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
329*7688df22SAndroid Build Coastguard Worker     SyncHandle();
330*7688df22SAndroid Build Coastguard Worker     TRACE("GetClientDriverName... return True");
331*7688df22SAndroid Build Coastguard Worker     return True;
332*7688df22SAndroid Build Coastguard Worker }
333*7688df22SAndroid Build Coastguard Worker 
334*7688df22SAndroid Build Coastguard Worker Bool
uniDRICreateContextWithConfig(dpy,screen,configID,context,hHWContext)335*7688df22SAndroid Build Coastguard Worker uniDRICreateContextWithConfig(dpy, screen, configID, context, hHWContext)
336*7688df22SAndroid Build Coastguard Worker     Display *dpy;
337*7688df22SAndroid Build Coastguard Worker     int screen;
338*7688df22SAndroid Build Coastguard Worker     int configID;
339*7688df22SAndroid Build Coastguard Worker     XID *context;
340*7688df22SAndroid Build Coastguard Worker     drm_context_t *hHWContext;
341*7688df22SAndroid Build Coastguard Worker {
342*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
343*7688df22SAndroid Build Coastguard Worker     xXF86DRICreateContextReply rep;
344*7688df22SAndroid Build Coastguard Worker     xXF86DRICreateContextReq *req;
345*7688df22SAndroid Build Coastguard Worker 
346*7688df22SAndroid Build Coastguard Worker     TRACE("CreateContext...");
347*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
348*7688df22SAndroid Build Coastguard Worker 
349*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
350*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRICreateContext, req);
351*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
352*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRICreateContext;
353*7688df22SAndroid Build Coastguard Worker     req->visual = configID;
354*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
355*7688df22SAndroid Build Coastguard Worker     *context = XAllocID(dpy);
356*7688df22SAndroid Build Coastguard Worker     req->context = *context;
357*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
358*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
359*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
360*7688df22SAndroid Build Coastguard Worker 	TRACE("CreateContext... return False");
361*7688df22SAndroid Build Coastguard Worker 	return False;
362*7688df22SAndroid Build Coastguard Worker     }
363*7688df22SAndroid Build Coastguard Worker     *hHWContext = rep.hHWContext;
364*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
365*7688df22SAndroid Build Coastguard Worker     SyncHandle();
366*7688df22SAndroid Build Coastguard Worker     TRACE("CreateContext... return True");
367*7688df22SAndroid Build Coastguard Worker     return True;
368*7688df22SAndroid Build Coastguard Worker }
369*7688df22SAndroid Build Coastguard Worker 
370*7688df22SAndroid Build Coastguard Worker Bool
uniDRICreateContext(dpy,screen,visual,context,hHWContext)371*7688df22SAndroid Build Coastguard Worker uniDRICreateContext(dpy, screen, visual, context, hHWContext)
372*7688df22SAndroid Build Coastguard Worker     Display *dpy;
373*7688df22SAndroid Build Coastguard Worker     int screen;
374*7688df22SAndroid Build Coastguard Worker     Visual *visual;
375*7688df22SAndroid Build Coastguard Worker     XID *context;
376*7688df22SAndroid Build Coastguard Worker     drm_context_t *hHWContext;
377*7688df22SAndroid Build Coastguard Worker {
378*7688df22SAndroid Build Coastguard Worker     return uniDRICreateContextWithConfig(dpy, screen, visual->visualid,
379*7688df22SAndroid Build Coastguard Worker 	context, hHWContext);
380*7688df22SAndroid Build Coastguard Worker }
381*7688df22SAndroid Build Coastguard Worker 
382*7688df22SAndroid Build Coastguard Worker Bool
uniDRIDestroyContext(Display * ndpy,int screen,XID context)383*7688df22SAndroid Build Coastguard Worker uniDRIDestroyContext(Display * ndpy, int screen, XID context)
384*7688df22SAndroid Build Coastguard Worker {
385*7688df22SAndroid Build Coastguard Worker     Display *const dpy = (Display *) ndpy;
386*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
387*7688df22SAndroid Build Coastguard Worker     xXF86DRIDestroyContextReq *req;
388*7688df22SAndroid Build Coastguard Worker 
389*7688df22SAndroid Build Coastguard Worker     TRACE("DestroyContext...");
390*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
391*7688df22SAndroid Build Coastguard Worker 
392*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
393*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIDestroyContext, req);
394*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
395*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIDestroyContext;
396*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
397*7688df22SAndroid Build Coastguard Worker     req->context = context;
398*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
399*7688df22SAndroid Build Coastguard Worker     SyncHandle();
400*7688df22SAndroid Build Coastguard Worker     TRACE("DestroyContext... return True");
401*7688df22SAndroid Build Coastguard Worker     return True;
402*7688df22SAndroid Build Coastguard Worker }
403*7688df22SAndroid Build Coastguard Worker 
404*7688df22SAndroid Build Coastguard Worker Bool
uniDRICreateDrawable(Display * ndpy,int screen,Drawable drawable,drm_drawable_t * hHWDrawable)405*7688df22SAndroid Build Coastguard Worker uniDRICreateDrawable(Display * ndpy, int screen,
406*7688df22SAndroid Build Coastguard Worker     Drawable drawable, drm_drawable_t * hHWDrawable)
407*7688df22SAndroid Build Coastguard Worker {
408*7688df22SAndroid Build Coastguard Worker     Display *const dpy = (Display *) ndpy;
409*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
410*7688df22SAndroid Build Coastguard Worker     xXF86DRICreateDrawableReply rep;
411*7688df22SAndroid Build Coastguard Worker     xXF86DRICreateDrawableReq *req;
412*7688df22SAndroid Build Coastguard Worker 
413*7688df22SAndroid Build Coastguard Worker     TRACE("CreateDrawable...");
414*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
415*7688df22SAndroid Build Coastguard Worker 
416*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
417*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRICreateDrawable, req);
418*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
419*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRICreateDrawable;
420*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
421*7688df22SAndroid Build Coastguard Worker     req->drawable = drawable;
422*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
423*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
424*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
425*7688df22SAndroid Build Coastguard Worker 	TRACE("CreateDrawable... return False");
426*7688df22SAndroid Build Coastguard Worker 	return False;
427*7688df22SAndroid Build Coastguard Worker     }
428*7688df22SAndroid Build Coastguard Worker     *hHWDrawable = rep.hHWDrawable;
429*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
430*7688df22SAndroid Build Coastguard Worker     SyncHandle();
431*7688df22SAndroid Build Coastguard Worker     TRACE("CreateDrawable... return True");
432*7688df22SAndroid Build Coastguard Worker     return True;
433*7688df22SAndroid Build Coastguard Worker }
434*7688df22SAndroid Build Coastguard Worker 
435*7688df22SAndroid Build Coastguard Worker Bool
uniDRIDestroyDrawable(Display * ndpy,int screen,Drawable drawable)436*7688df22SAndroid Build Coastguard Worker uniDRIDestroyDrawable(Display * ndpy, int screen, Drawable drawable)
437*7688df22SAndroid Build Coastguard Worker {
438*7688df22SAndroid Build Coastguard Worker     Display *const dpy = (Display *) ndpy;
439*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
440*7688df22SAndroid Build Coastguard Worker     xXF86DRIDestroyDrawableReq *req;
441*7688df22SAndroid Build Coastguard Worker 
442*7688df22SAndroid Build Coastguard Worker     TRACE("DestroyDrawable...");
443*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
444*7688df22SAndroid Build Coastguard Worker 
445*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
446*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIDestroyDrawable, req);
447*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
448*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIDestroyDrawable;
449*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
450*7688df22SAndroid Build Coastguard Worker     req->drawable = drawable;
451*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
452*7688df22SAndroid Build Coastguard Worker     SyncHandle();
453*7688df22SAndroid Build Coastguard Worker     TRACE("DestroyDrawable... return True");
454*7688df22SAndroid Build Coastguard Worker     return True;
455*7688df22SAndroid Build Coastguard Worker }
456*7688df22SAndroid Build Coastguard Worker 
457*7688df22SAndroid Build Coastguard Worker Bool
uniDRIGetDrawableInfo(Display * dpy,int screen,Drawable drawable,unsigned int * index,unsigned int * stamp,int * X,int * Y,int * W,int * H,int * numClipRects,drm_clip_rect_t ** pClipRects,int * backX,int * backY,int * numBackClipRects,drm_clip_rect_t ** pBackClipRects)458*7688df22SAndroid Build Coastguard Worker uniDRIGetDrawableInfo(Display * dpy, int screen, Drawable drawable,
459*7688df22SAndroid Build Coastguard Worker     unsigned int *index, unsigned int *stamp,
460*7688df22SAndroid Build Coastguard Worker     int *X, int *Y, int *W, int *H,
461*7688df22SAndroid Build Coastguard Worker     int *numClipRects, drm_clip_rect_t ** pClipRects,
462*7688df22SAndroid Build Coastguard Worker     int *backX, int *backY,
463*7688df22SAndroid Build Coastguard Worker     int *numBackClipRects, drm_clip_rect_t ** pBackClipRects)
464*7688df22SAndroid Build Coastguard Worker {
465*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
466*7688df22SAndroid Build Coastguard Worker     xXF86DRIGetDrawableInfoReply rep;
467*7688df22SAndroid Build Coastguard Worker     xXF86DRIGetDrawableInfoReq *req;
468*7688df22SAndroid Build Coastguard Worker     int total_rects;
469*7688df22SAndroid Build Coastguard Worker 
470*7688df22SAndroid Build Coastguard Worker     TRACE("GetDrawableInfo...");
471*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
472*7688df22SAndroid Build Coastguard Worker 
473*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
474*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIGetDrawableInfo, req);
475*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
476*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIGetDrawableInfo;
477*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
478*7688df22SAndroid Build Coastguard Worker     req->drawable = drawable;
479*7688df22SAndroid Build Coastguard Worker 
480*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 1, xFalse)) {
481*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
482*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
483*7688df22SAndroid Build Coastguard Worker 	TRACE("GetDrawableInfo... return False");
484*7688df22SAndroid Build Coastguard Worker 	return False;
485*7688df22SAndroid Build Coastguard Worker     }
486*7688df22SAndroid Build Coastguard Worker     *index = rep.drawableTableIndex;
487*7688df22SAndroid Build Coastguard Worker     *stamp = rep.drawableTableStamp;
488*7688df22SAndroid Build Coastguard Worker     *X = (int)rep.drawableX;
489*7688df22SAndroid Build Coastguard Worker     *Y = (int)rep.drawableY;
490*7688df22SAndroid Build Coastguard Worker     *W = (int)rep.drawableWidth;
491*7688df22SAndroid Build Coastguard Worker     *H = (int)rep.drawableHeight;
492*7688df22SAndroid Build Coastguard Worker     *numClipRects = rep.numClipRects;
493*7688df22SAndroid Build Coastguard Worker     total_rects = *numClipRects;
494*7688df22SAndroid Build Coastguard Worker 
495*7688df22SAndroid Build Coastguard Worker     *backX = rep.backX;
496*7688df22SAndroid Build Coastguard Worker     *backY = rep.backY;
497*7688df22SAndroid Build Coastguard Worker     *numBackClipRects = rep.numBackClipRects;
498*7688df22SAndroid Build Coastguard Worker     total_rects += *numBackClipRects;
499*7688df22SAndroid Build Coastguard Worker 
500*7688df22SAndroid Build Coastguard Worker #if 0
501*7688df22SAndroid Build Coastguard Worker     /* Because of the fix in Xserver/GL/dri/xf86dri.c, this check breaks
502*7688df22SAndroid Build Coastguard Worker      * backwards compatibility (Because of the >> 2 shift) but the fix
503*7688df22SAndroid Build Coastguard Worker      * enables multi-threaded apps to work.
504*7688df22SAndroid Build Coastguard Worker      */
505*7688df22SAndroid Build Coastguard Worker     if (rep.length != ((((SIZEOF(xXF86DRIGetDrawableInfoReply) -
506*7688df22SAndroid Build Coastguard Worker 			SIZEOF(xGenericReply) +
507*7688df22SAndroid Build Coastguard Worker 			total_rects * sizeof(drm_clip_rect_t)) +
508*7688df22SAndroid Build Coastguard Worker 		    3) & ~3) >> 2)) {
509*7688df22SAndroid Build Coastguard Worker 	_XEatData(dpy, rep.length);
510*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
511*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
512*7688df22SAndroid Build Coastguard Worker 	TRACE("GetDrawableInfo... return False");
513*7688df22SAndroid Build Coastguard Worker 	return False;
514*7688df22SAndroid Build Coastguard Worker     }
515*7688df22SAndroid Build Coastguard Worker #endif
516*7688df22SAndroid Build Coastguard Worker 
517*7688df22SAndroid Build Coastguard Worker     if (*numClipRects) {
518*7688df22SAndroid Build Coastguard Worker 	int len = sizeof(drm_clip_rect_t) * (*numClipRects);
519*7688df22SAndroid Build Coastguard Worker 
520*7688df22SAndroid Build Coastguard Worker 	*pClipRects = (drm_clip_rect_t *) Xcalloc(len, 1);
521*7688df22SAndroid Build Coastguard Worker 	if (*pClipRects)
522*7688df22SAndroid Build Coastguard Worker 	    _XRead(dpy, (char *)*pClipRects, len);
523*7688df22SAndroid Build Coastguard Worker     } else {
524*7688df22SAndroid Build Coastguard Worker 	*pClipRects = NULL;
525*7688df22SAndroid Build Coastguard Worker     }
526*7688df22SAndroid Build Coastguard Worker 
527*7688df22SAndroid Build Coastguard Worker     if (*numBackClipRects) {
528*7688df22SAndroid Build Coastguard Worker 	int len = sizeof(drm_clip_rect_t) * (*numBackClipRects);
529*7688df22SAndroid Build Coastguard Worker 
530*7688df22SAndroid Build Coastguard Worker 	*pBackClipRects = (drm_clip_rect_t *) Xcalloc(len, 1);
531*7688df22SAndroid Build Coastguard Worker 	if (*pBackClipRects)
532*7688df22SAndroid Build Coastguard Worker 	    _XRead(dpy, (char *)*pBackClipRects, len);
533*7688df22SAndroid Build Coastguard Worker     } else {
534*7688df22SAndroid Build Coastguard Worker 	*pBackClipRects = NULL;
535*7688df22SAndroid Build Coastguard Worker     }
536*7688df22SAndroid Build Coastguard Worker 
537*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
538*7688df22SAndroid Build Coastguard Worker     SyncHandle();
539*7688df22SAndroid Build Coastguard Worker     TRACE("GetDrawableInfo... return True");
540*7688df22SAndroid Build Coastguard Worker     return True;
541*7688df22SAndroid Build Coastguard Worker }
542*7688df22SAndroid Build Coastguard Worker 
543*7688df22SAndroid Build Coastguard Worker Bool
uniDRIGetDeviceInfo(dpy,screen,hFrameBuffer,fbOrigin,fbSize,fbStride,devPrivateSize,pDevPrivate)544*7688df22SAndroid Build Coastguard Worker uniDRIGetDeviceInfo(dpy, screen, hFrameBuffer,
545*7688df22SAndroid Build Coastguard Worker     fbOrigin, fbSize, fbStride, devPrivateSize, pDevPrivate)
546*7688df22SAndroid Build Coastguard Worker     Display *dpy;
547*7688df22SAndroid Build Coastguard Worker     int screen;
548*7688df22SAndroid Build Coastguard Worker     drm_handle_t *hFrameBuffer;
549*7688df22SAndroid Build Coastguard Worker     int *fbOrigin;
550*7688df22SAndroid Build Coastguard Worker     int *fbSize;
551*7688df22SAndroid Build Coastguard Worker     int *fbStride;
552*7688df22SAndroid Build Coastguard Worker     int *devPrivateSize;
553*7688df22SAndroid Build Coastguard Worker     void **pDevPrivate;
554*7688df22SAndroid Build Coastguard Worker {
555*7688df22SAndroid Build Coastguard Worker     XExtDisplayInfo *info = find_display(dpy);
556*7688df22SAndroid Build Coastguard Worker     xXF86DRIGetDeviceInfoReply rep;
557*7688df22SAndroid Build Coastguard Worker     xXF86DRIGetDeviceInfoReq *req;
558*7688df22SAndroid Build Coastguard Worker 
559*7688df22SAndroid Build Coastguard Worker     TRACE("GetDeviceInfo...");
560*7688df22SAndroid Build Coastguard Worker     uniDRICheckExtension(dpy, info, False);
561*7688df22SAndroid Build Coastguard Worker 
562*7688df22SAndroid Build Coastguard Worker     LockDisplay(dpy);
563*7688df22SAndroid Build Coastguard Worker     GetReq(XF86DRIGetDeviceInfo, req);
564*7688df22SAndroid Build Coastguard Worker     req->reqType = info->codes->major_opcode;
565*7688df22SAndroid Build Coastguard Worker     req->driReqType = X_XF86DRIGetDeviceInfo;
566*7688df22SAndroid Build Coastguard Worker     req->screen = screen;
567*7688df22SAndroid Build Coastguard Worker     if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
568*7688df22SAndroid Build Coastguard Worker 	UnlockDisplay(dpy);
569*7688df22SAndroid Build Coastguard Worker 	SyncHandle();
570*7688df22SAndroid Build Coastguard Worker 	TRACE("GetDeviceInfo... return False");
571*7688df22SAndroid Build Coastguard Worker 	return False;
572*7688df22SAndroid Build Coastguard Worker     }
573*7688df22SAndroid Build Coastguard Worker 
574*7688df22SAndroid Build Coastguard Worker     *hFrameBuffer = rep.hFrameBufferLow;
575*7688df22SAndroid Build Coastguard Worker #ifdef LONG64
576*7688df22SAndroid Build Coastguard Worker     if (sizeof(drm_handle_t) == 8) {
577*7688df22SAndroid Build Coastguard Worker 	*hFrameBuffer |= ((unsigned long)rep.hFrameBufferHigh) << 32;
578*7688df22SAndroid Build Coastguard Worker     }
579*7688df22SAndroid Build Coastguard Worker #endif
580*7688df22SAndroid Build Coastguard Worker 
581*7688df22SAndroid Build Coastguard Worker     *fbOrigin = rep.framebufferOrigin;
582*7688df22SAndroid Build Coastguard Worker     *fbSize = rep.framebufferSize;
583*7688df22SAndroid Build Coastguard Worker     *fbStride = rep.framebufferStride;
584*7688df22SAndroid Build Coastguard Worker     *devPrivateSize = rep.devPrivateSize;
585*7688df22SAndroid Build Coastguard Worker 
586*7688df22SAndroid Build Coastguard Worker     if (rep.length) {
587*7688df22SAndroid Build Coastguard Worker 	if (!(*pDevPrivate = (void *)Xcalloc(rep.devPrivateSize, 1))) {
588*7688df22SAndroid Build Coastguard Worker 	    _XEatData(dpy, ((rep.devPrivateSize + 3) & ~3));
589*7688df22SAndroid Build Coastguard Worker 	    UnlockDisplay(dpy);
590*7688df22SAndroid Build Coastguard Worker 	    SyncHandle();
591*7688df22SAndroid Build Coastguard Worker 	    TRACE("GetDeviceInfo... return False");
592*7688df22SAndroid Build Coastguard Worker 	    return False;
593*7688df22SAndroid Build Coastguard Worker 	}
594*7688df22SAndroid Build Coastguard Worker 	_XRead(dpy, (char *)*pDevPrivate, rep.devPrivateSize);
595*7688df22SAndroid Build Coastguard Worker     } else {
596*7688df22SAndroid Build Coastguard Worker 	*pDevPrivate = NULL;
597*7688df22SAndroid Build Coastguard Worker     }
598*7688df22SAndroid Build Coastguard Worker 
599*7688df22SAndroid Build Coastguard Worker     UnlockDisplay(dpy);
600*7688df22SAndroid Build Coastguard Worker     SyncHandle();
601*7688df22SAndroid Build Coastguard Worker     TRACE("GetDeviceInfo... return True");
602*7688df22SAndroid Build Coastguard Worker     return True;
603*7688df22SAndroid Build Coastguard Worker }
604