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