1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3*61046927SAndroid Build Coastguard Worker * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: SGI-B-2.0
6*61046927SAndroid Build Coastguard Worker */
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker /**
9*61046927SAndroid Build Coastguard Worker * \file glxcmds.c
10*61046927SAndroid Build Coastguard Worker * Client-side GLX interface.
11*61046927SAndroid Build Coastguard Worker */
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker #include "glxclient.h"
14*61046927SAndroid Build Coastguard Worker #include "glapi.h"
15*61046927SAndroid Build Coastguard Worker #include "glxextensions.h"
16*61046927SAndroid Build Coastguard Worker #include "indirect.h"
17*61046927SAndroid Build Coastguard Worker #include "glx_error.h"
18*61046927SAndroid Build Coastguard Worker
19*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
20*61046927SAndroid Build Coastguard Worker #ifdef GLX_USE_APPLEGL
21*61046927SAndroid Build Coastguard Worker #include "apple/apple_glx_context.h"
22*61046927SAndroid Build Coastguard Worker #include "apple/apple_glx.h"
23*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
24*61046927SAndroid Build Coastguard Worker #else
25*61046927SAndroid Build Coastguard Worker #ifndef GLX_USE_WINDOWSGL
26*61046927SAndroid Build Coastguard Worker #include <X11/extensions/xf86vmode.h>
27*61046927SAndroid Build Coastguard Worker #endif /* GLX_USE_WINDOWSGL */
28*61046927SAndroid Build Coastguard Worker #endif
29*61046927SAndroid Build Coastguard Worker #endif
30*61046927SAndroid Build Coastguard Worker #include <limits.h>
31*61046927SAndroid Build Coastguard Worker #include <X11/Xlib-xcb.h>
32*61046927SAndroid Build Coastguard Worker #include <xcb/xcb.h>
33*61046927SAndroid Build Coastguard Worker #include <xcb/glx.h>
34*61046927SAndroid Build Coastguard Worker #include "GL/mesa_glinterop.h"
35*61046927SAndroid Build Coastguard Worker #include "dri_util.h"
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && (!defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE))
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker /**
40*61046927SAndroid Build Coastguard Worker * Get the __DRIdrawable for the drawable associated with a GLXContext
41*61046927SAndroid Build Coastguard Worker *
42*61046927SAndroid Build Coastguard Worker * \param dpy The display associated with \c drawable.
43*61046927SAndroid Build Coastguard Worker * \param drawable GLXDrawable whose __DRIdrawable part is to be retrieved.
44*61046927SAndroid Build Coastguard Worker * \param scrn_num If non-NULL, the drawables screen is stored there
45*61046927SAndroid Build Coastguard Worker * \returns A pointer to the context's __DRIdrawable on success, or NULL if
46*61046927SAndroid Build Coastguard Worker * the drawable is not associated with a direct-rendering context.
47*61046927SAndroid Build Coastguard Worker */
48*61046927SAndroid Build Coastguard Worker _X_HIDDEN __GLXDRIdrawable *
GetGLXDRIDrawable(Display * dpy,GLXDrawable drawable)49*61046927SAndroid Build Coastguard Worker GetGLXDRIDrawable(Display * dpy, GLXDrawable drawable)
50*61046927SAndroid Build Coastguard Worker {
51*61046927SAndroid Build Coastguard Worker struct glx_display *priv = __glXInitialize(dpy);
52*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw;
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker if (priv == NULL)
55*61046927SAndroid Build Coastguard Worker return NULL;
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker if (__glxHashLookup(priv->drawHash, drawable, (void *) &pdraw) == 0)
58*61046927SAndroid Build Coastguard Worker return pdraw;
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker return NULL;
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker #endif
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker _X_HIDDEN struct glx_drawable *
GetGLXDrawable(Display * dpy,GLXDrawable drawable)66*61046927SAndroid Build Coastguard Worker GetGLXDrawable(Display *dpy, GLXDrawable drawable)
67*61046927SAndroid Build Coastguard Worker {
68*61046927SAndroid Build Coastguard Worker struct glx_display *priv = __glXInitialize(dpy);
69*61046927SAndroid Build Coastguard Worker struct glx_drawable *glxDraw;
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker if (priv == NULL)
72*61046927SAndroid Build Coastguard Worker return NULL;
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker if (__glxHashLookup(priv->glXDrawHash, drawable, (void *) &glxDraw) == 0)
75*61046927SAndroid Build Coastguard Worker return glxDraw;
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker return NULL;
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker _X_HIDDEN int
InitGLXDrawable(Display * dpy,struct glx_drawable * glxDraw,XID xDrawable,GLXDrawable drawable)81*61046927SAndroid Build Coastguard Worker InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw, XID xDrawable,
82*61046927SAndroid Build Coastguard Worker GLXDrawable drawable)
83*61046927SAndroid Build Coastguard Worker {
84*61046927SAndroid Build Coastguard Worker struct glx_display *priv = __glXInitialize(dpy);
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker if (!priv)
87*61046927SAndroid Build Coastguard Worker return -1;
88*61046927SAndroid Build Coastguard Worker
89*61046927SAndroid Build Coastguard Worker glxDraw->xDrawable = xDrawable;
90*61046927SAndroid Build Coastguard Worker glxDraw->drawable = drawable;
91*61046927SAndroid Build Coastguard Worker glxDraw->lastEventSbc = 0;
92*61046927SAndroid Build Coastguard Worker glxDraw->eventSbcWrap = 0;
93*61046927SAndroid Build Coastguard Worker
94*61046927SAndroid Build Coastguard Worker return __glxHashInsert(priv->glXDrawHash, drawable, glxDraw);
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker _X_HIDDEN void
DestroyGLXDrawable(Display * dpy,GLXDrawable drawable)98*61046927SAndroid Build Coastguard Worker DestroyGLXDrawable(Display *dpy, GLXDrawable drawable)
99*61046927SAndroid Build Coastguard Worker {
100*61046927SAndroid Build Coastguard Worker struct glx_display *priv = __glXInitialize(dpy);
101*61046927SAndroid Build Coastguard Worker struct glx_drawable *glxDraw;
102*61046927SAndroid Build Coastguard Worker
103*61046927SAndroid Build Coastguard Worker if (!priv)
104*61046927SAndroid Build Coastguard Worker return;
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker glxDraw = GetGLXDrawable(dpy, drawable);
107*61046927SAndroid Build Coastguard Worker __glxHashDelete(priv->glXDrawHash, drawable);
108*61046927SAndroid Build Coastguard Worker free(glxDraw);
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker /**
112*61046927SAndroid Build Coastguard Worker * Get the GLX per-screen data structure associated with a GLX context.
113*61046927SAndroid Build Coastguard Worker *
114*61046927SAndroid Build Coastguard Worker * \param dpy Display for which the GLX per-screen information is to be
115*61046927SAndroid Build Coastguard Worker * retrieved.
116*61046927SAndroid Build Coastguard Worker * \param scrn Screen on \c dpy for which the GLX per-screen information is
117*61046927SAndroid Build Coastguard Worker * to be retrieved.
118*61046927SAndroid Build Coastguard Worker * \returns A pointer to the GLX per-screen data if \c dpy and \c scrn
119*61046927SAndroid Build Coastguard Worker * specify a valid GLX screen, or NULL otherwise.
120*61046927SAndroid Build Coastguard Worker *
121*61046927SAndroid Build Coastguard Worker * \todo Should this function validate that \c scrn is within the screen
122*61046927SAndroid Build Coastguard Worker * number range for \c dpy?
123*61046927SAndroid Build Coastguard Worker */
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker _X_HIDDEN struct glx_screen *
GetGLXScreenConfigs(Display * dpy,int scrn)126*61046927SAndroid Build Coastguard Worker GetGLXScreenConfigs(Display * dpy, int scrn)
127*61046927SAndroid Build Coastguard Worker {
128*61046927SAndroid Build Coastguard Worker struct glx_display *const priv = __glXInitialize(dpy);
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker return (priv
131*61046927SAndroid Build Coastguard Worker && priv->screens !=
132*61046927SAndroid Build Coastguard Worker NULL) ? priv->screens[scrn] : NULL;
133*61046927SAndroid Build Coastguard Worker }
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker static int
GetGLXPrivScreenConfig(Display * dpy,int scrn,struct glx_display ** ppriv,struct glx_screen ** ppsc)137*61046927SAndroid Build Coastguard Worker GetGLXPrivScreenConfig(Display * dpy, int scrn, struct glx_display ** ppriv,
138*61046927SAndroid Build Coastguard Worker struct glx_screen ** ppsc)
139*61046927SAndroid Build Coastguard Worker {
140*61046927SAndroid Build Coastguard Worker /* Initialize the extension, if needed . This has the added value
141*61046927SAndroid Build Coastguard Worker * of initializing/allocating the display private
142*61046927SAndroid Build Coastguard Worker */
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker if (dpy == NULL) {
145*61046927SAndroid Build Coastguard Worker return GLX_NO_EXTENSION;
146*61046927SAndroid Build Coastguard Worker }
147*61046927SAndroid Build Coastguard Worker
148*61046927SAndroid Build Coastguard Worker *ppriv = __glXInitialize(dpy);
149*61046927SAndroid Build Coastguard Worker if (*ppriv == NULL) {
150*61046927SAndroid Build Coastguard Worker return GLX_NO_EXTENSION;
151*61046927SAndroid Build Coastguard Worker }
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker /* Check screen number to see if its valid */
154*61046927SAndroid Build Coastguard Worker if ((scrn < 0) || (scrn >= ScreenCount(dpy))) {
155*61046927SAndroid Build Coastguard Worker return GLX_BAD_SCREEN;
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker /* Check to see if the GL is supported on this screen */
159*61046927SAndroid Build Coastguard Worker *ppsc = (*ppriv)->screens[scrn];
160*61046927SAndroid Build Coastguard Worker if ((*ppsc)->configs == NULL && (*ppsc)->visuals == NULL) {
161*61046927SAndroid Build Coastguard Worker /* No support for GL on this screen regardless of visual */
162*61046927SAndroid Build Coastguard Worker return GLX_BAD_VISUAL;
163*61046927SAndroid Build Coastguard Worker }
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard Worker return Success;
166*61046927SAndroid Build Coastguard Worker }
167*61046927SAndroid Build Coastguard Worker
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker /**
170*61046927SAndroid Build Coastguard Worker * Determine if a \c GLXFBConfig supplied by the application is valid.
171*61046927SAndroid Build Coastguard Worker *
172*61046927SAndroid Build Coastguard Worker * \param dpy Application supplied \c Display pointer.
173*61046927SAndroid Build Coastguard Worker * \param config Application supplied \c GLXFBConfig.
174*61046927SAndroid Build Coastguard Worker *
175*61046927SAndroid Build Coastguard Worker * \returns If the \c GLXFBConfig is valid, the a pointer to the matching
176*61046927SAndroid Build Coastguard Worker * \c struct glx_config structure is returned. Otherwise, \c NULL
177*61046927SAndroid Build Coastguard Worker * is returned.
178*61046927SAndroid Build Coastguard Worker */
179*61046927SAndroid Build Coastguard Worker static struct glx_config *
ValidateGLXFBConfig(Display * dpy,GLXFBConfig fbconfig)180*61046927SAndroid Build Coastguard Worker ValidateGLXFBConfig(Display * dpy, GLXFBConfig fbconfig)
181*61046927SAndroid Build Coastguard Worker {
182*61046927SAndroid Build Coastguard Worker struct glx_display *const priv = __glXInitialize(dpy);
183*61046927SAndroid Build Coastguard Worker int num_screens = ScreenCount(dpy);
184*61046927SAndroid Build Coastguard Worker unsigned i;
185*61046927SAndroid Build Coastguard Worker struct glx_config *config;
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker if (priv != NULL) {
188*61046927SAndroid Build Coastguard Worker for (i = 0; i < num_screens; i++) {
189*61046927SAndroid Build Coastguard Worker for (config = priv->screens[i]->configs; config != NULL;
190*61046927SAndroid Build Coastguard Worker config = config->next) {
191*61046927SAndroid Build Coastguard Worker if (config == (struct glx_config *) fbconfig) {
192*61046927SAndroid Build Coastguard Worker return config;
193*61046927SAndroid Build Coastguard Worker }
194*61046927SAndroid Build Coastguard Worker }
195*61046927SAndroid Build Coastguard Worker }
196*61046927SAndroid Build Coastguard Worker }
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker return NULL;
199*61046927SAndroid Build Coastguard Worker }
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker /**
202*61046927SAndroid Build Coastguard Worker * Verifies context's GLX_RENDER_TYPE value with config.
203*61046927SAndroid Build Coastguard Worker *
204*61046927SAndroid Build Coastguard Worker * \param config GLX FBConfig which will support the returned renderType.
205*61046927SAndroid Build Coastguard Worker * \param renderType The context render type to be verified.
206*61046927SAndroid Build Coastguard Worker * \return True if the value of context renderType was approved, or 0 if no
207*61046927SAndroid Build Coastguard Worker * valid value was found.
208*61046927SAndroid Build Coastguard Worker */
209*61046927SAndroid Build Coastguard Worker Bool
validate_renderType_against_config(const struct glx_config * config,int renderType)210*61046927SAndroid Build Coastguard Worker validate_renderType_against_config(const struct glx_config *config,
211*61046927SAndroid Build Coastguard Worker int renderType)
212*61046927SAndroid Build Coastguard Worker {
213*61046927SAndroid Build Coastguard Worker /* GLX_EXT_no_config_context supports any render type */
214*61046927SAndroid Build Coastguard Worker if (!config)
215*61046927SAndroid Build Coastguard Worker return renderType == GLX_DONT_CARE;
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker switch (renderType) {
218*61046927SAndroid Build Coastguard Worker case GLX_RGBA_TYPE:
219*61046927SAndroid Build Coastguard Worker return (config->renderType & GLX_RGBA_BIT) != 0;
220*61046927SAndroid Build Coastguard Worker case GLX_COLOR_INDEX_TYPE:
221*61046927SAndroid Build Coastguard Worker return (config->renderType & GLX_COLOR_INDEX_BIT) != 0;
222*61046927SAndroid Build Coastguard Worker case GLX_RGBA_FLOAT_TYPE_ARB:
223*61046927SAndroid Build Coastguard Worker return (config->renderType & GLX_RGBA_FLOAT_BIT_ARB) != 0;
224*61046927SAndroid Build Coastguard Worker case GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT:
225*61046927SAndroid Build Coastguard Worker return (config->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) != 0;
226*61046927SAndroid Build Coastguard Worker default:
227*61046927SAndroid Build Coastguard Worker break;
228*61046927SAndroid Build Coastguard Worker }
229*61046927SAndroid Build Coastguard Worker return 0;
230*61046927SAndroid Build Coastguard Worker }
231*61046927SAndroid Build Coastguard Worker
232*61046927SAndroid Build Coastguard Worker _X_HIDDEN Bool
glx_context_init(struct glx_context * gc,struct glx_screen * psc,struct glx_config * config)233*61046927SAndroid Build Coastguard Worker glx_context_init(struct glx_context *gc,
234*61046927SAndroid Build Coastguard Worker struct glx_screen *psc, struct glx_config *config)
235*61046927SAndroid Build Coastguard Worker {
236*61046927SAndroid Build Coastguard Worker gc->majorOpcode = __glXSetupForCommand(psc->display->dpy);
237*61046927SAndroid Build Coastguard Worker if (!gc->majorOpcode)
238*61046927SAndroid Build Coastguard Worker return False;
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker gc->psc = psc;
241*61046927SAndroid Build Coastguard Worker gc->config = config;
242*61046927SAndroid Build Coastguard Worker gc->isDirect = GL_TRUE;
243*61046927SAndroid Build Coastguard Worker gc->currentContextTag = -1;
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker if (!config)
246*61046927SAndroid Build Coastguard Worker gc->renderType = GLX_DONT_CARE;
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker return True;
249*61046927SAndroid Build Coastguard Worker }
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker /**
252*61046927SAndroid Build Coastguard Worker * Determine if a context uses direct rendering.
253*61046927SAndroid Build Coastguard Worker *
254*61046927SAndroid Build Coastguard Worker * \param dpy Display where the context was created.
255*61046927SAndroid Build Coastguard Worker * \param contextID ID of the context to be tested.
256*61046927SAndroid Build Coastguard Worker * \param error Out parameter, set to True on error if not NULL,
257*61046927SAndroid Build Coastguard Worker * otherwise raise the error to the application.
258*61046927SAndroid Build Coastguard Worker *
259*61046927SAndroid Build Coastguard Worker * \returns \c True if the context is direct rendering or not.
260*61046927SAndroid Build Coastguard Worker */
261*61046927SAndroid Build Coastguard Worker static Bool
__glXIsDirect(Display * dpy,GLXContextID contextID,Bool * error)262*61046927SAndroid Build Coastguard Worker __glXIsDirect(Display * dpy, GLXContextID contextID, Bool *error)
263*61046927SAndroid Build Coastguard Worker {
264*61046927SAndroid Build Coastguard Worker xcb_connection_t *c;
265*61046927SAndroid Build Coastguard Worker xcb_generic_error_t *err;
266*61046927SAndroid Build Coastguard Worker xcb_glx_is_direct_reply_t *reply;
267*61046927SAndroid Build Coastguard Worker Bool is_direct;
268*61046927SAndroid Build Coastguard Worker
269*61046927SAndroid Build Coastguard Worker c = XGetXCBConnection(dpy);
270*61046927SAndroid Build Coastguard Worker reply = xcb_glx_is_direct_reply(c, xcb_glx_is_direct(c, contextID), &err);
271*61046927SAndroid Build Coastguard Worker is_direct = (reply != NULL && reply->is_direct) ? True : False;
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Worker if (err != NULL) {
274*61046927SAndroid Build Coastguard Worker if (error)
275*61046927SAndroid Build Coastguard Worker *error = True;
276*61046927SAndroid Build Coastguard Worker else
277*61046927SAndroid Build Coastguard Worker __glXSendErrorForXcb(dpy, err);
278*61046927SAndroid Build Coastguard Worker free(err);
279*61046927SAndroid Build Coastguard Worker }
280*61046927SAndroid Build Coastguard Worker
281*61046927SAndroid Build Coastguard Worker free(reply);
282*61046927SAndroid Build Coastguard Worker
283*61046927SAndroid Build Coastguard Worker return is_direct;
284*61046927SAndroid Build Coastguard Worker }
285*61046927SAndroid Build Coastguard Worker
286*61046927SAndroid Build Coastguard Worker /**
287*61046927SAndroid Build Coastguard Worker * Create a new context.
288*61046927SAndroid Build Coastguard Worker *
289*61046927SAndroid Build Coastguard Worker * \param renderType For FBConfigs, what is the rendering type?
290*61046927SAndroid Build Coastguard Worker */
291*61046927SAndroid Build Coastguard Worker
292*61046927SAndroid Build Coastguard Worker static GLXContext
CreateContext(Display * dpy,int generic_id,struct glx_config * config,GLXContext shareList_user,Bool allowDirect,unsigned code,int renderType)293*61046927SAndroid Build Coastguard Worker CreateContext(Display *dpy, int generic_id, struct glx_config *config,
294*61046927SAndroid Build Coastguard Worker GLXContext shareList_user, Bool allowDirect,
295*61046927SAndroid Build Coastguard Worker unsigned code, int renderType)
296*61046927SAndroid Build Coastguard Worker {
297*61046927SAndroid Build Coastguard Worker struct glx_context *gc;
298*61046927SAndroid Build Coastguard Worker struct glx_screen *psc;
299*61046927SAndroid Build Coastguard Worker struct glx_context *shareList = (struct glx_context *) shareList_user;
300*61046927SAndroid Build Coastguard Worker if (dpy == NULL)
301*61046927SAndroid Build Coastguard Worker return NULL;
302*61046927SAndroid Build Coastguard Worker
303*61046927SAndroid Build Coastguard Worker psc = GetGLXScreenConfigs(dpy, config->screen);
304*61046927SAndroid Build Coastguard Worker if (psc == NULL)
305*61046927SAndroid Build Coastguard Worker return NULL;
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker if (generic_id == None)
308*61046927SAndroid Build Coastguard Worker return NULL;
309*61046927SAndroid Build Coastguard Worker
310*61046927SAndroid Build Coastguard Worker /* Some application may request an indirect context but we may want to force a direct
311*61046927SAndroid Build Coastguard Worker * one because Xorg only allows indirect contexts if they were enabled.
312*61046927SAndroid Build Coastguard Worker */
313*61046927SAndroid Build Coastguard Worker if (!allowDirect &&
314*61046927SAndroid Build Coastguard Worker psc->force_direct_context) {
315*61046927SAndroid Build Coastguard Worker allowDirect = 1;
316*61046927SAndroid Build Coastguard Worker }
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker gc = NULL;
319*61046927SAndroid Build Coastguard Worker #if defined(GLX_USE_APPLEGL) && !defined(GLX_USE_APPLE)
320*61046927SAndroid Build Coastguard Worker gc = applegl_create_context(psc, config, shareList, renderType);
321*61046927SAndroid Build Coastguard Worker #else
322*61046927SAndroid Build Coastguard Worker if (allowDirect && psc->vtable->create_context)
323*61046927SAndroid Build Coastguard Worker gc = psc->vtable->create_context(psc, config, shareList, renderType);
324*61046927SAndroid Build Coastguard Worker if (!gc)
325*61046927SAndroid Build Coastguard Worker gc = indirect_create_context(psc, config, shareList, renderType);
326*61046927SAndroid Build Coastguard Worker #endif
327*61046927SAndroid Build Coastguard Worker if (!gc)
328*61046927SAndroid Build Coastguard Worker return NULL;
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
331*61046927SAndroid Build Coastguard Worker switch (code) {
332*61046927SAndroid Build Coastguard Worker case X_GLXCreateContext: {
333*61046927SAndroid Build Coastguard Worker xGLXCreateContextReq *req;
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker /* Send the glXCreateContext request */
336*61046927SAndroid Build Coastguard Worker GetReq(GLXCreateContext, req);
337*61046927SAndroid Build Coastguard Worker req->reqType = gc->majorOpcode;
338*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXCreateContext;
339*61046927SAndroid Build Coastguard Worker req->context = gc->xid = XAllocID(dpy);
340*61046927SAndroid Build Coastguard Worker req->visual = generic_id;
341*61046927SAndroid Build Coastguard Worker req->screen = config->screen;
342*61046927SAndroid Build Coastguard Worker req->shareList = shareList ? shareList->xid : None;
343*61046927SAndroid Build Coastguard Worker req->isDirect = gc->isDirect;
344*61046927SAndroid Build Coastguard Worker break;
345*61046927SAndroid Build Coastguard Worker }
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker case X_GLXCreateNewContext: {
348*61046927SAndroid Build Coastguard Worker xGLXCreateNewContextReq *req;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker /* Send the glXCreateNewContext request */
351*61046927SAndroid Build Coastguard Worker GetReq(GLXCreateNewContext, req);
352*61046927SAndroid Build Coastguard Worker req->reqType = gc->majorOpcode;
353*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXCreateNewContext;
354*61046927SAndroid Build Coastguard Worker req->context = gc->xid = XAllocID(dpy);
355*61046927SAndroid Build Coastguard Worker req->fbconfig = generic_id;
356*61046927SAndroid Build Coastguard Worker req->screen = config->screen;
357*61046927SAndroid Build Coastguard Worker req->renderType = renderType;
358*61046927SAndroid Build Coastguard Worker req->shareList = shareList ? shareList->xid : None;
359*61046927SAndroid Build Coastguard Worker req->isDirect = gc->isDirect;
360*61046927SAndroid Build Coastguard Worker break;
361*61046927SAndroid Build Coastguard Worker }
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker default:
364*61046927SAndroid Build Coastguard Worker /* What to do here? This case is the sign of an internal error. It
365*61046927SAndroid Build Coastguard Worker * should never be reachable.
366*61046927SAndroid Build Coastguard Worker */
367*61046927SAndroid Build Coastguard Worker break;
368*61046927SAndroid Build Coastguard Worker }
369*61046927SAndroid Build Coastguard Worker
370*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
371*61046927SAndroid Build Coastguard Worker SyncHandle();
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker gc->share_xid = shareList ? shareList->xid : None;
374*61046927SAndroid Build Coastguard Worker gc->imported = GL_FALSE;
375*61046927SAndroid Build Coastguard Worker
376*61046927SAndroid Build Coastguard Worker /* Unlike most X resource creation requests, we're about to return a handle
377*61046927SAndroid Build Coastguard Worker * with client-side state, not just an XID. To simplify error handling
378*61046927SAndroid Build Coastguard Worker * elsewhere in libGL, force a round-trip here to ensure the CreateContext
379*61046927SAndroid Build Coastguard Worker * request above succeeded.
380*61046927SAndroid Build Coastguard Worker */
381*61046927SAndroid Build Coastguard Worker {
382*61046927SAndroid Build Coastguard Worker Bool error = False;
383*61046927SAndroid Build Coastguard Worker int isDirect = __glXIsDirect(dpy, gc->xid, &error);
384*61046927SAndroid Build Coastguard Worker
385*61046927SAndroid Build Coastguard Worker if (error != False || isDirect != gc->isDirect) {
386*61046927SAndroid Build Coastguard Worker gc->vtable->destroy(gc);
387*61046927SAndroid Build Coastguard Worker gc = NULL;
388*61046927SAndroid Build Coastguard Worker }
389*61046927SAndroid Build Coastguard Worker }
390*61046927SAndroid Build Coastguard Worker
391*61046927SAndroid Build Coastguard Worker return (GLXContext) gc;
392*61046927SAndroid Build Coastguard Worker }
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLXContext
glXCreateContext(Display * dpy,XVisualInfo * vis,GLXContext shareList,Bool allowDirect)395*61046927SAndroid Build Coastguard Worker glXCreateContext(Display * dpy, XVisualInfo * vis,
396*61046927SAndroid Build Coastguard Worker GLXContext shareList, Bool allowDirect)
397*61046927SAndroid Build Coastguard Worker {
398*61046927SAndroid Build Coastguard Worker struct glx_config *config = NULL;
399*61046927SAndroid Build Coastguard Worker int renderType = GLX_RGBA_TYPE;
400*61046927SAndroid Build Coastguard Worker
401*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) || defined(GLX_USE_APPLEGL)
402*61046927SAndroid Build Coastguard Worker struct glx_screen *const psc = GetGLXScreenConfigs(dpy, vis->screen);
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker if (psc)
405*61046927SAndroid Build Coastguard Worker config = glx_config_find_visual(psc->visuals, vis->visualid);
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard Worker if (config == NULL) {
408*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, BadValue, vis->visualid, X_GLXCreateContext, True);
409*61046927SAndroid Build Coastguard Worker return None;
410*61046927SAndroid Build Coastguard Worker }
411*61046927SAndroid Build Coastguard Worker
412*61046927SAndroid Build Coastguard Worker /* Choose the context render type based on DRI config values. It is
413*61046927SAndroid Build Coastguard Worker * unusual to set this type from config, but we have no other choice, as
414*61046927SAndroid Build Coastguard Worker * this old API does not provide renderType parameter.
415*61046927SAndroid Build Coastguard Worker */
416*61046927SAndroid Build Coastguard Worker if (config->renderType & GLX_RGBA_FLOAT_BIT_ARB) {
417*61046927SAndroid Build Coastguard Worker renderType = GLX_RGBA_FLOAT_TYPE_ARB;
418*61046927SAndroid Build Coastguard Worker } else if (config->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) {
419*61046927SAndroid Build Coastguard Worker renderType = GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT;
420*61046927SAndroid Build Coastguard Worker } else if (config->renderType & GLX_RGBA_BIT) {
421*61046927SAndroid Build Coastguard Worker renderType = GLX_RGBA_TYPE;
422*61046927SAndroid Build Coastguard Worker } else if (config->renderType & GLX_COLOR_INDEX_BIT) {
423*61046927SAndroid Build Coastguard Worker renderType = GLX_COLOR_INDEX_TYPE;
424*61046927SAndroid Build Coastguard Worker }
425*61046927SAndroid Build Coastguard Worker #endif
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker return CreateContext(dpy, vis->visualid, config, shareList, allowDirect,
428*61046927SAndroid Build Coastguard Worker X_GLXCreateContext, renderType);
429*61046927SAndroid Build Coastguard Worker }
430*61046927SAndroid Build Coastguard Worker
431*61046927SAndroid Build Coastguard Worker static void
glx_send_destroy_context(Display * dpy,XID xid)432*61046927SAndroid Build Coastguard Worker glx_send_destroy_context(Display *dpy, XID xid)
433*61046927SAndroid Build Coastguard Worker {
434*61046927SAndroid Build Coastguard Worker CARD8 opcode = __glXSetupForCommand(dpy);
435*61046927SAndroid Build Coastguard Worker xGLXDestroyContextReq *req;
436*61046927SAndroid Build Coastguard Worker
437*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
438*61046927SAndroid Build Coastguard Worker GetReq(GLXDestroyContext, req);
439*61046927SAndroid Build Coastguard Worker req->reqType = opcode;
440*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXDestroyContext;
441*61046927SAndroid Build Coastguard Worker req->context = xid;
442*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
443*61046927SAndroid Build Coastguard Worker SyncHandle();
444*61046927SAndroid Build Coastguard Worker }
445*61046927SAndroid Build Coastguard Worker
446*61046927SAndroid Build Coastguard Worker /*
447*61046927SAndroid Build Coastguard Worker ** Destroy the named context
448*61046927SAndroid Build Coastguard Worker */
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC void
glXDestroyContext(Display * dpy,GLXContext ctx)451*61046927SAndroid Build Coastguard Worker glXDestroyContext(Display * dpy, GLXContext ctx)
452*61046927SAndroid Build Coastguard Worker {
453*61046927SAndroid Build Coastguard Worker struct glx_context *gc = (struct glx_context *) ctx;
454*61046927SAndroid Build Coastguard Worker
455*61046927SAndroid Build Coastguard Worker if (gc == NULL || gc->xid == None)
456*61046927SAndroid Build Coastguard Worker return;
457*61046927SAndroid Build Coastguard Worker
458*61046927SAndroid Build Coastguard Worker __glXLock();
459*61046927SAndroid Build Coastguard Worker if (!gc->imported)
460*61046927SAndroid Build Coastguard Worker glx_send_destroy_context(dpy, gc->xid);
461*61046927SAndroid Build Coastguard Worker
462*61046927SAndroid Build Coastguard Worker if (gc->currentDpy) {
463*61046927SAndroid Build Coastguard Worker /* This context is bound to some thread. According to the man page,
464*61046927SAndroid Build Coastguard Worker * we should not actually delete the context until it's unbound.
465*61046927SAndroid Build Coastguard Worker * Note that we set gc->xid = None above. In MakeContextCurrent()
466*61046927SAndroid Build Coastguard Worker * we check for that and delete the context there.
467*61046927SAndroid Build Coastguard Worker */
468*61046927SAndroid Build Coastguard Worker gc->xid = None;
469*61046927SAndroid Build Coastguard Worker } else {
470*61046927SAndroid Build Coastguard Worker gc->vtable->destroy(gc);
471*61046927SAndroid Build Coastguard Worker }
472*61046927SAndroid Build Coastguard Worker __glXUnlock();
473*61046927SAndroid Build Coastguard Worker }
474*61046927SAndroid Build Coastguard Worker
475*61046927SAndroid Build Coastguard Worker /*
476*61046927SAndroid Build Coastguard Worker ** Return the major and minor version #s for the GLX extension
477*61046927SAndroid Build Coastguard Worker */
478*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC Bool
glXQueryVersion(Display * dpy,int * major,int * minor)479*61046927SAndroid Build Coastguard Worker glXQueryVersion(Display * dpy, int *major, int *minor)
480*61046927SAndroid Build Coastguard Worker {
481*61046927SAndroid Build Coastguard Worker struct glx_display *priv;
482*61046927SAndroid Build Coastguard Worker
483*61046927SAndroid Build Coastguard Worker /* Init the extension. This fetches the major and minor version. */
484*61046927SAndroid Build Coastguard Worker priv = __glXInitialize(dpy);
485*61046927SAndroid Build Coastguard Worker if (!priv)
486*61046927SAndroid Build Coastguard Worker return False;
487*61046927SAndroid Build Coastguard Worker
488*61046927SAndroid Build Coastguard Worker if (major)
489*61046927SAndroid Build Coastguard Worker *major = GLX_MAJOR_VERSION;
490*61046927SAndroid Build Coastguard Worker if (minor)
491*61046927SAndroid Build Coastguard Worker *minor = priv->minorVersion;
492*61046927SAndroid Build Coastguard Worker return True;
493*61046927SAndroid Build Coastguard Worker }
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker /*
496*61046927SAndroid Build Coastguard Worker ** Query the existence of the GLX extension
497*61046927SAndroid Build Coastguard Worker */
498*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC Bool
glXQueryExtension(Display * dpy,int * errorBase,int * eventBase)499*61046927SAndroid Build Coastguard Worker glXQueryExtension(Display * dpy, int *errorBase, int *eventBase)
500*61046927SAndroid Build Coastguard Worker {
501*61046927SAndroid Build Coastguard Worker int major_op, erb, evb;
502*61046927SAndroid Build Coastguard Worker Bool rv;
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker rv = XQueryExtension(dpy, GLX_EXTENSION_NAME, &major_op, &evb, &erb);
505*61046927SAndroid Build Coastguard Worker if (rv) {
506*61046927SAndroid Build Coastguard Worker if (errorBase)
507*61046927SAndroid Build Coastguard Worker *errorBase = erb;
508*61046927SAndroid Build Coastguard Worker if (eventBase)
509*61046927SAndroid Build Coastguard Worker *eventBase = evb;
510*61046927SAndroid Build Coastguard Worker }
511*61046927SAndroid Build Coastguard Worker return rv;
512*61046927SAndroid Build Coastguard Worker }
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker /*
515*61046927SAndroid Build Coastguard Worker ** Put a barrier in the token stream that forces the GL to finish its
516*61046927SAndroid Build Coastguard Worker ** work before X can proceed.
517*61046927SAndroid Build Coastguard Worker */
518*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC void
glXWaitGL(void)519*61046927SAndroid Build Coastguard Worker glXWaitGL(void)
520*61046927SAndroid Build Coastguard Worker {
521*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
522*61046927SAndroid Build Coastguard Worker
523*61046927SAndroid Build Coastguard Worker if (gc->vtable->wait_gl)
524*61046927SAndroid Build Coastguard Worker gc->vtable->wait_gl(gc);
525*61046927SAndroid Build Coastguard Worker }
526*61046927SAndroid Build Coastguard Worker
527*61046927SAndroid Build Coastguard Worker /*
528*61046927SAndroid Build Coastguard Worker ** Put a barrier in the token stream that forces X to finish its
529*61046927SAndroid Build Coastguard Worker ** work before GL can proceed.
530*61046927SAndroid Build Coastguard Worker */
531*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC void
glXWaitX(void)532*61046927SAndroid Build Coastguard Worker glXWaitX(void)
533*61046927SAndroid Build Coastguard Worker {
534*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
535*61046927SAndroid Build Coastguard Worker
536*61046927SAndroid Build Coastguard Worker if (gc->vtable->wait_x)
537*61046927SAndroid Build Coastguard Worker gc->vtable->wait_x(gc);
538*61046927SAndroid Build Coastguard Worker }
539*61046927SAndroid Build Coastguard Worker
540*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC void
glXUseXFont(Font font,int first,int count,int listBase)541*61046927SAndroid Build Coastguard Worker glXUseXFont(Font font, int first, int count, int listBase)
542*61046927SAndroid Build Coastguard Worker {
543*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
544*61046927SAndroid Build Coastguard Worker xGLXUseXFontReq *req;
545*61046927SAndroid Build Coastguard Worker Display *dpy = gc->currentDpy;
546*61046927SAndroid Build Coastguard Worker
547*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
548*61046927SAndroid Build Coastguard Worker if (gc->isDirect) {
549*61046927SAndroid Build Coastguard Worker DRI_glXUseXFont(gc, font, first, count, listBase);
550*61046927SAndroid Build Coastguard Worker return;
551*61046927SAndroid Build Coastguard Worker }
552*61046927SAndroid Build Coastguard Worker #endif
553*61046927SAndroid Build Coastguard Worker
554*61046927SAndroid Build Coastguard Worker /* Flush any pending commands out */
555*61046927SAndroid Build Coastguard Worker __glXFlushRenderBuffer(gc, gc->pc);
556*61046927SAndroid Build Coastguard Worker
557*61046927SAndroid Build Coastguard Worker /* Send the glXUseFont request */
558*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
559*61046927SAndroid Build Coastguard Worker GetReq(GLXUseXFont, req);
560*61046927SAndroid Build Coastguard Worker req->reqType = gc->majorOpcode;
561*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXUseXFont;
562*61046927SAndroid Build Coastguard Worker req->contextTag = gc->currentContextTag;
563*61046927SAndroid Build Coastguard Worker req->font = font;
564*61046927SAndroid Build Coastguard Worker req->first = first;
565*61046927SAndroid Build Coastguard Worker req->count = count;
566*61046927SAndroid Build Coastguard Worker req->listBase = listBase;
567*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
568*61046927SAndroid Build Coastguard Worker SyncHandle();
569*61046927SAndroid Build Coastguard Worker }
570*61046927SAndroid Build Coastguard Worker
571*61046927SAndroid Build Coastguard Worker /************************************************************************/
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Worker /*
574*61046927SAndroid Build Coastguard Worker ** Copy the source context to the destination context using the
575*61046927SAndroid Build Coastguard Worker ** attribute "mask".
576*61046927SAndroid Build Coastguard Worker */
577*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC void
glXCopyContext(Display * dpy,GLXContext source_user,GLXContext dest_user,unsigned long mask)578*61046927SAndroid Build Coastguard Worker glXCopyContext(Display * dpy, GLXContext source_user,
579*61046927SAndroid Build Coastguard Worker GLXContext dest_user, unsigned long mask)
580*61046927SAndroid Build Coastguard Worker {
581*61046927SAndroid Build Coastguard Worker struct glx_context *source = (struct glx_context *) source_user;
582*61046927SAndroid Build Coastguard Worker struct glx_context *dest = (struct glx_context *) dest_user;
583*61046927SAndroid Build Coastguard Worker
584*61046927SAndroid Build Coastguard Worker /* GLX spec 3.3: If the destination context is current for some thread
585*61046927SAndroid Build Coastguard Worker * then a BadAccess error is generated
586*61046927SAndroid Build Coastguard Worker */
587*61046927SAndroid Build Coastguard Worker if (dest && dest->currentDpy) {
588*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, BadAccess, 0, X_GLXCopyContext, true);
589*61046927SAndroid Build Coastguard Worker return;
590*61046927SAndroid Build Coastguard Worker }
591*61046927SAndroid Build Coastguard Worker #ifdef GLX_USE_APPLEGL
592*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
593*61046927SAndroid Build Coastguard Worker int errorcode;
594*61046927SAndroid Build Coastguard Worker bool x11error;
595*61046927SAndroid Build Coastguard Worker
596*61046927SAndroid Build Coastguard Worker if(apple_glx_copy_context(gc->driContext, source->driContext, dest->driContext,
597*61046927SAndroid Build Coastguard Worker mask, &errorcode, &x11error)) {
598*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, errorcode, 0, X_GLXCopyContext, x11error);
599*61046927SAndroid Build Coastguard Worker }
600*61046927SAndroid Build Coastguard Worker
601*61046927SAndroid Build Coastguard Worker #else
602*61046927SAndroid Build Coastguard Worker xGLXCopyContextReq *req;
603*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
604*61046927SAndroid Build Coastguard Worker GLXContextTag tag;
605*61046927SAndroid Build Coastguard Worker CARD8 opcode;
606*61046927SAndroid Build Coastguard Worker
607*61046927SAndroid Build Coastguard Worker opcode = __glXSetupForCommand(dpy);
608*61046927SAndroid Build Coastguard Worker if (!opcode) {
609*61046927SAndroid Build Coastguard Worker return;
610*61046927SAndroid Build Coastguard Worker }
611*61046927SAndroid Build Coastguard Worker
612*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
613*61046927SAndroid Build Coastguard Worker if (gc->isDirect) {
614*61046927SAndroid Build Coastguard Worker /* NOT_DONE: This does not work yet */
615*61046927SAndroid Build Coastguard Worker }
616*61046927SAndroid Build Coastguard Worker #endif
617*61046927SAndroid Build Coastguard Worker
618*61046927SAndroid Build Coastguard Worker /*
619*61046927SAndroid Build Coastguard Worker ** If the source is the current context, send its tag so that the context
620*61046927SAndroid Build Coastguard Worker ** can be flushed before the copy.
621*61046927SAndroid Build Coastguard Worker */
622*61046927SAndroid Build Coastguard Worker if (source == gc && dpy == gc->currentDpy) {
623*61046927SAndroid Build Coastguard Worker tag = gc->currentContextTag;
624*61046927SAndroid Build Coastguard Worker }
625*61046927SAndroid Build Coastguard Worker else {
626*61046927SAndroid Build Coastguard Worker tag = 0;
627*61046927SAndroid Build Coastguard Worker }
628*61046927SAndroid Build Coastguard Worker
629*61046927SAndroid Build Coastguard Worker /* Send the glXCopyContext request */
630*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
631*61046927SAndroid Build Coastguard Worker GetReq(GLXCopyContext, req);
632*61046927SAndroid Build Coastguard Worker req->reqType = opcode;
633*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXCopyContext;
634*61046927SAndroid Build Coastguard Worker req->source = source ? source->xid : None;
635*61046927SAndroid Build Coastguard Worker req->dest = dest ? dest->xid : None;
636*61046927SAndroid Build Coastguard Worker req->mask = mask;
637*61046927SAndroid Build Coastguard Worker req->contextTag = tag;
638*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
639*61046927SAndroid Build Coastguard Worker SyncHandle();
640*61046927SAndroid Build Coastguard Worker #endif /* GLX_USE_APPLEGL */
641*61046927SAndroid Build Coastguard Worker }
642*61046927SAndroid Build Coastguard Worker
643*61046927SAndroid Build Coastguard Worker
644*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC Bool
glXIsDirect(Display * dpy,GLXContext gc_user)645*61046927SAndroid Build Coastguard Worker glXIsDirect(Display * dpy, GLXContext gc_user)
646*61046927SAndroid Build Coastguard Worker {
647*61046927SAndroid Build Coastguard Worker struct glx_context *gc = (struct glx_context *) gc_user;
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker /* This is set for us at context creation */
650*61046927SAndroid Build Coastguard Worker return gc ? gc->isDirect : False;
651*61046927SAndroid Build Coastguard Worker }
652*61046927SAndroid Build Coastguard Worker
653*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC void
glXSwapBuffers(Display * dpy,GLXDrawable drawable)654*61046927SAndroid Build Coastguard Worker glXSwapBuffers(Display * dpy, GLXDrawable drawable)
655*61046927SAndroid Build Coastguard Worker {
656*61046927SAndroid Build Coastguard Worker #if defined(GLX_USE_APPLEGL) && !defined(GLX_USE_APPLE)
657*61046927SAndroid Build Coastguard Worker struct glx_context * gc = __glXGetCurrentContext();
658*61046927SAndroid Build Coastguard Worker if(gc != &dummyContext && apple_glx_is_current_drawable(dpy, gc->driContext, drawable)) {
659*61046927SAndroid Build Coastguard Worker apple_glx_swap_buffers(gc->driContext);
660*61046927SAndroid Build Coastguard Worker } else {
661*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, GLXBadCurrentWindow, 0, X_GLXSwapBuffers, false);
662*61046927SAndroid Build Coastguard Worker }
663*61046927SAndroid Build Coastguard Worker #else
664*61046927SAndroid Build Coastguard Worker struct glx_context *gc;
665*61046927SAndroid Build Coastguard Worker GLXContextTag tag;
666*61046927SAndroid Build Coastguard Worker CARD8 opcode;
667*61046927SAndroid Build Coastguard Worker xcb_connection_t *c;
668*61046927SAndroid Build Coastguard Worker
669*61046927SAndroid Build Coastguard Worker gc = __glXGetCurrentContext();
670*61046927SAndroid Build Coastguard Worker
671*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && (!defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE))
672*61046927SAndroid Build Coastguard Worker {
673*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
674*61046927SAndroid Build Coastguard Worker
675*61046927SAndroid Build Coastguard Worker if (pdraw != NULL) {
676*61046927SAndroid Build Coastguard Worker Bool flush = gc != &dummyContext && drawable == gc->currentDrawable;
677*61046927SAndroid Build Coastguard Worker
678*61046927SAndroid Build Coastguard Worker if (pdraw->psc->driScreen.swapBuffers(pdraw, 0, 0, 0, flush) == -1)
679*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, GLXBadCurrentWindow, 0, X_GLXSwapBuffers, false);
680*61046927SAndroid Build Coastguard Worker return;
681*61046927SAndroid Build Coastguard Worker }
682*61046927SAndroid Build Coastguard Worker }
683*61046927SAndroid Build Coastguard Worker #endif
684*61046927SAndroid Build Coastguard Worker
685*61046927SAndroid Build Coastguard Worker opcode = __glXSetupForCommand(dpy);
686*61046927SAndroid Build Coastguard Worker if (!opcode) {
687*61046927SAndroid Build Coastguard Worker return;
688*61046927SAndroid Build Coastguard Worker }
689*61046927SAndroid Build Coastguard Worker
690*61046927SAndroid Build Coastguard Worker /*
691*61046927SAndroid Build Coastguard Worker ** The calling thread may or may not have a current context. If it
692*61046927SAndroid Build Coastguard Worker ** does, send the context tag so the server can do a flush.
693*61046927SAndroid Build Coastguard Worker */
694*61046927SAndroid Build Coastguard Worker if ((gc != &dummyContext) && (dpy == gc->currentDpy) &&
695*61046927SAndroid Build Coastguard Worker ((drawable == gc->currentDrawable)
696*61046927SAndroid Build Coastguard Worker || (drawable == gc->currentReadable))) {
697*61046927SAndroid Build Coastguard Worker tag = gc->currentContextTag;
698*61046927SAndroid Build Coastguard Worker }
699*61046927SAndroid Build Coastguard Worker else {
700*61046927SAndroid Build Coastguard Worker tag = 0;
701*61046927SAndroid Build Coastguard Worker }
702*61046927SAndroid Build Coastguard Worker
703*61046927SAndroid Build Coastguard Worker c = XGetXCBConnection(dpy);
704*61046927SAndroid Build Coastguard Worker xcb_glx_swap_buffers(c, tag, drawable);
705*61046927SAndroid Build Coastguard Worker xcb_flush(c);
706*61046927SAndroid Build Coastguard Worker #endif /* GLX_USE_APPLEGL */
707*61046927SAndroid Build Coastguard Worker }
708*61046927SAndroid Build Coastguard Worker
709*61046927SAndroid Build Coastguard Worker
710*61046927SAndroid Build Coastguard Worker /*
711*61046927SAndroid Build Coastguard Worker ** Return configuration information for the given display, screen and
712*61046927SAndroid Build Coastguard Worker ** visual combination.
713*61046927SAndroid Build Coastguard Worker */
714*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC int
glXGetConfig(Display * dpy,XVisualInfo * vis,int attribute,int * value_return)715*61046927SAndroid Build Coastguard Worker glXGetConfig(Display * dpy, XVisualInfo * vis, int attribute,
716*61046927SAndroid Build Coastguard Worker int *value_return)
717*61046927SAndroid Build Coastguard Worker {
718*61046927SAndroid Build Coastguard Worker struct glx_display *priv;
719*61046927SAndroid Build Coastguard Worker struct glx_screen *psc;
720*61046927SAndroid Build Coastguard Worker struct glx_config *config;
721*61046927SAndroid Build Coastguard Worker int status;
722*61046927SAndroid Build Coastguard Worker
723*61046927SAndroid Build Coastguard Worker status = GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc);
724*61046927SAndroid Build Coastguard Worker if (status == Success) {
725*61046927SAndroid Build Coastguard Worker config = glx_config_find_visual(psc->visuals, vis->visualid);
726*61046927SAndroid Build Coastguard Worker
727*61046927SAndroid Build Coastguard Worker /* Lookup attribute after first finding a match on the visual */
728*61046927SAndroid Build Coastguard Worker if (config != NULL) {
729*61046927SAndroid Build Coastguard Worker return glx_config_get(config, attribute, value_return);
730*61046927SAndroid Build Coastguard Worker }
731*61046927SAndroid Build Coastguard Worker
732*61046927SAndroid Build Coastguard Worker status = GLX_BAD_VISUAL;
733*61046927SAndroid Build Coastguard Worker }
734*61046927SAndroid Build Coastguard Worker
735*61046927SAndroid Build Coastguard Worker /*
736*61046927SAndroid Build Coastguard Worker ** If we can't find the config for this visual, this visual is not
737*61046927SAndroid Build Coastguard Worker ** supported by the OpenGL implementation on the server.
738*61046927SAndroid Build Coastguard Worker */
739*61046927SAndroid Build Coastguard Worker if ((status == GLX_BAD_VISUAL) && (attribute == GLX_USE_GL)) {
740*61046927SAndroid Build Coastguard Worker *value_return = False;
741*61046927SAndroid Build Coastguard Worker status = Success;
742*61046927SAndroid Build Coastguard Worker }
743*61046927SAndroid Build Coastguard Worker
744*61046927SAndroid Build Coastguard Worker return status;
745*61046927SAndroid Build Coastguard Worker }
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker /************************************************************************/
748*61046927SAndroid Build Coastguard Worker
749*61046927SAndroid Build Coastguard Worker static void
init_fbconfig_for_chooser(struct glx_config * config,GLboolean fbconfig_style_tags)750*61046927SAndroid Build Coastguard Worker init_fbconfig_for_chooser(struct glx_config * config,
751*61046927SAndroid Build Coastguard Worker GLboolean fbconfig_style_tags)
752*61046927SAndroid Build Coastguard Worker {
753*61046927SAndroid Build Coastguard Worker memset(config, 0, sizeof(struct glx_config));
754*61046927SAndroid Build Coastguard Worker config->visualID = (XID) GLX_DONT_CARE;
755*61046927SAndroid Build Coastguard Worker config->visualType = GLX_DONT_CARE;
756*61046927SAndroid Build Coastguard Worker
757*61046927SAndroid Build Coastguard Worker /* glXChooseFBConfig specifies different defaults for these properties than
758*61046927SAndroid Build Coastguard Worker * glXChooseVisual.
759*61046927SAndroid Build Coastguard Worker */
760*61046927SAndroid Build Coastguard Worker if (fbconfig_style_tags) {
761*61046927SAndroid Build Coastguard Worker config->doubleBufferMode = GLX_DONT_CARE;
762*61046927SAndroid Build Coastguard Worker config->renderType = GLX_RGBA_BIT;
763*61046927SAndroid Build Coastguard Worker }
764*61046927SAndroid Build Coastguard Worker
765*61046927SAndroid Build Coastguard Worker config->drawableType = GLX_WINDOW_BIT;
766*61046927SAndroid Build Coastguard Worker config->visualRating = GLX_DONT_CARE;
767*61046927SAndroid Build Coastguard Worker config->transparentPixel = GLX_NONE;
768*61046927SAndroid Build Coastguard Worker config->transparentRed = GLX_DONT_CARE;
769*61046927SAndroid Build Coastguard Worker config->transparentGreen = GLX_DONT_CARE;
770*61046927SAndroid Build Coastguard Worker config->transparentBlue = GLX_DONT_CARE;
771*61046927SAndroid Build Coastguard Worker config->transparentAlpha = GLX_DONT_CARE;
772*61046927SAndroid Build Coastguard Worker config->transparentIndex = GLX_DONT_CARE;
773*61046927SAndroid Build Coastguard Worker
774*61046927SAndroid Build Coastguard Worker config->xRenderable = GLX_DONT_CARE;
775*61046927SAndroid Build Coastguard Worker config->fbconfigID = (GLXFBConfigID) (GLX_DONT_CARE);
776*61046927SAndroid Build Coastguard Worker
777*61046927SAndroid Build Coastguard Worker config->sRGBCapable = GLX_DONT_CARE;
778*61046927SAndroid Build Coastguard Worker }
779*61046927SAndroid Build Coastguard Worker
780*61046927SAndroid Build Coastguard Worker #define MATCH_DONT_CARE( param ) \
781*61046927SAndroid Build Coastguard Worker do { \
782*61046927SAndroid Build Coastguard Worker if ( ((int) a-> param != (int) GLX_DONT_CARE) \
783*61046927SAndroid Build Coastguard Worker && (a-> param != b-> param) ) { \
784*61046927SAndroid Build Coastguard Worker return False; \
785*61046927SAndroid Build Coastguard Worker } \
786*61046927SAndroid Build Coastguard Worker } while ( 0 )
787*61046927SAndroid Build Coastguard Worker
788*61046927SAndroid Build Coastguard Worker #define MATCH_MINIMUM( param ) \
789*61046927SAndroid Build Coastguard Worker do { \
790*61046927SAndroid Build Coastguard Worker if ( ((int) a-> param != (int) GLX_DONT_CARE) \
791*61046927SAndroid Build Coastguard Worker && (a-> param > b-> param) ) { \
792*61046927SAndroid Build Coastguard Worker return False; \
793*61046927SAndroid Build Coastguard Worker } \
794*61046927SAndroid Build Coastguard Worker } while ( 0 )
795*61046927SAndroid Build Coastguard Worker
796*61046927SAndroid Build Coastguard Worker #define MATCH_EXACT( param ) \
797*61046927SAndroid Build Coastguard Worker do { \
798*61046927SAndroid Build Coastguard Worker if ( a-> param != b-> param) { \
799*61046927SAndroid Build Coastguard Worker return False; \
800*61046927SAndroid Build Coastguard Worker } \
801*61046927SAndroid Build Coastguard Worker } while ( 0 )
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker /* Test that all bits from a are contained in b */
804*61046927SAndroid Build Coastguard Worker #define MATCH_MASK(param) \
805*61046927SAndroid Build Coastguard Worker do { \
806*61046927SAndroid Build Coastguard Worker if ( ((int) a-> param != (int) GLX_DONT_CARE) \
807*61046927SAndroid Build Coastguard Worker && ((a->param & ~b->param) != 0) ) { \
808*61046927SAndroid Build Coastguard Worker return False; \
809*61046927SAndroid Build Coastguard Worker } \
810*61046927SAndroid Build Coastguard Worker } while (0);
811*61046927SAndroid Build Coastguard Worker
812*61046927SAndroid Build Coastguard Worker /**
813*61046927SAndroid Build Coastguard Worker * Determine if two GLXFBConfigs are compatible.
814*61046927SAndroid Build Coastguard Worker *
815*61046927SAndroid Build Coastguard Worker * \param a Application specified config to test.
816*61046927SAndroid Build Coastguard Worker * \param b Server specified config to test against \c a.
817*61046927SAndroid Build Coastguard Worker */
818*61046927SAndroid Build Coastguard Worker static Bool
fbconfigs_compatible(const struct glx_config * const a,const struct glx_config * const b)819*61046927SAndroid Build Coastguard Worker fbconfigs_compatible(const struct glx_config * const a,
820*61046927SAndroid Build Coastguard Worker const struct glx_config * const b)
821*61046927SAndroid Build Coastguard Worker {
822*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(doubleBufferMode);
823*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(visualType);
824*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(visualRating);
825*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(xRenderable);
826*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(fbconfigID);
827*61046927SAndroid Build Coastguard Worker
828*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(rgbBits);
829*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(numAuxBuffers);
830*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(redBits);
831*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(greenBits);
832*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(blueBits);
833*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(alphaBits);
834*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(depthBits);
835*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(stencilBits);
836*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(accumRedBits);
837*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(accumGreenBits);
838*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(accumBlueBits);
839*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(accumAlphaBits);
840*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(sampleBuffers);
841*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(maxPbufferWidth);
842*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(maxPbufferHeight);
843*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(maxPbufferPixels);
844*61046927SAndroid Build Coastguard Worker MATCH_MINIMUM(samples);
845*61046927SAndroid Build Coastguard Worker
846*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(stereoMode);
847*61046927SAndroid Build Coastguard Worker MATCH_EXACT(level);
848*61046927SAndroid Build Coastguard Worker
849*61046927SAndroid Build Coastguard Worker MATCH_MASK(drawableType);
850*61046927SAndroid Build Coastguard Worker MATCH_MASK(renderType);
851*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(sRGBCapable);
852*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(floatComponentsNV);
853*61046927SAndroid Build Coastguard Worker
854*61046927SAndroid Build Coastguard Worker /* There is a bug in a few of the XFree86 DDX drivers. They contain
855*61046927SAndroid Build Coastguard Worker * visuals with a "transparent type" of 0 when they really mean GLX_NONE.
856*61046927SAndroid Build Coastguard Worker * Technically speaking, it is a bug in the DDX driver, but there is
857*61046927SAndroid Build Coastguard Worker * enough of an installed base to work around the problem here. In any
858*61046927SAndroid Build Coastguard Worker * case, 0 is not a valid value of the transparent type, so we'll treat 0
859*61046927SAndroid Build Coastguard Worker * from the app as GLX_DONT_CARE. We'll consider GLX_NONE from the app and
860*61046927SAndroid Build Coastguard Worker * 0 from the server to be a match to maintain backward compatibility with
861*61046927SAndroid Build Coastguard Worker * the (broken) drivers.
862*61046927SAndroid Build Coastguard Worker */
863*61046927SAndroid Build Coastguard Worker
864*61046927SAndroid Build Coastguard Worker if (a->transparentPixel != (int) GLX_DONT_CARE && a->transparentPixel != 0) {
865*61046927SAndroid Build Coastguard Worker if (a->transparentPixel == GLX_NONE) {
866*61046927SAndroid Build Coastguard Worker if (b->transparentPixel != GLX_NONE && b->transparentPixel != 0)
867*61046927SAndroid Build Coastguard Worker return False;
868*61046927SAndroid Build Coastguard Worker }
869*61046927SAndroid Build Coastguard Worker else {
870*61046927SAndroid Build Coastguard Worker MATCH_EXACT(transparentPixel);
871*61046927SAndroid Build Coastguard Worker }
872*61046927SAndroid Build Coastguard Worker
873*61046927SAndroid Build Coastguard Worker switch (a->transparentPixel) {
874*61046927SAndroid Build Coastguard Worker case GLX_TRANSPARENT_RGB:
875*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(transparentRed);
876*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(transparentGreen);
877*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(transparentBlue);
878*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(transparentAlpha);
879*61046927SAndroid Build Coastguard Worker break;
880*61046927SAndroid Build Coastguard Worker
881*61046927SAndroid Build Coastguard Worker case GLX_TRANSPARENT_INDEX:
882*61046927SAndroid Build Coastguard Worker MATCH_DONT_CARE(transparentIndex);
883*61046927SAndroid Build Coastguard Worker break;
884*61046927SAndroid Build Coastguard Worker
885*61046927SAndroid Build Coastguard Worker default:
886*61046927SAndroid Build Coastguard Worker break;
887*61046927SAndroid Build Coastguard Worker }
888*61046927SAndroid Build Coastguard Worker }
889*61046927SAndroid Build Coastguard Worker
890*61046927SAndroid Build Coastguard Worker return True;
891*61046927SAndroid Build Coastguard Worker }
892*61046927SAndroid Build Coastguard Worker
893*61046927SAndroid Build Coastguard Worker
894*61046927SAndroid Build Coastguard Worker /* There's some tricky language in the GLX spec about how this is supposed
895*61046927SAndroid Build Coastguard Worker * to work. Basically, if a given component size is either not specified
896*61046927SAndroid Build Coastguard Worker * or the requested size is zero, it is supposed to act like PREFER_SMALLER.
897*61046927SAndroid Build Coastguard Worker * Well, that's really hard to do with the code as-is. This behavior is
898*61046927SAndroid Build Coastguard Worker * closer to correct, but still not technically right.
899*61046927SAndroid Build Coastguard Worker */
900*61046927SAndroid Build Coastguard Worker #define PREFER_LARGER_OR_ZERO(comp) \
901*61046927SAndroid Build Coastguard Worker do { \
902*61046927SAndroid Build Coastguard Worker if ( ((*a)-> comp) != ((*b)-> comp) ) { \
903*61046927SAndroid Build Coastguard Worker if ( ((*a)-> comp) == 0 ) { \
904*61046927SAndroid Build Coastguard Worker return -1; \
905*61046927SAndroid Build Coastguard Worker } \
906*61046927SAndroid Build Coastguard Worker else if ( ((*b)-> comp) == 0 ) { \
907*61046927SAndroid Build Coastguard Worker return 1; \
908*61046927SAndroid Build Coastguard Worker } \
909*61046927SAndroid Build Coastguard Worker else { \
910*61046927SAndroid Build Coastguard Worker return ((*b)-> comp) - ((*a)-> comp) ; \
911*61046927SAndroid Build Coastguard Worker } \
912*61046927SAndroid Build Coastguard Worker } \
913*61046927SAndroid Build Coastguard Worker } while( 0 )
914*61046927SAndroid Build Coastguard Worker
915*61046927SAndroid Build Coastguard Worker #define PREFER_LARGER(comp) \
916*61046927SAndroid Build Coastguard Worker do { \
917*61046927SAndroid Build Coastguard Worker if ( ((*a)-> comp) != ((*b)-> comp) ) { \
918*61046927SAndroid Build Coastguard Worker return ((*b)-> comp) - ((*a)-> comp) ; \
919*61046927SAndroid Build Coastguard Worker } \
920*61046927SAndroid Build Coastguard Worker } while( 0 )
921*61046927SAndroid Build Coastguard Worker
922*61046927SAndroid Build Coastguard Worker #define PREFER_SMALLER(comp) \
923*61046927SAndroid Build Coastguard Worker do { \
924*61046927SAndroid Build Coastguard Worker if ( ((*a)-> comp) != ((*b)-> comp) ) { \
925*61046927SAndroid Build Coastguard Worker return ((*a)-> comp) - ((*b)-> comp) ; \
926*61046927SAndroid Build Coastguard Worker } \
927*61046927SAndroid Build Coastguard Worker } while( 0 )
928*61046927SAndroid Build Coastguard Worker
929*61046927SAndroid Build Coastguard Worker /**
930*61046927SAndroid Build Coastguard Worker * Compare two GLXFBConfigs. This function is intended to be used as the
931*61046927SAndroid Build Coastguard Worker * compare function passed in to qsort.
932*61046927SAndroid Build Coastguard Worker *
933*61046927SAndroid Build Coastguard Worker * \returns If \c a is a "better" config, according to the specification of
934*61046927SAndroid Build Coastguard Worker * SGIX_fbconfig, a number less than zero is returned. If \c b is
935*61046927SAndroid Build Coastguard Worker * better, then a number greater than zero is return. If both are
936*61046927SAndroid Build Coastguard Worker * equal, zero is returned.
937*61046927SAndroid Build Coastguard Worker * \sa qsort, glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
938*61046927SAndroid Build Coastguard Worker */
939*61046927SAndroid Build Coastguard Worker static int
fbconfig_compare(struct glx_config ** a,struct glx_config ** b)940*61046927SAndroid Build Coastguard Worker fbconfig_compare(struct glx_config **a, struct glx_config **b)
941*61046927SAndroid Build Coastguard Worker {
942*61046927SAndroid Build Coastguard Worker /* The order of these comparisons must NOT change. It is defined by
943*61046927SAndroid Build Coastguard Worker * the GLX 1.4 specification.
944*61046927SAndroid Build Coastguard Worker */
945*61046927SAndroid Build Coastguard Worker
946*61046927SAndroid Build Coastguard Worker PREFER_SMALLER(visualSelectGroup);
947*61046927SAndroid Build Coastguard Worker
948*61046927SAndroid Build Coastguard Worker /* The sort order for the visualRating is GLX_NONE, GLX_SLOW, and
949*61046927SAndroid Build Coastguard Worker * GLX_NON_CONFORMANT_CONFIG. It just so happens that this is the
950*61046927SAndroid Build Coastguard Worker * numerical sort order of the enums (0x8000, 0x8001, and 0x800D).
951*61046927SAndroid Build Coastguard Worker */
952*61046927SAndroid Build Coastguard Worker PREFER_SMALLER(visualRating);
953*61046927SAndroid Build Coastguard Worker
954*61046927SAndroid Build Coastguard Worker /* This isn't quite right. It is supposed to compare the sum of the
955*61046927SAndroid Build Coastguard Worker * components the user specifically set minimums for.
956*61046927SAndroid Build Coastguard Worker */
957*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(redBits);
958*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(greenBits);
959*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(blueBits);
960*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(alphaBits);
961*61046927SAndroid Build Coastguard Worker
962*61046927SAndroid Build Coastguard Worker PREFER_SMALLER(rgbBits);
963*61046927SAndroid Build Coastguard Worker
964*61046927SAndroid Build Coastguard Worker if (((*a)->doubleBufferMode != (*b)->doubleBufferMode)) {
965*61046927SAndroid Build Coastguard Worker /* Prefer single-buffer.
966*61046927SAndroid Build Coastguard Worker */
967*61046927SAndroid Build Coastguard Worker return (!(*a)->doubleBufferMode) ? -1 : 1;
968*61046927SAndroid Build Coastguard Worker }
969*61046927SAndroid Build Coastguard Worker
970*61046927SAndroid Build Coastguard Worker PREFER_SMALLER(numAuxBuffers);
971*61046927SAndroid Build Coastguard Worker
972*61046927SAndroid Build Coastguard Worker PREFER_SMALLER(sampleBuffers);
973*61046927SAndroid Build Coastguard Worker PREFER_SMALLER(samples);
974*61046927SAndroid Build Coastguard Worker
975*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(depthBits);
976*61046927SAndroid Build Coastguard Worker PREFER_SMALLER(stencilBits);
977*61046927SAndroid Build Coastguard Worker
978*61046927SAndroid Build Coastguard Worker /* This isn't quite right. It is supposed to compare the sum of the
979*61046927SAndroid Build Coastguard Worker * components the user specifically set minimums for.
980*61046927SAndroid Build Coastguard Worker */
981*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(accumRedBits);
982*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(accumGreenBits);
983*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(accumBlueBits);
984*61046927SAndroid Build Coastguard Worker PREFER_LARGER_OR_ZERO(accumAlphaBits);
985*61046927SAndroid Build Coastguard Worker
986*61046927SAndroid Build Coastguard Worker PREFER_SMALLER(visualType);
987*61046927SAndroid Build Coastguard Worker
988*61046927SAndroid Build Coastguard Worker /* None of the pbuffer or fbconfig specs say that this comparison needs
989*61046927SAndroid Build Coastguard Worker * to happen at all, but it seems like it should.
990*61046927SAndroid Build Coastguard Worker */
991*61046927SAndroid Build Coastguard Worker PREFER_LARGER(maxPbufferWidth);
992*61046927SAndroid Build Coastguard Worker PREFER_LARGER(maxPbufferHeight);
993*61046927SAndroid Build Coastguard Worker PREFER_LARGER(maxPbufferPixels);
994*61046927SAndroid Build Coastguard Worker
995*61046927SAndroid Build Coastguard Worker return 0;
996*61046927SAndroid Build Coastguard Worker }
997*61046927SAndroid Build Coastguard Worker
998*61046927SAndroid Build Coastguard Worker
999*61046927SAndroid Build Coastguard Worker /**
1000*61046927SAndroid Build Coastguard Worker * Selects and sorts a subset of the supplied configs based on the attributes.
1001*61046927SAndroid Build Coastguard Worker * This function forms to basis of \c glXChooseFBConfig and
1002*61046927SAndroid Build Coastguard Worker * \c glXChooseFBConfigSGIX.
1003*61046927SAndroid Build Coastguard Worker *
1004*61046927SAndroid Build Coastguard Worker * \param configs Array of pointers to possible configs. The elements of
1005*61046927SAndroid Build Coastguard Worker * this array that do not meet the criteria will be set to
1006*61046927SAndroid Build Coastguard Worker * NULL. The remaining elements will be sorted according to
1007*61046927SAndroid Build Coastguard Worker * the various visual / FBConfig selection rules.
1008*61046927SAndroid Build Coastguard Worker * \param num_configs Number of elements in the \c configs array.
1009*61046927SAndroid Build Coastguard Worker * \param attribList Attributes used select from \c configs. This array is
1010*61046927SAndroid Build Coastguard Worker * terminated by a \c None tag. The array is of the form
1011*61046927SAndroid Build Coastguard Worker * expected by \c glXChooseFBConfig (where every tag has a
1012*61046927SAndroid Build Coastguard Worker * value).
1013*61046927SAndroid Build Coastguard Worker * \returns The number of valid elements left in \c configs.
1014*61046927SAndroid Build Coastguard Worker *
1015*61046927SAndroid Build Coastguard Worker * \sa glXChooseFBConfig, glXChooseFBConfigSGIX
1016*61046927SAndroid Build Coastguard Worker */
1017*61046927SAndroid Build Coastguard Worker static int
choose_fbconfig(struct glx_config ** configs,int num_configs,const int * attribList)1018*61046927SAndroid Build Coastguard Worker choose_fbconfig(struct glx_config ** configs, int num_configs,
1019*61046927SAndroid Build Coastguard Worker const int *attribList)
1020*61046927SAndroid Build Coastguard Worker {
1021*61046927SAndroid Build Coastguard Worker struct glx_config test_config;
1022*61046927SAndroid Build Coastguard Worker int base;
1023*61046927SAndroid Build Coastguard Worker int i;
1024*61046927SAndroid Build Coastguard Worker
1025*61046927SAndroid Build Coastguard Worker /* This is a fairly direct implementation of the selection method
1026*61046927SAndroid Build Coastguard Worker * described by GLX_SGIX_fbconfig. Start by culling out all the
1027*61046927SAndroid Build Coastguard Worker * configs that are not compatible with the selected parameter
1028*61046927SAndroid Build Coastguard Worker * list.
1029*61046927SAndroid Build Coastguard Worker */
1030*61046927SAndroid Build Coastguard Worker
1031*61046927SAndroid Build Coastguard Worker init_fbconfig_for_chooser(&test_config, GL_TRUE);
1032*61046927SAndroid Build Coastguard Worker __glXInitializeVisualConfigFromTags(&test_config, 512,
1033*61046927SAndroid Build Coastguard Worker (const INT32 *) attribList,
1034*61046927SAndroid Build Coastguard Worker GL_TRUE, GL_TRUE);
1035*61046927SAndroid Build Coastguard Worker
1036*61046927SAndroid Build Coastguard Worker base = 0;
1037*61046927SAndroid Build Coastguard Worker for (i = 0; i < num_configs; i++) {
1038*61046927SAndroid Build Coastguard Worker if (fbconfigs_compatible(&test_config, configs[i])) {
1039*61046927SAndroid Build Coastguard Worker configs[base] = configs[i];
1040*61046927SAndroid Build Coastguard Worker base++;
1041*61046927SAndroid Build Coastguard Worker }
1042*61046927SAndroid Build Coastguard Worker }
1043*61046927SAndroid Build Coastguard Worker
1044*61046927SAndroid Build Coastguard Worker if (base == 0) {
1045*61046927SAndroid Build Coastguard Worker return 0;
1046*61046927SAndroid Build Coastguard Worker }
1047*61046927SAndroid Build Coastguard Worker
1048*61046927SAndroid Build Coastguard Worker if (base < num_configs) {
1049*61046927SAndroid Build Coastguard Worker (void) memset(&configs[base], 0, sizeof(void *) * (num_configs - base));
1050*61046927SAndroid Build Coastguard Worker }
1051*61046927SAndroid Build Coastguard Worker
1052*61046927SAndroid Build Coastguard Worker /* After the incompatible configs are removed, the resulting
1053*61046927SAndroid Build Coastguard Worker * list is sorted according to the rules set out in the various
1054*61046927SAndroid Build Coastguard Worker * specifications.
1055*61046927SAndroid Build Coastguard Worker */
1056*61046927SAndroid Build Coastguard Worker
1057*61046927SAndroid Build Coastguard Worker qsort(configs, base, sizeof(struct glx_config *),
1058*61046927SAndroid Build Coastguard Worker (int (*)(const void *, const void *)) fbconfig_compare);
1059*61046927SAndroid Build Coastguard Worker return base;
1060*61046927SAndroid Build Coastguard Worker }
1061*61046927SAndroid Build Coastguard Worker
1062*61046927SAndroid Build Coastguard Worker
1063*61046927SAndroid Build Coastguard Worker
1064*61046927SAndroid Build Coastguard Worker
1065*61046927SAndroid Build Coastguard Worker /*
1066*61046927SAndroid Build Coastguard Worker ** Return the visual that best matches the template. Return None if no
1067*61046927SAndroid Build Coastguard Worker ** visual matches the template.
1068*61046927SAndroid Build Coastguard Worker */
1069*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC XVisualInfo *
glXChooseVisual(Display * dpy,int screen,int * attribList)1070*61046927SAndroid Build Coastguard Worker glXChooseVisual(Display * dpy, int screen, int *attribList)
1071*61046927SAndroid Build Coastguard Worker {
1072*61046927SAndroid Build Coastguard Worker XVisualInfo *visualList = NULL;
1073*61046927SAndroid Build Coastguard Worker struct glx_display *priv;
1074*61046927SAndroid Build Coastguard Worker struct glx_screen *psc;
1075*61046927SAndroid Build Coastguard Worker struct glx_config test_config;
1076*61046927SAndroid Build Coastguard Worker struct glx_config *config;
1077*61046927SAndroid Build Coastguard Worker struct glx_config *best_config = NULL;
1078*61046927SAndroid Build Coastguard Worker
1079*61046927SAndroid Build Coastguard Worker /*
1080*61046927SAndroid Build Coastguard Worker ** Get a list of all visuals, return if list is empty
1081*61046927SAndroid Build Coastguard Worker */
1082*61046927SAndroid Build Coastguard Worker if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
1083*61046927SAndroid Build Coastguard Worker return None;
1084*61046927SAndroid Build Coastguard Worker }
1085*61046927SAndroid Build Coastguard Worker
1086*61046927SAndroid Build Coastguard Worker
1087*61046927SAndroid Build Coastguard Worker /*
1088*61046927SAndroid Build Coastguard Worker ** Build a template from the defaults and the attribute list
1089*61046927SAndroid Build Coastguard Worker ** Free visual list and return if an unexpected token is encountered
1090*61046927SAndroid Build Coastguard Worker */
1091*61046927SAndroid Build Coastguard Worker init_fbconfig_for_chooser(&test_config, GL_FALSE);
1092*61046927SAndroid Build Coastguard Worker __glXInitializeVisualConfigFromTags(&test_config, 512,
1093*61046927SAndroid Build Coastguard Worker (const INT32 *) attribList,
1094*61046927SAndroid Build Coastguard Worker GL_TRUE, GL_FALSE);
1095*61046927SAndroid Build Coastguard Worker
1096*61046927SAndroid Build Coastguard Worker /*
1097*61046927SAndroid Build Coastguard Worker ** Eliminate visuals that don't meet minimum requirements
1098*61046927SAndroid Build Coastguard Worker ** Compute a score for those that do
1099*61046927SAndroid Build Coastguard Worker ** Remember which visual, if any, got the highest score
1100*61046927SAndroid Build Coastguard Worker ** If no visual is acceptable, return None
1101*61046927SAndroid Build Coastguard Worker ** Otherwise, create an XVisualInfo list with just the selected X visual
1102*61046927SAndroid Build Coastguard Worker ** and return this.
1103*61046927SAndroid Build Coastguard Worker */
1104*61046927SAndroid Build Coastguard Worker for (config = psc->visuals; config != NULL; config = config->next) {
1105*61046927SAndroid Build Coastguard Worker if (fbconfigs_compatible(&test_config, config)
1106*61046927SAndroid Build Coastguard Worker && ((best_config == NULL) ||
1107*61046927SAndroid Build Coastguard Worker (fbconfig_compare (&config, &best_config) < 0))) {
1108*61046927SAndroid Build Coastguard Worker XVisualInfo visualTemplate;
1109*61046927SAndroid Build Coastguard Worker XVisualInfo *newList;
1110*61046927SAndroid Build Coastguard Worker int i;
1111*61046927SAndroid Build Coastguard Worker
1112*61046927SAndroid Build Coastguard Worker visualTemplate.screen = screen;
1113*61046927SAndroid Build Coastguard Worker visualTemplate.visualid = config->visualID;
1114*61046927SAndroid Build Coastguard Worker newList = XGetVisualInfo(dpy, VisualScreenMask | VisualIDMask,
1115*61046927SAndroid Build Coastguard Worker &visualTemplate, &i);
1116*61046927SAndroid Build Coastguard Worker
1117*61046927SAndroid Build Coastguard Worker if (newList) {
1118*61046927SAndroid Build Coastguard Worker XFree(visualList);
1119*61046927SAndroid Build Coastguard Worker visualList = newList;
1120*61046927SAndroid Build Coastguard Worker best_config = config;
1121*61046927SAndroid Build Coastguard Worker }
1122*61046927SAndroid Build Coastguard Worker }
1123*61046927SAndroid Build Coastguard Worker }
1124*61046927SAndroid Build Coastguard Worker
1125*61046927SAndroid Build Coastguard Worker #ifdef GLX_USE_APPLEGL
1126*61046927SAndroid Build Coastguard Worker if(visualList && debug_get_bool_option("LIBGL_DUMP_VISUALID", false)) {
1127*61046927SAndroid Build Coastguard Worker printf("visualid 0x%lx\n", visualList[0].visualid);
1128*61046927SAndroid Build Coastguard Worker }
1129*61046927SAndroid Build Coastguard Worker #endif
1130*61046927SAndroid Build Coastguard Worker
1131*61046927SAndroid Build Coastguard Worker return visualList;
1132*61046927SAndroid Build Coastguard Worker }
1133*61046927SAndroid Build Coastguard Worker
1134*61046927SAndroid Build Coastguard Worker
1135*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC const char *
glXQueryExtensionsString(Display * dpy,int screen)1136*61046927SAndroid Build Coastguard Worker glXQueryExtensionsString(Display * dpy, int screen)
1137*61046927SAndroid Build Coastguard Worker {
1138*61046927SAndroid Build Coastguard Worker struct glx_screen *psc;
1139*61046927SAndroid Build Coastguard Worker struct glx_display *priv;
1140*61046927SAndroid Build Coastguard Worker int is_direct_capable = GL_FALSE;
1141*61046927SAndroid Build Coastguard Worker
1142*61046927SAndroid Build Coastguard Worker if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
1143*61046927SAndroid Build Coastguard Worker return NULL;
1144*61046927SAndroid Build Coastguard Worker }
1145*61046927SAndroid Build Coastguard Worker
1146*61046927SAndroid Build Coastguard Worker if (!psc->effectiveGLXexts) {
1147*61046927SAndroid Build Coastguard Worker if (!psc->serverGLXexts) {
1148*61046927SAndroid Build Coastguard Worker psc->serverGLXexts =
1149*61046927SAndroid Build Coastguard Worker __glXQueryServerString(dpy, screen, GLX_EXTENSIONS);
1150*61046927SAndroid Build Coastguard Worker }
1151*61046927SAndroid Build Coastguard Worker
1152*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
1153*61046927SAndroid Build Coastguard Worker is_direct_capable = (psc->display->driver != 0);
1154*61046927SAndroid Build Coastguard Worker #endif
1155*61046927SAndroid Build Coastguard Worker __glXCalculateUsableExtensions(psc, is_direct_capable);
1156*61046927SAndroid Build Coastguard Worker }
1157*61046927SAndroid Build Coastguard Worker
1158*61046927SAndroid Build Coastguard Worker return psc->effectiveGLXexts;
1159*61046927SAndroid Build Coastguard Worker }
1160*61046927SAndroid Build Coastguard Worker
1161*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC const char *
glXGetClientString(Display * dpy,int name)1162*61046927SAndroid Build Coastguard Worker glXGetClientString(Display * dpy, int name)
1163*61046927SAndroid Build Coastguard Worker {
1164*61046927SAndroid Build Coastguard Worker (void) dpy;
1165*61046927SAndroid Build Coastguard Worker
1166*61046927SAndroid Build Coastguard Worker switch (name) {
1167*61046927SAndroid Build Coastguard Worker case GLX_VENDOR:
1168*61046927SAndroid Build Coastguard Worker return "Mesa Project and SGI";
1169*61046927SAndroid Build Coastguard Worker case GLX_VERSION:
1170*61046927SAndroid Build Coastguard Worker return "1.4";
1171*61046927SAndroid Build Coastguard Worker case GLX_EXTENSIONS:
1172*61046927SAndroid Build Coastguard Worker return __glXGetClientExtensions(dpy);
1173*61046927SAndroid Build Coastguard Worker default:
1174*61046927SAndroid Build Coastguard Worker return NULL;
1175*61046927SAndroid Build Coastguard Worker }
1176*61046927SAndroid Build Coastguard Worker }
1177*61046927SAndroid Build Coastguard Worker
1178*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC const char *
glXQueryServerString(Display * dpy,int screen,int name)1179*61046927SAndroid Build Coastguard Worker glXQueryServerString(Display * dpy, int screen, int name)
1180*61046927SAndroid Build Coastguard Worker {
1181*61046927SAndroid Build Coastguard Worker struct glx_screen *psc;
1182*61046927SAndroid Build Coastguard Worker struct glx_display *priv;
1183*61046927SAndroid Build Coastguard Worker const char **str;
1184*61046927SAndroid Build Coastguard Worker
1185*61046927SAndroid Build Coastguard Worker if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
1186*61046927SAndroid Build Coastguard Worker return NULL;
1187*61046927SAndroid Build Coastguard Worker }
1188*61046927SAndroid Build Coastguard Worker
1189*61046927SAndroid Build Coastguard Worker switch (name) {
1190*61046927SAndroid Build Coastguard Worker case GLX_VENDOR:
1191*61046927SAndroid Build Coastguard Worker str = &psc->serverGLXvendor;
1192*61046927SAndroid Build Coastguard Worker break;
1193*61046927SAndroid Build Coastguard Worker case GLX_VERSION:
1194*61046927SAndroid Build Coastguard Worker str = &psc->serverGLXversion;
1195*61046927SAndroid Build Coastguard Worker break;
1196*61046927SAndroid Build Coastguard Worker case GLX_EXTENSIONS:
1197*61046927SAndroid Build Coastguard Worker str = &psc->serverGLXexts;
1198*61046927SAndroid Build Coastguard Worker break;
1199*61046927SAndroid Build Coastguard Worker default:
1200*61046927SAndroid Build Coastguard Worker return NULL;
1201*61046927SAndroid Build Coastguard Worker }
1202*61046927SAndroid Build Coastguard Worker
1203*61046927SAndroid Build Coastguard Worker if (*str == NULL) {
1204*61046927SAndroid Build Coastguard Worker *str = __glXQueryServerString(dpy, screen, name);
1205*61046927SAndroid Build Coastguard Worker }
1206*61046927SAndroid Build Coastguard Worker
1207*61046927SAndroid Build Coastguard Worker return *str;
1208*61046927SAndroid Build Coastguard Worker }
1209*61046927SAndroid Build Coastguard Worker
1210*61046927SAndroid Build Coastguard Worker
1211*61046927SAndroid Build Coastguard Worker /*
1212*61046927SAndroid Build Coastguard Worker ** EXT_import_context
1213*61046927SAndroid Build Coastguard Worker */
1214*61046927SAndroid Build Coastguard Worker
1215*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC Display *
glXGetCurrentDisplay(void)1216*61046927SAndroid Build Coastguard Worker glXGetCurrentDisplay(void)
1217*61046927SAndroid Build Coastguard Worker {
1218*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
1219*61046927SAndroid Build Coastguard Worker if (gc == &dummyContext)
1220*61046927SAndroid Build Coastguard Worker return NULL;
1221*61046927SAndroid Build Coastguard Worker return gc->currentDpy;
1222*61046927SAndroid Build Coastguard Worker }
1223*61046927SAndroid Build Coastguard Worker
1224*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC
1225*61046927SAndroid Build Coastguard Worker GLX_ALIAS(Display *, glXGetCurrentDisplayEXT, (void), (),
1226*61046927SAndroid Build Coastguard Worker glXGetCurrentDisplay)
1227*61046927SAndroid Build Coastguard Worker
1228*61046927SAndroid Build Coastguard Worker #ifndef GLX_USE_APPLEGL
1229*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLXContext
glXImportContextEXT(Display * dpy,GLXContextID contextID)1230*61046927SAndroid Build Coastguard Worker glXImportContextEXT(Display *dpy, GLXContextID contextID)
1231*61046927SAndroid Build Coastguard Worker {
1232*61046927SAndroid Build Coastguard Worker struct glx_display *priv = __glXInitialize(dpy);
1233*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = NULL;
1234*61046927SAndroid Build Coastguard Worker xGLXQueryContextReply reply;
1235*61046927SAndroid Build Coastguard Worker CARD8 opcode;
1236*61046927SAndroid Build Coastguard Worker struct glx_context *ctx;
1237*61046927SAndroid Build Coastguard Worker int i, renderType = GLX_RGBA_TYPE; /* By default, assume RGBA context */
1238*61046927SAndroid Build Coastguard Worker XID share = None;
1239*61046927SAndroid Build Coastguard Worker struct glx_config *mode = NULL;
1240*61046927SAndroid Build Coastguard Worker uint32_t fbconfigID = 0;
1241*61046927SAndroid Build Coastguard Worker uint32_t visualID = 0;
1242*61046927SAndroid Build Coastguard Worker uint32_t screen = 0;
1243*61046927SAndroid Build Coastguard Worker Bool got_screen = False;
1244*61046927SAndroid Build Coastguard Worker
1245*61046927SAndroid Build Coastguard Worker if (priv == NULL)
1246*61046927SAndroid Build Coastguard Worker return NULL;
1247*61046927SAndroid Build Coastguard Worker
1248*61046927SAndroid Build Coastguard Worker /* The GLX_EXT_import_context spec says:
1249*61046927SAndroid Build Coastguard Worker *
1250*61046927SAndroid Build Coastguard Worker * "If <contextID> does not refer to a valid context, then a BadContext
1251*61046927SAndroid Build Coastguard Worker * error is generated; if <contextID> refers to direct rendering
1252*61046927SAndroid Build Coastguard Worker * context then no error is generated but glXImportContextEXT returns
1253*61046927SAndroid Build Coastguard Worker * NULL."
1254*61046927SAndroid Build Coastguard Worker *
1255*61046927SAndroid Build Coastguard Worker * We can handle both conditions with the __glXIsDirect call, because
1256*61046927SAndroid Build Coastguard Worker * passing None to a GLXIsDirect request will throw GLXBadContext.
1257*61046927SAndroid Build Coastguard Worker */
1258*61046927SAndroid Build Coastguard Worker if (__glXIsDirect(dpy, contextID, NULL))
1259*61046927SAndroid Build Coastguard Worker return NULL;
1260*61046927SAndroid Build Coastguard Worker
1261*61046927SAndroid Build Coastguard Worker opcode = __glXSetupForCommand(dpy);
1262*61046927SAndroid Build Coastguard Worker if (!opcode)
1263*61046927SAndroid Build Coastguard Worker return 0;
1264*61046927SAndroid Build Coastguard Worker
1265*61046927SAndroid Build Coastguard Worker /* Send the glXQueryContextInfoEXT request */
1266*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
1267*61046927SAndroid Build Coastguard Worker
1268*61046927SAndroid Build Coastguard Worker xGLXQueryContextReq *req;
1269*61046927SAndroid Build Coastguard Worker GetReq(GLXQueryContext, req);
1270*61046927SAndroid Build Coastguard Worker
1271*61046927SAndroid Build Coastguard Worker req->reqType = opcode;
1272*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXQueryContext;
1273*61046927SAndroid Build Coastguard Worker req->context = contextID;
1274*61046927SAndroid Build Coastguard Worker
1275*61046927SAndroid Build Coastguard Worker if (_XReply(dpy, (xReply *) & reply, 0, False) &&
1276*61046927SAndroid Build Coastguard Worker reply.n < (INT32_MAX / 2)) {
1277*61046927SAndroid Build Coastguard Worker
1278*61046927SAndroid Build Coastguard Worker for (i = 0; i < reply.n; i++) {
1279*61046927SAndroid Build Coastguard Worker int prop[2];
1280*61046927SAndroid Build Coastguard Worker
1281*61046927SAndroid Build Coastguard Worker _XRead(dpy, (char *)prop, sizeof(prop));
1282*61046927SAndroid Build Coastguard Worker switch (prop[0]) {
1283*61046927SAndroid Build Coastguard Worker case GLX_SCREEN:
1284*61046927SAndroid Build Coastguard Worker screen = prop[1];
1285*61046927SAndroid Build Coastguard Worker got_screen = True;
1286*61046927SAndroid Build Coastguard Worker break;
1287*61046927SAndroid Build Coastguard Worker case GLX_SHARE_CONTEXT_EXT:
1288*61046927SAndroid Build Coastguard Worker share = prop[1];
1289*61046927SAndroid Build Coastguard Worker break;
1290*61046927SAndroid Build Coastguard Worker case GLX_VISUAL_ID_EXT:
1291*61046927SAndroid Build Coastguard Worker visualID = prop[1];
1292*61046927SAndroid Build Coastguard Worker break;
1293*61046927SAndroid Build Coastguard Worker case GLX_FBCONFIG_ID:
1294*61046927SAndroid Build Coastguard Worker fbconfigID = prop[1];
1295*61046927SAndroid Build Coastguard Worker break;
1296*61046927SAndroid Build Coastguard Worker case GLX_RENDER_TYPE:
1297*61046927SAndroid Build Coastguard Worker renderType = prop[1];
1298*61046927SAndroid Build Coastguard Worker break;
1299*61046927SAndroid Build Coastguard Worker }
1300*61046927SAndroid Build Coastguard Worker }
1301*61046927SAndroid Build Coastguard Worker }
1302*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
1303*61046927SAndroid Build Coastguard Worker SyncHandle();
1304*61046927SAndroid Build Coastguard Worker
1305*61046927SAndroid Build Coastguard Worker if (!got_screen)
1306*61046927SAndroid Build Coastguard Worker return NULL;
1307*61046927SAndroid Build Coastguard Worker
1308*61046927SAndroid Build Coastguard Worker psc = GetGLXScreenConfigs(dpy, screen);
1309*61046927SAndroid Build Coastguard Worker if (psc == NULL)
1310*61046927SAndroid Build Coastguard Worker return NULL;
1311*61046927SAndroid Build Coastguard Worker
1312*61046927SAndroid Build Coastguard Worker if (fbconfigID != 0) {
1313*61046927SAndroid Build Coastguard Worker mode = glx_config_find_fbconfig(psc->configs, fbconfigID);
1314*61046927SAndroid Build Coastguard Worker } else if (visualID != 0) {
1315*61046927SAndroid Build Coastguard Worker mode = glx_config_find_visual(psc->visuals, visualID);
1316*61046927SAndroid Build Coastguard Worker }
1317*61046927SAndroid Build Coastguard Worker
1318*61046927SAndroid Build Coastguard Worker if (mode == NULL)
1319*61046927SAndroid Build Coastguard Worker return NULL;
1320*61046927SAndroid Build Coastguard Worker
1321*61046927SAndroid Build Coastguard Worker ctx = indirect_create_context(psc, mode, NULL, renderType);
1322*61046927SAndroid Build Coastguard Worker if (ctx == NULL)
1323*61046927SAndroid Build Coastguard Worker return NULL;
1324*61046927SAndroid Build Coastguard Worker
1325*61046927SAndroid Build Coastguard Worker ctx->xid = contextID;
1326*61046927SAndroid Build Coastguard Worker ctx->imported = GL_TRUE;
1327*61046927SAndroid Build Coastguard Worker ctx->share_xid = share;
1328*61046927SAndroid Build Coastguard Worker
1329*61046927SAndroid Build Coastguard Worker return (GLXContext) ctx;
1330*61046927SAndroid Build Coastguard Worker }
1331*61046927SAndroid Build Coastguard Worker
1332*61046927SAndroid Build Coastguard Worker #endif
1333*61046927SAndroid Build Coastguard Worker
1334*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC int
glXQueryContext(Display * dpy,GLXContext ctx_user,int attribute,int * value)1335*61046927SAndroid Build Coastguard Worker glXQueryContext(Display * dpy, GLXContext ctx_user, int attribute, int *value)
1336*61046927SAndroid Build Coastguard Worker {
1337*61046927SAndroid Build Coastguard Worker struct glx_context *ctx = (struct glx_context *) ctx_user;
1338*61046927SAndroid Build Coastguard Worker
1339*61046927SAndroid Build Coastguard Worker switch (attribute) {
1340*61046927SAndroid Build Coastguard Worker case GLX_SHARE_CONTEXT_EXT:
1341*61046927SAndroid Build Coastguard Worker *value = ctx->share_xid;
1342*61046927SAndroid Build Coastguard Worker break;
1343*61046927SAndroid Build Coastguard Worker case GLX_VISUAL_ID_EXT:
1344*61046927SAndroid Build Coastguard Worker *value = ctx->config ? ctx->config->visualID : None;
1345*61046927SAndroid Build Coastguard Worker break;
1346*61046927SAndroid Build Coastguard Worker case GLX_SCREEN:
1347*61046927SAndroid Build Coastguard Worker *value = ctx->psc->scr;
1348*61046927SAndroid Build Coastguard Worker break;
1349*61046927SAndroid Build Coastguard Worker case GLX_FBCONFIG_ID:
1350*61046927SAndroid Build Coastguard Worker *value = ctx->config ? ctx->config->fbconfigID : None;
1351*61046927SAndroid Build Coastguard Worker break;
1352*61046927SAndroid Build Coastguard Worker case GLX_RENDER_TYPE:
1353*61046927SAndroid Build Coastguard Worker *value = ctx->renderType;
1354*61046927SAndroid Build Coastguard Worker break;
1355*61046927SAndroid Build Coastguard Worker default:
1356*61046927SAndroid Build Coastguard Worker return GLX_BAD_ATTRIBUTE;
1357*61046927SAndroid Build Coastguard Worker }
1358*61046927SAndroid Build Coastguard Worker return Success;
1359*61046927SAndroid Build Coastguard Worker }
1360*61046927SAndroid Build Coastguard Worker
1361*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC
1362*61046927SAndroid Build Coastguard Worker GLX_ALIAS(int, glXQueryContextInfoEXT,
1363*61046927SAndroid Build Coastguard Worker (Display * dpy, GLXContext ctx, int attribute, int *value),
1364*61046927SAndroid Build Coastguard Worker (dpy, ctx, attribute, value), glXQueryContext)
1365*61046927SAndroid Build Coastguard Worker
glXGetContextIDEXT(const GLXContext ctx_user)1366*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLXContextID glXGetContextIDEXT(const GLXContext ctx_user)
1367*61046927SAndroid Build Coastguard Worker {
1368*61046927SAndroid Build Coastguard Worker struct glx_context *ctx = (struct glx_context *) ctx_user;
1369*61046927SAndroid Build Coastguard Worker
1370*61046927SAndroid Build Coastguard Worker return (ctx == NULL) ? None : ctx->xid;
1371*61046927SAndroid Build Coastguard Worker }
1372*61046927SAndroid Build Coastguard Worker
1373*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC void
glXFreeContextEXT(Display * dpy,GLXContext ctx)1374*61046927SAndroid Build Coastguard Worker glXFreeContextEXT(Display *dpy, GLXContext ctx)
1375*61046927SAndroid Build Coastguard Worker {
1376*61046927SAndroid Build Coastguard Worker struct glx_context *gc = (struct glx_context *) ctx;
1377*61046927SAndroid Build Coastguard Worker
1378*61046927SAndroid Build Coastguard Worker if (gc == NULL || gc->xid == None)
1379*61046927SAndroid Build Coastguard Worker return;
1380*61046927SAndroid Build Coastguard Worker
1381*61046927SAndroid Build Coastguard Worker /* The GLX_EXT_import_context spec says:
1382*61046927SAndroid Build Coastguard Worker *
1383*61046927SAndroid Build Coastguard Worker * "glXFreeContext does not free the server-side context information or
1384*61046927SAndroid Build Coastguard Worker * the XID associated with the server-side context."
1385*61046927SAndroid Build Coastguard Worker *
1386*61046927SAndroid Build Coastguard Worker * Don't send any protocol. Just destroy the client-side tracking of the
1387*61046927SAndroid Build Coastguard Worker * context. Also, only release the context structure if it's not current.
1388*61046927SAndroid Build Coastguard Worker */
1389*61046927SAndroid Build Coastguard Worker __glXLock();
1390*61046927SAndroid Build Coastguard Worker if (gc->currentDpy) {
1391*61046927SAndroid Build Coastguard Worker gc->xid = None;
1392*61046927SAndroid Build Coastguard Worker } else {
1393*61046927SAndroid Build Coastguard Worker gc->vtable->destroy(gc);
1394*61046927SAndroid Build Coastguard Worker }
1395*61046927SAndroid Build Coastguard Worker __glXUnlock();
1396*61046927SAndroid Build Coastguard Worker }
1397*61046927SAndroid Build Coastguard Worker
1398*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLXFBConfig *
glXChooseFBConfig(Display * dpy,int screen,const int * attribList,int * nitems)1399*61046927SAndroid Build Coastguard Worker glXChooseFBConfig(Display * dpy, int screen,
1400*61046927SAndroid Build Coastguard Worker const int *attribList, int *nitems)
1401*61046927SAndroid Build Coastguard Worker {
1402*61046927SAndroid Build Coastguard Worker struct glx_config **config_list;
1403*61046927SAndroid Build Coastguard Worker int list_size;
1404*61046927SAndroid Build Coastguard Worker
1405*61046927SAndroid Build Coastguard Worker
1406*61046927SAndroid Build Coastguard Worker config_list = (struct glx_config **)
1407*61046927SAndroid Build Coastguard Worker glXGetFBConfigs(dpy, screen, &list_size);
1408*61046927SAndroid Build Coastguard Worker
1409*61046927SAndroid Build Coastguard Worker if ((config_list != NULL) && (list_size > 0) && (attribList != NULL)) {
1410*61046927SAndroid Build Coastguard Worker list_size = choose_fbconfig(config_list, list_size, attribList);
1411*61046927SAndroid Build Coastguard Worker if (list_size == 0) {
1412*61046927SAndroid Build Coastguard Worker free(config_list);
1413*61046927SAndroid Build Coastguard Worker config_list = NULL;
1414*61046927SAndroid Build Coastguard Worker }
1415*61046927SAndroid Build Coastguard Worker }
1416*61046927SAndroid Build Coastguard Worker
1417*61046927SAndroid Build Coastguard Worker *nitems = list_size;
1418*61046927SAndroid Build Coastguard Worker return (GLXFBConfig *) config_list;
1419*61046927SAndroid Build Coastguard Worker }
1420*61046927SAndroid Build Coastguard Worker
1421*61046927SAndroid Build Coastguard Worker
1422*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLXContext
glXCreateNewContext(Display * dpy,GLXFBConfig fbconfig,int renderType,GLXContext shareList,Bool allowDirect)1423*61046927SAndroid Build Coastguard Worker glXCreateNewContext(Display * dpy, GLXFBConfig fbconfig,
1424*61046927SAndroid Build Coastguard Worker int renderType, GLXContext shareList, Bool allowDirect)
1425*61046927SAndroid Build Coastguard Worker {
1426*61046927SAndroid Build Coastguard Worker struct glx_config *config = (struct glx_config *) fbconfig;
1427*61046927SAndroid Build Coastguard Worker struct glx_config **config_list;
1428*61046927SAndroid Build Coastguard Worker int list_size;
1429*61046927SAndroid Build Coastguard Worker unsigned i;
1430*61046927SAndroid Build Coastguard Worker
1431*61046927SAndroid Build Coastguard Worker if (!config) {
1432*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, GLXBadFBConfig, 0, X_GLXCreateNewContext, false);
1433*61046927SAndroid Build Coastguard Worker return NULL;
1434*61046927SAndroid Build Coastguard Worker }
1435*61046927SAndroid Build Coastguard Worker
1436*61046927SAndroid Build Coastguard Worker config_list = (struct glx_config **)
1437*61046927SAndroid Build Coastguard Worker glXGetFBConfigs(dpy, config->screen, &list_size);
1438*61046927SAndroid Build Coastguard Worker
1439*61046927SAndroid Build Coastguard Worker for (i = 0; i < list_size; i++) {
1440*61046927SAndroid Build Coastguard Worker if (config_list[i] == config)
1441*61046927SAndroid Build Coastguard Worker break;
1442*61046927SAndroid Build Coastguard Worker }
1443*61046927SAndroid Build Coastguard Worker free(config_list);
1444*61046927SAndroid Build Coastguard Worker
1445*61046927SAndroid Build Coastguard Worker if (i == list_size) {
1446*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, GLXBadFBConfig, 0, X_GLXCreateNewContext, false);
1447*61046927SAndroid Build Coastguard Worker return NULL;
1448*61046927SAndroid Build Coastguard Worker }
1449*61046927SAndroid Build Coastguard Worker
1450*61046927SAndroid Build Coastguard Worker return CreateContext(dpy, config->fbconfigID, config, shareList,
1451*61046927SAndroid Build Coastguard Worker allowDirect, X_GLXCreateNewContext, renderType);
1452*61046927SAndroid Build Coastguard Worker }
1453*61046927SAndroid Build Coastguard Worker
1454*61046927SAndroid Build Coastguard Worker
1455*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLXDrawable
glXGetCurrentReadDrawable(void)1456*61046927SAndroid Build Coastguard Worker glXGetCurrentReadDrawable(void)
1457*61046927SAndroid Build Coastguard Worker {
1458*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
1459*61046927SAndroid Build Coastguard Worker
1460*61046927SAndroid Build Coastguard Worker return gc->currentReadable;
1461*61046927SAndroid Build Coastguard Worker }
1462*61046927SAndroid Build Coastguard Worker
1463*61046927SAndroid Build Coastguard Worker
1464*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLXFBConfig *
glXGetFBConfigs(Display * dpy,int screen,int * nelements)1465*61046927SAndroid Build Coastguard Worker glXGetFBConfigs(Display * dpy, int screen, int *nelements)
1466*61046927SAndroid Build Coastguard Worker {
1467*61046927SAndroid Build Coastguard Worker struct glx_display *priv = __glXInitialize(dpy);
1468*61046927SAndroid Build Coastguard Worker struct glx_config **config_list = NULL;
1469*61046927SAndroid Build Coastguard Worker struct glx_config *config;
1470*61046927SAndroid Build Coastguard Worker unsigned num_configs = 0;
1471*61046927SAndroid Build Coastguard Worker int i;
1472*61046927SAndroid Build Coastguard Worker
1473*61046927SAndroid Build Coastguard Worker *nelements = 0;
1474*61046927SAndroid Build Coastguard Worker if (priv && (priv->screens != NULL)
1475*61046927SAndroid Build Coastguard Worker && (screen >= 0) && (screen < ScreenCount(dpy))
1476*61046927SAndroid Build Coastguard Worker && (priv->screens[screen]->configs != NULL)
1477*61046927SAndroid Build Coastguard Worker && (priv->screens[screen]->configs->fbconfigID
1478*61046927SAndroid Build Coastguard Worker != (int) GLX_DONT_CARE)) {
1479*61046927SAndroid Build Coastguard Worker
1480*61046927SAndroid Build Coastguard Worker for (config = priv->screens[screen]->configs; config != NULL;
1481*61046927SAndroid Build Coastguard Worker config = config->next) {
1482*61046927SAndroid Build Coastguard Worker if (config->fbconfigID != (int) GLX_DONT_CARE) {
1483*61046927SAndroid Build Coastguard Worker num_configs++;
1484*61046927SAndroid Build Coastguard Worker }
1485*61046927SAndroid Build Coastguard Worker }
1486*61046927SAndroid Build Coastguard Worker
1487*61046927SAndroid Build Coastguard Worker config_list = malloc(num_configs * sizeof *config_list);
1488*61046927SAndroid Build Coastguard Worker if (config_list != NULL) {
1489*61046927SAndroid Build Coastguard Worker *nelements = num_configs;
1490*61046927SAndroid Build Coastguard Worker i = 0;
1491*61046927SAndroid Build Coastguard Worker for (config = priv->screens[screen]->configs; config != NULL;
1492*61046927SAndroid Build Coastguard Worker config = config->next) {
1493*61046927SAndroid Build Coastguard Worker if (config->fbconfigID != (int) GLX_DONT_CARE) {
1494*61046927SAndroid Build Coastguard Worker config_list[i] = config;
1495*61046927SAndroid Build Coastguard Worker i++;
1496*61046927SAndroid Build Coastguard Worker }
1497*61046927SAndroid Build Coastguard Worker }
1498*61046927SAndroid Build Coastguard Worker }
1499*61046927SAndroid Build Coastguard Worker }
1500*61046927SAndroid Build Coastguard Worker
1501*61046927SAndroid Build Coastguard Worker return (GLXFBConfig *) config_list;
1502*61046927SAndroid Build Coastguard Worker }
1503*61046927SAndroid Build Coastguard Worker
1504*61046927SAndroid Build Coastguard Worker
1505*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC int
glXGetFBConfigAttrib(Display * dpy,GLXFBConfig fbconfig,int attribute,int * value)1506*61046927SAndroid Build Coastguard Worker glXGetFBConfigAttrib(Display * dpy, GLXFBConfig fbconfig,
1507*61046927SAndroid Build Coastguard Worker int attribute, int *value)
1508*61046927SAndroid Build Coastguard Worker {
1509*61046927SAndroid Build Coastguard Worker struct glx_config *config = ValidateGLXFBConfig(dpy, fbconfig);
1510*61046927SAndroid Build Coastguard Worker
1511*61046927SAndroid Build Coastguard Worker if (config == NULL)
1512*61046927SAndroid Build Coastguard Worker return GLXBadFBConfig;
1513*61046927SAndroid Build Coastguard Worker
1514*61046927SAndroid Build Coastguard Worker return glx_config_get(config, attribute, value);
1515*61046927SAndroid Build Coastguard Worker }
1516*61046927SAndroid Build Coastguard Worker
1517*61046927SAndroid Build Coastguard Worker
1518*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC XVisualInfo *
glXGetVisualFromFBConfig(Display * dpy,GLXFBConfig fbconfig)1519*61046927SAndroid Build Coastguard Worker glXGetVisualFromFBConfig(Display * dpy, GLXFBConfig fbconfig)
1520*61046927SAndroid Build Coastguard Worker {
1521*61046927SAndroid Build Coastguard Worker XVisualInfo visualTemplate;
1522*61046927SAndroid Build Coastguard Worker struct glx_config *config = (struct glx_config *) fbconfig;
1523*61046927SAndroid Build Coastguard Worker int count;
1524*61046927SAndroid Build Coastguard Worker
1525*61046927SAndroid Build Coastguard Worker if (!config)
1526*61046927SAndroid Build Coastguard Worker return NULL;
1527*61046927SAndroid Build Coastguard Worker
1528*61046927SAndroid Build Coastguard Worker /*
1529*61046927SAndroid Build Coastguard Worker ** Get a list of all visuals, return if list is empty
1530*61046927SAndroid Build Coastguard Worker */
1531*61046927SAndroid Build Coastguard Worker visualTemplate.visualid = config->visualID;
1532*61046927SAndroid Build Coastguard Worker return XGetVisualInfo(dpy, VisualIDMask, &visualTemplate, &count);
1533*61046927SAndroid Build Coastguard Worker }
1534*61046927SAndroid Build Coastguard Worker
1535*61046927SAndroid Build Coastguard Worker #ifndef GLX_USE_APPLEGL
1536*61046927SAndroid Build Coastguard Worker /*
1537*61046927SAndroid Build Coastguard Worker ** GLX_SGI_swap_control
1538*61046927SAndroid Build Coastguard Worker */
1539*61046927SAndroid Build Coastguard Worker _X_HIDDEN int
glXSwapIntervalSGI(int interval)1540*61046927SAndroid Build Coastguard Worker glXSwapIntervalSGI(int interval)
1541*61046927SAndroid Build Coastguard Worker {
1542*61046927SAndroid Build Coastguard Worker xGLXVendorPrivateReq *req;
1543*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
1544*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1545*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = gc->psc;
1546*61046927SAndroid Build Coastguard Worker #endif
1547*61046927SAndroid Build Coastguard Worker Display *dpy;
1548*61046927SAndroid Build Coastguard Worker CARD32 *interval_ptr;
1549*61046927SAndroid Build Coastguard Worker CARD8 opcode;
1550*61046927SAndroid Build Coastguard Worker
1551*61046927SAndroid Build Coastguard Worker if (gc == &dummyContext) {
1552*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1553*61046927SAndroid Build Coastguard Worker }
1554*61046927SAndroid Build Coastguard Worker
1555*61046927SAndroid Build Coastguard Worker if (interval <= 0) {
1556*61046927SAndroid Build Coastguard Worker return GLX_BAD_VALUE;
1557*61046927SAndroid Build Coastguard Worker }
1558*61046927SAndroid Build Coastguard Worker
1559*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1560*61046927SAndroid Build Coastguard Worker if (gc->isDirect && psc && psc->driScreen.setSwapInterval) {
1561*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1562*61046927SAndroid Build Coastguard Worker /* Simply ignore the command if the GLX drawable has been destroyed but
1563*61046927SAndroid Build Coastguard Worker * the context is still bound.
1564*61046927SAndroid Build Coastguard Worker */
1565*61046927SAndroid Build Coastguard Worker if (pdraw)
1566*61046927SAndroid Build Coastguard Worker psc->driScreen.setSwapInterval(pdraw, interval);
1567*61046927SAndroid Build Coastguard Worker return 0;
1568*61046927SAndroid Build Coastguard Worker }
1569*61046927SAndroid Build Coastguard Worker #endif
1570*61046927SAndroid Build Coastguard Worker
1571*61046927SAndroid Build Coastguard Worker dpy = gc->currentDpy;
1572*61046927SAndroid Build Coastguard Worker opcode = __glXSetupForCommand(dpy);
1573*61046927SAndroid Build Coastguard Worker if (!opcode) {
1574*61046927SAndroid Build Coastguard Worker return 0;
1575*61046927SAndroid Build Coastguard Worker }
1576*61046927SAndroid Build Coastguard Worker
1577*61046927SAndroid Build Coastguard Worker /* Send the glXSwapIntervalSGI request */
1578*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
1579*61046927SAndroid Build Coastguard Worker GetReqExtra(GLXVendorPrivate, sizeof(CARD32), req);
1580*61046927SAndroid Build Coastguard Worker req->reqType = opcode;
1581*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXVendorPrivate;
1582*61046927SAndroid Build Coastguard Worker req->vendorCode = X_GLXvop_SwapIntervalSGI;
1583*61046927SAndroid Build Coastguard Worker req->contextTag = gc->currentContextTag;
1584*61046927SAndroid Build Coastguard Worker
1585*61046927SAndroid Build Coastguard Worker interval_ptr = (CARD32 *) (req + 1);
1586*61046927SAndroid Build Coastguard Worker *interval_ptr = interval;
1587*61046927SAndroid Build Coastguard Worker
1588*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
1589*61046927SAndroid Build Coastguard Worker SyncHandle();
1590*61046927SAndroid Build Coastguard Worker XFlush(dpy);
1591*61046927SAndroid Build Coastguard Worker
1592*61046927SAndroid Build Coastguard Worker return 0;
1593*61046927SAndroid Build Coastguard Worker }
1594*61046927SAndroid Build Coastguard Worker
1595*61046927SAndroid Build Coastguard Worker
1596*61046927SAndroid Build Coastguard Worker /*
1597*61046927SAndroid Build Coastguard Worker ** GLX_MESA_swap_control
1598*61046927SAndroid Build Coastguard Worker */
1599*61046927SAndroid Build Coastguard Worker _X_HIDDEN int
glXSwapIntervalMESA(unsigned int interval)1600*61046927SAndroid Build Coastguard Worker glXSwapIntervalMESA(unsigned int interval)
1601*61046927SAndroid Build Coastguard Worker {
1602*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1603*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
1604*61046927SAndroid Build Coastguard Worker
1605*61046927SAndroid Build Coastguard Worker if (interval > INT_MAX)
1606*61046927SAndroid Build Coastguard Worker return GLX_BAD_VALUE;
1607*61046927SAndroid Build Coastguard Worker
1608*61046927SAndroid Build Coastguard Worker if (gc != &dummyContext && gc->isDirect) {
1609*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = gc->psc;
1610*61046927SAndroid Build Coastguard Worker if (psc && psc->driScreen.setSwapInterval) {
1611*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw =
1612*61046927SAndroid Build Coastguard Worker GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1613*61046927SAndroid Build Coastguard Worker
1614*61046927SAndroid Build Coastguard Worker /* Simply ignore the command if the GLX drawable has been destroyed but
1615*61046927SAndroid Build Coastguard Worker * the context is still bound.
1616*61046927SAndroid Build Coastguard Worker */
1617*61046927SAndroid Build Coastguard Worker if (!pdraw)
1618*61046927SAndroid Build Coastguard Worker return 0;
1619*61046927SAndroid Build Coastguard Worker
1620*61046927SAndroid Build Coastguard Worker return psc->driScreen.setSwapInterval(pdraw, interval);
1621*61046927SAndroid Build Coastguard Worker }
1622*61046927SAndroid Build Coastguard Worker }
1623*61046927SAndroid Build Coastguard Worker #endif
1624*61046927SAndroid Build Coastguard Worker
1625*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1626*61046927SAndroid Build Coastguard Worker }
1627*61046927SAndroid Build Coastguard Worker
1628*61046927SAndroid Build Coastguard Worker
1629*61046927SAndroid Build Coastguard Worker _X_HIDDEN int
glXGetSwapIntervalMESA(void)1630*61046927SAndroid Build Coastguard Worker glXGetSwapIntervalMESA(void)
1631*61046927SAndroid Build Coastguard Worker {
1632*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1633*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
1634*61046927SAndroid Build Coastguard Worker
1635*61046927SAndroid Build Coastguard Worker if (gc != &dummyContext && gc->isDirect) {
1636*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = gc->psc;
1637*61046927SAndroid Build Coastguard Worker if (psc && psc->driScreen.getSwapInterval) {
1638*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw =
1639*61046927SAndroid Build Coastguard Worker GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1640*61046927SAndroid Build Coastguard Worker if (pdraw)
1641*61046927SAndroid Build Coastguard Worker return psc->driScreen.getSwapInterval(pdraw);
1642*61046927SAndroid Build Coastguard Worker }
1643*61046927SAndroid Build Coastguard Worker }
1644*61046927SAndroid Build Coastguard Worker #endif
1645*61046927SAndroid Build Coastguard Worker
1646*61046927SAndroid Build Coastguard Worker return 0;
1647*61046927SAndroid Build Coastguard Worker }
1648*61046927SAndroid Build Coastguard Worker
1649*61046927SAndroid Build Coastguard Worker
1650*61046927SAndroid Build Coastguard Worker /*
1651*61046927SAndroid Build Coastguard Worker ** GLX_EXT_swap_control
1652*61046927SAndroid Build Coastguard Worker */
1653*61046927SAndroid Build Coastguard Worker _X_HIDDEN void
glXSwapIntervalEXT(Display * dpy,GLXDrawable drawable,int interval)1654*61046927SAndroid Build Coastguard Worker glXSwapIntervalEXT(Display *dpy, GLXDrawable drawable, int interval)
1655*61046927SAndroid Build Coastguard Worker {
1656*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1657*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
1658*61046927SAndroid Build Coastguard Worker
1659*61046927SAndroid Build Coastguard Worker /*
1660*61046927SAndroid Build Coastguard Worker * Strictly, this should throw an error if drawable is not a Window or
1661*61046927SAndroid Build Coastguard Worker * GLXWindow. We don't actually track that, so, oh well.
1662*61046927SAndroid Build Coastguard Worker */
1663*61046927SAndroid Build Coastguard Worker if (!pdraw) {
1664*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, BadWindow, drawable, 0, True);
1665*61046927SAndroid Build Coastguard Worker return;
1666*61046927SAndroid Build Coastguard Worker }
1667*61046927SAndroid Build Coastguard Worker
1668*61046927SAndroid Build Coastguard Worker if (interval < 0 &&
1669*61046927SAndroid Build Coastguard Worker !__glXExtensionBitIsEnabled(pdraw->psc, EXT_swap_control_tear_bit)) {
1670*61046927SAndroid Build Coastguard Worker __glXSendError(dpy, BadValue, interval, 0, True);
1671*61046927SAndroid Build Coastguard Worker return;
1672*61046927SAndroid Build Coastguard Worker }
1673*61046927SAndroid Build Coastguard Worker if (pdraw->psc->driScreen.setSwapInterval)
1674*61046927SAndroid Build Coastguard Worker pdraw->psc->driScreen.setSwapInterval(pdraw, interval);
1675*61046927SAndroid Build Coastguard Worker #endif
1676*61046927SAndroid Build Coastguard Worker }
1677*61046927SAndroid Build Coastguard Worker
1678*61046927SAndroid Build Coastguard Worker
1679*61046927SAndroid Build Coastguard Worker /*
1680*61046927SAndroid Build Coastguard Worker ** GLX_SGI_video_sync
1681*61046927SAndroid Build Coastguard Worker */
1682*61046927SAndroid Build Coastguard Worker _X_HIDDEN int
glXGetVideoSyncSGI(unsigned int * count)1683*61046927SAndroid Build Coastguard Worker glXGetVideoSyncSGI(unsigned int *count)
1684*61046927SAndroid Build Coastguard Worker {
1685*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1686*61046927SAndroid Build Coastguard Worker int64_t ust, msc, sbc;
1687*61046927SAndroid Build Coastguard Worker int ret;
1688*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
1689*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = gc->psc;
1690*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw;
1691*61046927SAndroid Build Coastguard Worker
1692*61046927SAndroid Build Coastguard Worker if (gc == &dummyContext)
1693*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1694*61046927SAndroid Build Coastguard Worker
1695*61046927SAndroid Build Coastguard Worker if (!gc->isDirect)
1696*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1697*61046927SAndroid Build Coastguard Worker
1698*61046927SAndroid Build Coastguard Worker if (!gc->currentDrawable)
1699*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1700*61046927SAndroid Build Coastguard Worker
1701*61046927SAndroid Build Coastguard Worker pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1702*61046927SAndroid Build Coastguard Worker
1703*61046927SAndroid Build Coastguard Worker /* FIXME: Looking at the GLX_SGI_video_sync spec in the extension registry,
1704*61046927SAndroid Build Coastguard Worker * FIXME: there should be a GLX encoding for this call. I can find no
1705*61046927SAndroid Build Coastguard Worker * FIXME: documentation for the GLX encoding.
1706*61046927SAndroid Build Coastguard Worker */
1707*61046927SAndroid Build Coastguard Worker if (psc && psc->driScreen.getDrawableMSC) {
1708*61046927SAndroid Build Coastguard Worker ret = psc->driScreen.getDrawableMSC(psc, pdraw, &ust, &msc, &sbc);
1709*61046927SAndroid Build Coastguard Worker *count = (unsigned) msc;
1710*61046927SAndroid Build Coastguard Worker return (ret == True) ? 0 : GLX_BAD_CONTEXT;
1711*61046927SAndroid Build Coastguard Worker }
1712*61046927SAndroid Build Coastguard Worker #endif
1713*61046927SAndroid Build Coastguard Worker
1714*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1715*61046927SAndroid Build Coastguard Worker }
1716*61046927SAndroid Build Coastguard Worker
1717*61046927SAndroid Build Coastguard Worker _X_HIDDEN int
glXWaitVideoSyncSGI(int divisor,int remainder,unsigned int * count)1718*61046927SAndroid Build Coastguard Worker glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
1719*61046927SAndroid Build Coastguard Worker {
1720*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
1721*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1722*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = gc->psc;
1723*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw;
1724*61046927SAndroid Build Coastguard Worker int64_t ust, msc, sbc;
1725*61046927SAndroid Build Coastguard Worker int ret;
1726*61046927SAndroid Build Coastguard Worker #endif
1727*61046927SAndroid Build Coastguard Worker
1728*61046927SAndroid Build Coastguard Worker if (divisor <= 0 || remainder < 0)
1729*61046927SAndroid Build Coastguard Worker return GLX_BAD_VALUE;
1730*61046927SAndroid Build Coastguard Worker
1731*61046927SAndroid Build Coastguard Worker if (gc == &dummyContext)
1732*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1733*61046927SAndroid Build Coastguard Worker
1734*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1735*61046927SAndroid Build Coastguard Worker if (!gc->isDirect)
1736*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1737*61046927SAndroid Build Coastguard Worker
1738*61046927SAndroid Build Coastguard Worker if (!gc->currentDrawable)
1739*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1740*61046927SAndroid Build Coastguard Worker
1741*61046927SAndroid Build Coastguard Worker pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1742*61046927SAndroid Build Coastguard Worker
1743*61046927SAndroid Build Coastguard Worker if (psc && psc->driScreen.waitForMSC) {
1744*61046927SAndroid Build Coastguard Worker ret = psc->driScreen.waitForMSC(pdraw, 0, divisor, remainder, &ust, &msc,
1745*61046927SAndroid Build Coastguard Worker &sbc);
1746*61046927SAndroid Build Coastguard Worker *count = (unsigned) msc;
1747*61046927SAndroid Build Coastguard Worker return (ret == True) ? 0 : GLX_BAD_CONTEXT;
1748*61046927SAndroid Build Coastguard Worker }
1749*61046927SAndroid Build Coastguard Worker #endif
1750*61046927SAndroid Build Coastguard Worker
1751*61046927SAndroid Build Coastguard Worker return GLX_BAD_CONTEXT;
1752*61046927SAndroid Build Coastguard Worker }
1753*61046927SAndroid Build Coastguard Worker
1754*61046927SAndroid Build Coastguard Worker #endif /* GLX_USE_APPLEGL */
1755*61046927SAndroid Build Coastguard Worker
1756*61046927SAndroid Build Coastguard Worker /*
1757*61046927SAndroid Build Coastguard Worker ** GLX_SGIX_fbconfig
1758*61046927SAndroid Build Coastguard Worker ** Many of these functions are aliased to GLX 1.3 entry points in the
1759*61046927SAndroid Build Coastguard Worker ** GLX_functions table.
1760*61046927SAndroid Build Coastguard Worker */
1761*61046927SAndroid Build Coastguard Worker
1762*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC
1763*61046927SAndroid Build Coastguard Worker GLX_ALIAS(int, glXGetFBConfigAttribSGIX,
1764*61046927SAndroid Build Coastguard Worker (Display * dpy, GLXFBConfigSGIX config, int attribute, int *value),
1765*61046927SAndroid Build Coastguard Worker (dpy, config, attribute, value), glXGetFBConfigAttrib)
1766*61046927SAndroid Build Coastguard Worker
1767*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLX_ALIAS(GLXFBConfigSGIX *, glXChooseFBConfigSGIX,
1768*61046927SAndroid Build Coastguard Worker (Display * dpy, int screen, int *attrib_list,
1769*61046927SAndroid Build Coastguard Worker int *nelements), (dpy, screen, attrib_list, nelements),
1770*61046927SAndroid Build Coastguard Worker glXChooseFBConfig)
1771*61046927SAndroid Build Coastguard Worker
1772*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLX_ALIAS(XVisualInfo *, glXGetVisualFromFBConfigSGIX,
1773*61046927SAndroid Build Coastguard Worker (Display * dpy, GLXFBConfigSGIX config),
1774*61046927SAndroid Build Coastguard Worker (dpy, config), glXGetVisualFromFBConfig)
1775*61046927SAndroid Build Coastguard Worker
1776*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLX_ALIAS(GLXContext, glXCreateContextWithConfigSGIX,
1777*61046927SAndroid Build Coastguard Worker (Display *dpy, GLXFBConfigSGIX fbconfig,
1778*61046927SAndroid Build Coastguard Worker int renderType, GLXContext shareList, Bool direct),
1779*61046927SAndroid Build Coastguard Worker (dpy, fbconfig, renderType, shareList, direct),
1780*61046927SAndroid Build Coastguard Worker glXCreateNewContext)
1781*61046927SAndroid Build Coastguard Worker
1782*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC GLXFBConfigSGIX
glXGetFBConfigFromVisualSGIX(Display * dpy,XVisualInfo * vis)1783*61046927SAndroid Build Coastguard Worker glXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis)
1784*61046927SAndroid Build Coastguard Worker {
1785*61046927SAndroid Build Coastguard Worker int attrib_list[] = { GLX_VISUAL_ID, vis->visualid, None };
1786*61046927SAndroid Build Coastguard Worker int nconfigs = 0;
1787*61046927SAndroid Build Coastguard Worker GLXFBConfig *config_list;
1788*61046927SAndroid Build Coastguard Worker GLXFBConfig config;
1789*61046927SAndroid Build Coastguard Worker
1790*61046927SAndroid Build Coastguard Worker config_list = glXChooseFBConfig(dpy, vis->screen, attrib_list, &nconfigs);
1791*61046927SAndroid Build Coastguard Worker if (nconfigs == 0)
1792*61046927SAndroid Build Coastguard Worker return NULL;
1793*61046927SAndroid Build Coastguard Worker
1794*61046927SAndroid Build Coastguard Worker config = config_list[0];
1795*61046927SAndroid Build Coastguard Worker free(config_list);
1796*61046927SAndroid Build Coastguard Worker return (GLXFBConfigSGIX)config;
1797*61046927SAndroid Build Coastguard Worker }
1798*61046927SAndroid Build Coastguard Worker
1799*61046927SAndroid Build Coastguard Worker #ifndef GLX_USE_APPLEGL
1800*61046927SAndroid Build Coastguard Worker /*
1801*61046927SAndroid Build Coastguard Worker ** GLX_OML_sync_control
1802*61046927SAndroid Build Coastguard Worker */
1803*61046927SAndroid Build Coastguard Worker _X_HIDDEN Bool
glXGetSyncValuesOML(Display * dpy,GLXDrawable drawable,int64_t * ust,int64_t * msc,int64_t * sbc)1804*61046927SAndroid Build Coastguard Worker glXGetSyncValuesOML(Display *dpy, GLXDrawable drawable,
1805*61046927SAndroid Build Coastguard Worker int64_t *ust, int64_t *msc, int64_t *sbc)
1806*61046927SAndroid Build Coastguard Worker {
1807*61046927SAndroid Build Coastguard Worker struct glx_display * const priv = __glXInitialize(dpy);
1808*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1809*61046927SAndroid Build Coastguard Worker int ret;
1810*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw;
1811*61046927SAndroid Build Coastguard Worker struct glx_screen *psc;
1812*61046927SAndroid Build Coastguard Worker #endif
1813*61046927SAndroid Build Coastguard Worker
1814*61046927SAndroid Build Coastguard Worker if (!priv)
1815*61046927SAndroid Build Coastguard Worker return False;
1816*61046927SAndroid Build Coastguard Worker
1817*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1818*61046927SAndroid Build Coastguard Worker pdraw = GetGLXDRIDrawable(dpy, drawable);
1819*61046927SAndroid Build Coastguard Worker psc = pdraw ? pdraw->psc : NULL;
1820*61046927SAndroid Build Coastguard Worker if (pdraw && psc->driScreen.getDrawableMSC) {
1821*61046927SAndroid Build Coastguard Worker ret = psc->driScreen.getDrawableMSC(psc, pdraw, ust, msc, sbc);
1822*61046927SAndroid Build Coastguard Worker return ret;
1823*61046927SAndroid Build Coastguard Worker }
1824*61046927SAndroid Build Coastguard Worker #endif
1825*61046927SAndroid Build Coastguard Worker
1826*61046927SAndroid Build Coastguard Worker return False;
1827*61046927SAndroid Build Coastguard Worker }
1828*61046927SAndroid Build Coastguard Worker
1829*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
1830*61046927SAndroid Build Coastguard Worker _X_HIDDEN GLboolean
__glxGetMscRate(struct glx_screen * psc,int32_t * numerator,int32_t * denominator)1831*61046927SAndroid Build Coastguard Worker __glxGetMscRate(struct glx_screen *psc,
1832*61046927SAndroid Build Coastguard Worker int32_t * numerator, int32_t * denominator)
1833*61046927SAndroid Build Coastguard Worker {
1834*61046927SAndroid Build Coastguard Worker #if !defined(GLX_USE_WINDOWSGL)
1835*61046927SAndroid Build Coastguard Worker XF86VidModeModeLine mode_line;
1836*61046927SAndroid Build Coastguard Worker int dot_clock;
1837*61046927SAndroid Build Coastguard Worker int i;
1838*61046927SAndroid Build Coastguard Worker
1839*61046927SAndroid Build Coastguard Worker if (XF86VidModeQueryVersion(psc->dpy, &i, &i) &&
1840*61046927SAndroid Build Coastguard Worker XF86VidModeGetModeLine(psc->dpy, psc->scr, &dot_clock, &mode_line)) {
1841*61046927SAndroid Build Coastguard Worker unsigned n = dot_clock * 1000;
1842*61046927SAndroid Build Coastguard Worker unsigned d = mode_line.vtotal * mode_line.htotal;
1843*61046927SAndroid Build Coastguard Worker
1844*61046927SAndroid Build Coastguard Worker # define V_INTERLACE 0x010
1845*61046927SAndroid Build Coastguard Worker # define V_DBLSCAN 0x020
1846*61046927SAndroid Build Coastguard Worker
1847*61046927SAndroid Build Coastguard Worker if (mode_line.flags & V_INTERLACE)
1848*61046927SAndroid Build Coastguard Worker n *= 2;
1849*61046927SAndroid Build Coastguard Worker else if (mode_line.flags & V_DBLSCAN)
1850*61046927SAndroid Build Coastguard Worker d *= 2;
1851*61046927SAndroid Build Coastguard Worker
1852*61046927SAndroid Build Coastguard Worker /* The OML_sync_control spec requires that if the refresh rate is a
1853*61046927SAndroid Build Coastguard Worker * whole number, that the returned numerator be equal to the refresh
1854*61046927SAndroid Build Coastguard Worker * rate and the denominator be 1.
1855*61046927SAndroid Build Coastguard Worker */
1856*61046927SAndroid Build Coastguard Worker
1857*61046927SAndroid Build Coastguard Worker if (n % d == 0) {
1858*61046927SAndroid Build Coastguard Worker n /= d;
1859*61046927SAndroid Build Coastguard Worker d = 1;
1860*61046927SAndroid Build Coastguard Worker }
1861*61046927SAndroid Build Coastguard Worker else {
1862*61046927SAndroid Build Coastguard Worker static const unsigned f[] = { 13, 11, 7, 5, 3, 2, 0 };
1863*61046927SAndroid Build Coastguard Worker
1864*61046927SAndroid Build Coastguard Worker /* This is a poor man's way to reduce a fraction. It's far from
1865*61046927SAndroid Build Coastguard Worker * perfect, but it will work well enough for this situation.
1866*61046927SAndroid Build Coastguard Worker */
1867*61046927SAndroid Build Coastguard Worker
1868*61046927SAndroid Build Coastguard Worker for (i = 0; f[i] != 0; i++) {
1869*61046927SAndroid Build Coastguard Worker while (n % f[i] == 0 && d % f[i] == 0) {
1870*61046927SAndroid Build Coastguard Worker d /= f[i];
1871*61046927SAndroid Build Coastguard Worker n /= f[i];
1872*61046927SAndroid Build Coastguard Worker }
1873*61046927SAndroid Build Coastguard Worker }
1874*61046927SAndroid Build Coastguard Worker }
1875*61046927SAndroid Build Coastguard Worker
1876*61046927SAndroid Build Coastguard Worker *numerator = n;
1877*61046927SAndroid Build Coastguard Worker *denominator = d;
1878*61046927SAndroid Build Coastguard Worker
1879*61046927SAndroid Build Coastguard Worker return True;
1880*61046927SAndroid Build Coastguard Worker }
1881*61046927SAndroid Build Coastguard Worker #endif
1882*61046927SAndroid Build Coastguard Worker
1883*61046927SAndroid Build Coastguard Worker return False;
1884*61046927SAndroid Build Coastguard Worker }
1885*61046927SAndroid Build Coastguard Worker #endif
1886*61046927SAndroid Build Coastguard Worker
1887*61046927SAndroid Build Coastguard Worker /**
1888*61046927SAndroid Build Coastguard Worker * Determine the refresh rate of the specified drawable and display.
1889*61046927SAndroid Build Coastguard Worker *
1890*61046927SAndroid Build Coastguard Worker * \param dpy Display whose refresh rate is to be determined.
1891*61046927SAndroid Build Coastguard Worker * \param drawable Drawable whose refresh rate is to be determined.
1892*61046927SAndroid Build Coastguard Worker * \param numerator Numerator of the refresh rate.
1893*61046927SAndroid Build Coastguard Worker * \param denominator Denominator of the refresh rate.
1894*61046927SAndroid Build Coastguard Worker * \return If the refresh rate for the specified display and drawable could
1895*61046927SAndroid Build Coastguard Worker * be calculated, True is returned. Otherwise False is returned.
1896*61046927SAndroid Build Coastguard Worker *
1897*61046927SAndroid Build Coastguard Worker * \note This function is implemented entirely client-side. A lot of other
1898*61046927SAndroid Build Coastguard Worker * functionality is required to export GLX_OML_sync_control, so on
1899*61046927SAndroid Build Coastguard Worker * XFree86 this function can be called for direct-rendering contexts
1900*61046927SAndroid Build Coastguard Worker * when GLX_OML_sync_control appears in the client extension string.
1901*61046927SAndroid Build Coastguard Worker */
1902*61046927SAndroid Build Coastguard Worker
1903*61046927SAndroid Build Coastguard Worker _X_HIDDEN Bool
glXGetMscRateOML(Display * dpy,GLXDrawable drawable,int32_t * numerator,int32_t * denominator)1904*61046927SAndroid Build Coastguard Worker glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
1905*61046927SAndroid Build Coastguard Worker int32_t * numerator, int32_t * denominator)
1906*61046927SAndroid Build Coastguard Worker {
1907*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) && !defined(GLX_USE_WINDOWSGL)
1908*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *draw = GetGLXDRIDrawable(dpy, drawable);
1909*61046927SAndroid Build Coastguard Worker
1910*61046927SAndroid Build Coastguard Worker if (draw == NULL)
1911*61046927SAndroid Build Coastguard Worker return False;
1912*61046927SAndroid Build Coastguard Worker
1913*61046927SAndroid Build Coastguard Worker return __glxGetMscRate(draw->psc, numerator, denominator);
1914*61046927SAndroid Build Coastguard Worker #else
1915*61046927SAndroid Build Coastguard Worker (void) dpy;
1916*61046927SAndroid Build Coastguard Worker (void) drawable;
1917*61046927SAndroid Build Coastguard Worker (void) numerator;
1918*61046927SAndroid Build Coastguard Worker (void) denominator;
1919*61046927SAndroid Build Coastguard Worker #endif
1920*61046927SAndroid Build Coastguard Worker return False;
1921*61046927SAndroid Build Coastguard Worker }
1922*61046927SAndroid Build Coastguard Worker
1923*61046927SAndroid Build Coastguard Worker
1924*61046927SAndroid Build Coastguard Worker _X_HIDDEN int64_t
glXSwapBuffersMscOML(Display * dpy,GLXDrawable drawable,int64_t target_msc,int64_t divisor,int64_t remainder)1925*61046927SAndroid Build Coastguard Worker glXSwapBuffersMscOML(Display *dpy, GLXDrawable drawable,
1926*61046927SAndroid Build Coastguard Worker int64_t target_msc, int64_t divisor, int64_t remainder)
1927*61046927SAndroid Build Coastguard Worker {
1928*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
1929*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1930*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
1931*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
1932*61046927SAndroid Build Coastguard Worker #endif
1933*61046927SAndroid Build Coastguard Worker
1934*61046927SAndroid Build Coastguard Worker if (gc == &dummyContext) /* no GLX for this */
1935*61046927SAndroid Build Coastguard Worker return -1;
1936*61046927SAndroid Build Coastguard Worker
1937*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1938*61046927SAndroid Build Coastguard Worker if (!pdraw || !gc->isDirect)
1939*61046927SAndroid Build Coastguard Worker return -1;
1940*61046927SAndroid Build Coastguard Worker #endif
1941*61046927SAndroid Build Coastguard Worker
1942*61046927SAndroid Build Coastguard Worker /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
1943*61046927SAndroid Build Coastguard Worker * error", but it also says "It [glXSwapBuffersMscOML] will return a value
1944*61046927SAndroid Build Coastguard Worker * of -1 if the function failed because of errors detected in the input
1945*61046927SAndroid Build Coastguard Worker * parameters"
1946*61046927SAndroid Build Coastguard Worker */
1947*61046927SAndroid Build Coastguard Worker if (divisor < 0 || remainder < 0 || target_msc < 0)
1948*61046927SAndroid Build Coastguard Worker return -1;
1949*61046927SAndroid Build Coastguard Worker if (divisor > 0 && remainder >= divisor)
1950*61046927SAndroid Build Coastguard Worker return -1;
1951*61046927SAndroid Build Coastguard Worker
1952*61046927SAndroid Build Coastguard Worker if (target_msc == 0 && divisor == 0 && remainder == 0)
1953*61046927SAndroid Build Coastguard Worker remainder = 1;
1954*61046927SAndroid Build Coastguard Worker
1955*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1956*61046927SAndroid Build Coastguard Worker if (psc->driScreen.swapBuffers)
1957*61046927SAndroid Build Coastguard Worker return psc->driScreen.swapBuffers(pdraw, target_msc, divisor,
1958*61046927SAndroid Build Coastguard Worker remainder, False);
1959*61046927SAndroid Build Coastguard Worker #endif
1960*61046927SAndroid Build Coastguard Worker
1961*61046927SAndroid Build Coastguard Worker return -1;
1962*61046927SAndroid Build Coastguard Worker }
1963*61046927SAndroid Build Coastguard Worker
1964*61046927SAndroid Build Coastguard Worker
1965*61046927SAndroid Build Coastguard Worker _X_HIDDEN Bool
glXWaitForMscOML(Display * dpy,GLXDrawable drawable,int64_t target_msc,int64_t divisor,int64_t remainder,int64_t * ust,int64_t * msc,int64_t * sbc)1966*61046927SAndroid Build Coastguard Worker glXWaitForMscOML(Display *dpy, GLXDrawable drawable, int64_t target_msc,
1967*61046927SAndroid Build Coastguard Worker int64_t divisor, int64_t remainder, int64_t *ust,
1968*61046927SAndroid Build Coastguard Worker int64_t *msc, int64_t *sbc)
1969*61046927SAndroid Build Coastguard Worker {
1970*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1971*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
1972*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
1973*61046927SAndroid Build Coastguard Worker int ret;
1974*61046927SAndroid Build Coastguard Worker #endif
1975*61046927SAndroid Build Coastguard Worker
1976*61046927SAndroid Build Coastguard Worker
1977*61046927SAndroid Build Coastguard Worker /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
1978*61046927SAndroid Build Coastguard Worker * error", but the return type in the spec is Bool.
1979*61046927SAndroid Build Coastguard Worker */
1980*61046927SAndroid Build Coastguard Worker if (divisor < 0 || remainder < 0 || target_msc < 0)
1981*61046927SAndroid Build Coastguard Worker return False;
1982*61046927SAndroid Build Coastguard Worker if (divisor > 0 && remainder >= divisor)
1983*61046927SAndroid Build Coastguard Worker return False;
1984*61046927SAndroid Build Coastguard Worker
1985*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
1986*61046927SAndroid Build Coastguard Worker if (pdraw && psc->driScreen.waitForMSC) {
1987*61046927SAndroid Build Coastguard Worker ret = psc->driScreen.waitForMSC(pdraw, target_msc, divisor, remainder,
1988*61046927SAndroid Build Coastguard Worker ust, msc, sbc);
1989*61046927SAndroid Build Coastguard Worker return ret;
1990*61046927SAndroid Build Coastguard Worker }
1991*61046927SAndroid Build Coastguard Worker #endif
1992*61046927SAndroid Build Coastguard Worker
1993*61046927SAndroid Build Coastguard Worker return False;
1994*61046927SAndroid Build Coastguard Worker }
1995*61046927SAndroid Build Coastguard Worker
1996*61046927SAndroid Build Coastguard Worker
1997*61046927SAndroid Build Coastguard Worker _X_HIDDEN Bool
glXWaitForSbcOML(Display * dpy,GLXDrawable drawable,int64_t target_sbc,int64_t * ust,int64_t * msc,int64_t * sbc)1998*61046927SAndroid Build Coastguard Worker glXWaitForSbcOML(Display *dpy, GLXDrawable drawable, int64_t target_sbc,
1999*61046927SAndroid Build Coastguard Worker int64_t *ust, int64_t *msc, int64_t *sbc)
2000*61046927SAndroid Build Coastguard Worker {
2001*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
2002*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
2003*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
2004*61046927SAndroid Build Coastguard Worker int ret;
2005*61046927SAndroid Build Coastguard Worker #endif
2006*61046927SAndroid Build Coastguard Worker
2007*61046927SAndroid Build Coastguard Worker /* The OML_sync_control spec says this should "generate a GLX_BAD_VALUE
2008*61046927SAndroid Build Coastguard Worker * error", but the return type in the spec is Bool.
2009*61046927SAndroid Build Coastguard Worker */
2010*61046927SAndroid Build Coastguard Worker if (target_sbc < 0)
2011*61046927SAndroid Build Coastguard Worker return False;
2012*61046927SAndroid Build Coastguard Worker
2013*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
2014*61046927SAndroid Build Coastguard Worker if (pdraw && psc->driScreen.waitForSBC) {
2015*61046927SAndroid Build Coastguard Worker ret = psc->driScreen.waitForSBC(pdraw, target_sbc, ust, msc, sbc);
2016*61046927SAndroid Build Coastguard Worker return ret;
2017*61046927SAndroid Build Coastguard Worker }
2018*61046927SAndroid Build Coastguard Worker #endif
2019*61046927SAndroid Build Coastguard Worker
2020*61046927SAndroid Build Coastguard Worker return False;
2021*61046927SAndroid Build Coastguard Worker }
2022*61046927SAndroid Build Coastguard Worker
2023*61046927SAndroid Build Coastguard Worker /*@}*/
2024*61046927SAndroid Build Coastguard Worker
2025*61046927SAndroid Build Coastguard Worker
2026*61046927SAndroid Build Coastguard Worker /**
2027*61046927SAndroid Build Coastguard Worker * GLX_MESA_copy_sub_buffer
2028*61046927SAndroid Build Coastguard Worker */
2029*61046927SAndroid Build Coastguard Worker #define X_GLXvop_CopySubBufferMESA 5154 /* temporary */
2030*61046927SAndroid Build Coastguard Worker _X_HIDDEN void
glXCopySubBufferMESA(Display * dpy,GLXDrawable drawable,int x,int y,int width,int height)2031*61046927SAndroid Build Coastguard Worker glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable,
2032*61046927SAndroid Build Coastguard Worker int x, int y, int width, int height)
2033*61046927SAndroid Build Coastguard Worker {
2034*61046927SAndroid Build Coastguard Worker xGLXVendorPrivateReq *req;
2035*61046927SAndroid Build Coastguard Worker struct glx_context *gc;
2036*61046927SAndroid Build Coastguard Worker GLXContextTag tag;
2037*61046927SAndroid Build Coastguard Worker CARD32 *drawable_ptr;
2038*61046927SAndroid Build Coastguard Worker INT32 *x_ptr, *y_ptr, *w_ptr, *h_ptr;
2039*61046927SAndroid Build Coastguard Worker CARD8 opcode;
2040*61046927SAndroid Build Coastguard Worker
2041*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2042*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
2043*61046927SAndroid Build Coastguard Worker if (pdraw != NULL) {
2044*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = pdraw->psc;
2045*61046927SAndroid Build Coastguard Worker if (psc->driScreen.copySubBuffer != NULL) {
2046*61046927SAndroid Build Coastguard Worker psc->driScreen.copySubBuffer(pdraw, x, y, width, height, True);
2047*61046927SAndroid Build Coastguard Worker }
2048*61046927SAndroid Build Coastguard Worker
2049*61046927SAndroid Build Coastguard Worker return;
2050*61046927SAndroid Build Coastguard Worker }
2051*61046927SAndroid Build Coastguard Worker #endif
2052*61046927SAndroid Build Coastguard Worker
2053*61046927SAndroid Build Coastguard Worker opcode = __glXSetupForCommand(dpy);
2054*61046927SAndroid Build Coastguard Worker if (!opcode)
2055*61046927SAndroid Build Coastguard Worker return;
2056*61046927SAndroid Build Coastguard Worker
2057*61046927SAndroid Build Coastguard Worker /*
2058*61046927SAndroid Build Coastguard Worker ** The calling thread may or may not have a current context. If it
2059*61046927SAndroid Build Coastguard Worker ** does, send the context tag so the server can do a flush.
2060*61046927SAndroid Build Coastguard Worker */
2061*61046927SAndroid Build Coastguard Worker gc = __glXGetCurrentContext();
2062*61046927SAndroid Build Coastguard Worker if ((gc != &dummyContext) && (dpy == gc->currentDpy) &&
2063*61046927SAndroid Build Coastguard Worker ((drawable == gc->currentDrawable) ||
2064*61046927SAndroid Build Coastguard Worker (drawable == gc->currentReadable))) {
2065*61046927SAndroid Build Coastguard Worker tag = gc->currentContextTag;
2066*61046927SAndroid Build Coastguard Worker }
2067*61046927SAndroid Build Coastguard Worker else {
2068*61046927SAndroid Build Coastguard Worker tag = 0;
2069*61046927SAndroid Build Coastguard Worker }
2070*61046927SAndroid Build Coastguard Worker
2071*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
2072*61046927SAndroid Build Coastguard Worker GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32) * 4, req);
2073*61046927SAndroid Build Coastguard Worker req->reqType = opcode;
2074*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXVendorPrivate;
2075*61046927SAndroid Build Coastguard Worker req->vendorCode = X_GLXvop_CopySubBufferMESA;
2076*61046927SAndroid Build Coastguard Worker req->contextTag = tag;
2077*61046927SAndroid Build Coastguard Worker
2078*61046927SAndroid Build Coastguard Worker drawable_ptr = (CARD32 *) (req + 1);
2079*61046927SAndroid Build Coastguard Worker x_ptr = (INT32 *) (drawable_ptr + 1);
2080*61046927SAndroid Build Coastguard Worker y_ptr = (INT32 *) (drawable_ptr + 2);
2081*61046927SAndroid Build Coastguard Worker w_ptr = (INT32 *) (drawable_ptr + 3);
2082*61046927SAndroid Build Coastguard Worker h_ptr = (INT32 *) (drawable_ptr + 4);
2083*61046927SAndroid Build Coastguard Worker
2084*61046927SAndroid Build Coastguard Worker *drawable_ptr = drawable;
2085*61046927SAndroid Build Coastguard Worker *x_ptr = x;
2086*61046927SAndroid Build Coastguard Worker *y_ptr = y;
2087*61046927SAndroid Build Coastguard Worker *w_ptr = width;
2088*61046927SAndroid Build Coastguard Worker *h_ptr = height;
2089*61046927SAndroid Build Coastguard Worker
2090*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
2091*61046927SAndroid Build Coastguard Worker SyncHandle();
2092*61046927SAndroid Build Coastguard Worker }
2093*61046927SAndroid Build Coastguard Worker
2094*61046927SAndroid Build Coastguard Worker /*@{*/
2095*61046927SAndroid Build Coastguard Worker _X_HIDDEN void
glXBindTexImageEXT(Display * dpy,GLXDrawable drawable,int buffer,const int * attrib_list)2096*61046927SAndroid Build Coastguard Worker glXBindTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer,
2097*61046927SAndroid Build Coastguard Worker const int *attrib_list)
2098*61046927SAndroid Build Coastguard Worker {
2099*61046927SAndroid Build Coastguard Worker xGLXVendorPrivateReq *req;
2100*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
2101*61046927SAndroid Build Coastguard Worker CARD32 *drawable_ptr;
2102*61046927SAndroid Build Coastguard Worker INT32 *buffer_ptr;
2103*61046927SAndroid Build Coastguard Worker CARD32 *num_attrib_ptr;
2104*61046927SAndroid Build Coastguard Worker CARD32 *attrib_ptr;
2105*61046927SAndroid Build Coastguard Worker CARD8 opcode;
2106*61046927SAndroid Build Coastguard Worker unsigned int i = 0;
2107*61046927SAndroid Build Coastguard Worker
2108*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
2109*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
2110*61046927SAndroid Build Coastguard Worker if (pdraw != NULL) {
2111*61046927SAndroid Build Coastguard Worker struct glx_screen *psc = pdraw->psc;
2112*61046927SAndroid Build Coastguard Worker if (psc->driScreen.bindTexImage != NULL)
2113*61046927SAndroid Build Coastguard Worker psc->driScreen.bindTexImage(pdraw, buffer, attrib_list);
2114*61046927SAndroid Build Coastguard Worker
2115*61046927SAndroid Build Coastguard Worker return;
2116*61046927SAndroid Build Coastguard Worker }
2117*61046927SAndroid Build Coastguard Worker #endif
2118*61046927SAndroid Build Coastguard Worker
2119*61046927SAndroid Build Coastguard Worker if (attrib_list) {
2120*61046927SAndroid Build Coastguard Worker while (attrib_list[i * 2] != None)
2121*61046927SAndroid Build Coastguard Worker i++;
2122*61046927SAndroid Build Coastguard Worker }
2123*61046927SAndroid Build Coastguard Worker
2124*61046927SAndroid Build Coastguard Worker opcode = __glXSetupForCommand(dpy);
2125*61046927SAndroid Build Coastguard Worker if (!opcode)
2126*61046927SAndroid Build Coastguard Worker return;
2127*61046927SAndroid Build Coastguard Worker
2128*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
2129*61046927SAndroid Build Coastguard Worker GetReqExtra(GLXVendorPrivate, 12 + 8 * i, req);
2130*61046927SAndroid Build Coastguard Worker req->reqType = opcode;
2131*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXVendorPrivate;
2132*61046927SAndroid Build Coastguard Worker req->vendorCode = X_GLXvop_BindTexImageEXT;
2133*61046927SAndroid Build Coastguard Worker req->contextTag = gc->currentContextTag;
2134*61046927SAndroid Build Coastguard Worker
2135*61046927SAndroid Build Coastguard Worker drawable_ptr = (CARD32 *) (req + 1);
2136*61046927SAndroid Build Coastguard Worker buffer_ptr = (INT32 *) (drawable_ptr + 1);
2137*61046927SAndroid Build Coastguard Worker num_attrib_ptr = (CARD32 *) (buffer_ptr + 1);
2138*61046927SAndroid Build Coastguard Worker attrib_ptr = (CARD32 *) (num_attrib_ptr + 1);
2139*61046927SAndroid Build Coastguard Worker
2140*61046927SAndroid Build Coastguard Worker *drawable_ptr = drawable;
2141*61046927SAndroid Build Coastguard Worker *buffer_ptr = buffer;
2142*61046927SAndroid Build Coastguard Worker *num_attrib_ptr = (CARD32) i;
2143*61046927SAndroid Build Coastguard Worker
2144*61046927SAndroid Build Coastguard Worker i = 0;
2145*61046927SAndroid Build Coastguard Worker if (attrib_list) {
2146*61046927SAndroid Build Coastguard Worker while (attrib_list[i * 2] != None) {
2147*61046927SAndroid Build Coastguard Worker *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 0];
2148*61046927SAndroid Build Coastguard Worker *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 1];
2149*61046927SAndroid Build Coastguard Worker i++;
2150*61046927SAndroid Build Coastguard Worker }
2151*61046927SAndroid Build Coastguard Worker }
2152*61046927SAndroid Build Coastguard Worker
2153*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
2154*61046927SAndroid Build Coastguard Worker SyncHandle();
2155*61046927SAndroid Build Coastguard Worker }
2156*61046927SAndroid Build Coastguard Worker
2157*61046927SAndroid Build Coastguard Worker _X_HIDDEN void
glXReleaseTexImageEXT(Display * dpy,GLXDrawable drawable,int buffer)2158*61046927SAndroid Build Coastguard Worker glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
2159*61046927SAndroid Build Coastguard Worker {
2160*61046927SAndroid Build Coastguard Worker xGLXVendorPrivateReq *req;
2161*61046927SAndroid Build Coastguard Worker struct glx_context *gc = __glXGetCurrentContext();
2162*61046927SAndroid Build Coastguard Worker CARD32 *drawable_ptr;
2163*61046927SAndroid Build Coastguard Worker INT32 *buffer_ptr;
2164*61046927SAndroid Build Coastguard Worker CARD8 opcode;
2165*61046927SAndroid Build Coastguard Worker
2166*61046927SAndroid Build Coastguard Worker #ifdef GLX_DIRECT_RENDERING
2167*61046927SAndroid Build Coastguard Worker __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
2168*61046927SAndroid Build Coastguard Worker if (pdraw != NULL) {
2169*61046927SAndroid Build Coastguard Worker return;
2170*61046927SAndroid Build Coastguard Worker }
2171*61046927SAndroid Build Coastguard Worker #endif
2172*61046927SAndroid Build Coastguard Worker
2173*61046927SAndroid Build Coastguard Worker opcode = __glXSetupForCommand(dpy);
2174*61046927SAndroid Build Coastguard Worker if (!opcode)
2175*61046927SAndroid Build Coastguard Worker return;
2176*61046927SAndroid Build Coastguard Worker
2177*61046927SAndroid Build Coastguard Worker LockDisplay(dpy);
2178*61046927SAndroid Build Coastguard Worker GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32), req);
2179*61046927SAndroid Build Coastguard Worker req->reqType = opcode;
2180*61046927SAndroid Build Coastguard Worker req->glxCode = X_GLXVendorPrivate;
2181*61046927SAndroid Build Coastguard Worker req->vendorCode = X_GLXvop_ReleaseTexImageEXT;
2182*61046927SAndroid Build Coastguard Worker req->contextTag = gc->currentContextTag;
2183*61046927SAndroid Build Coastguard Worker
2184*61046927SAndroid Build Coastguard Worker drawable_ptr = (CARD32 *) (req + 1);
2185*61046927SAndroid Build Coastguard Worker buffer_ptr = (INT32 *) (drawable_ptr + 1);
2186*61046927SAndroid Build Coastguard Worker
2187*61046927SAndroid Build Coastguard Worker *drawable_ptr = drawable;
2188*61046927SAndroid Build Coastguard Worker *buffer_ptr = buffer;
2189*61046927SAndroid Build Coastguard Worker
2190*61046927SAndroid Build Coastguard Worker UnlockDisplay(dpy);
2191*61046927SAndroid Build Coastguard Worker SyncHandle();
2192*61046927SAndroid Build Coastguard Worker }
2193*61046927SAndroid Build Coastguard Worker
2194*61046927SAndroid Build Coastguard Worker /*@}*/
2195*61046927SAndroid Build Coastguard Worker
2196*61046927SAndroid Build Coastguard Worker #endif /* GLX_USE_APPLEGL */
2197*61046927SAndroid Build Coastguard Worker
2198*61046927SAndroid Build Coastguard Worker /*
2199*61046927SAndroid Build Coastguard Worker ** glXGetProcAddress support
2200*61046927SAndroid Build Coastguard Worker */
2201*61046927SAndroid Build Coastguard Worker
2202*61046927SAndroid Build Coastguard Worker struct name_address_pair
2203*61046927SAndroid Build Coastguard Worker {
2204*61046927SAndroid Build Coastguard Worker const char *Name;
2205*61046927SAndroid Build Coastguard Worker GLvoid *Address;
2206*61046927SAndroid Build Coastguard Worker };
2207*61046927SAndroid Build Coastguard Worker
2208*61046927SAndroid Build Coastguard Worker #define GLX_FUNCTION(f) { # f, (GLvoid *) f }
2209*61046927SAndroid Build Coastguard Worker #define GLX_FUNCTION2(n,f) { # n, (GLvoid *) f }
2210*61046927SAndroid Build Coastguard Worker
2211*61046927SAndroid Build Coastguard Worker static const struct name_address_pair GLX_functions[] = {
2212*61046927SAndroid Build Coastguard Worker /*** GLX_VERSION_1_0 ***/
2213*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXChooseVisual),
2214*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCopyContext),
2215*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreateContext),
2216*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreateGLXPixmap),
2217*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXDestroyContext),
2218*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXDestroyGLXPixmap),
2219*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetConfig),
2220*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetCurrentContext),
2221*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetCurrentDrawable),
2222*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXIsDirect),
2223*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXMakeCurrent),
2224*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryExtension),
2225*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryVersion),
2226*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXSwapBuffers),
2227*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXUseXFont),
2228*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXWaitGL),
2229*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXWaitX),
2230*61046927SAndroid Build Coastguard Worker
2231*61046927SAndroid Build Coastguard Worker /*** GLX_VERSION_1_1 ***/
2232*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetClientString),
2233*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryExtensionsString),
2234*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryServerString),
2235*61046927SAndroid Build Coastguard Worker
2236*61046927SAndroid Build Coastguard Worker /*** GLX_VERSION_1_2 ***/
2237*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetCurrentDisplay),
2238*61046927SAndroid Build Coastguard Worker
2239*61046927SAndroid Build Coastguard Worker /*** GLX_VERSION_1_3 ***/
2240*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXChooseFBConfig),
2241*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreateNewContext),
2242*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreatePbuffer),
2243*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreatePixmap),
2244*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreateWindow),
2245*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXDestroyPbuffer),
2246*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXDestroyPixmap),
2247*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXDestroyWindow),
2248*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetCurrentReadDrawable),
2249*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetFBConfigAttrib),
2250*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetFBConfigs),
2251*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetSelectedEvent),
2252*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetVisualFromFBConfig),
2253*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXMakeContextCurrent),
2254*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryContext),
2255*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryDrawable),
2256*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXSelectEvent),
2257*61046927SAndroid Build Coastguard Worker
2258*61046927SAndroid Build Coastguard Worker /*** GLX_SGIX_fbconfig ***/
2259*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXGetFBConfigAttribSGIX, glXGetFBConfigAttrib),
2260*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXChooseFBConfigSGIX, glXChooseFBConfig),
2261*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreateGLXPixmapWithConfigSGIX),
2262*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreateContextWithConfigSGIX),
2263*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXGetVisualFromFBConfigSGIX, glXGetVisualFromFBConfig),
2264*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetFBConfigFromVisualSGIX),
2265*61046927SAndroid Build Coastguard Worker
2266*61046927SAndroid Build Coastguard Worker /*** GLX_ARB_get_proc_address ***/
2267*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetProcAddressARB),
2268*61046927SAndroid Build Coastguard Worker
2269*61046927SAndroid Build Coastguard Worker /*** GLX 1.4 ***/
2270*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXGetProcAddress, glXGetProcAddressARB),
2271*61046927SAndroid Build Coastguard Worker
2272*61046927SAndroid Build Coastguard Worker #ifndef GLX_USE_APPLEGL
2273*61046927SAndroid Build Coastguard Worker /*** GLX_SGI_swap_control ***/
2274*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXSwapIntervalSGI),
2275*61046927SAndroid Build Coastguard Worker
2276*61046927SAndroid Build Coastguard Worker /*** GLX_SGI_video_sync ***/
2277*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetVideoSyncSGI),
2278*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXWaitVideoSyncSGI),
2279*61046927SAndroid Build Coastguard Worker
2280*61046927SAndroid Build Coastguard Worker /*** GLX_SGI_make_current_read ***/
2281*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXMakeCurrentReadSGI, glXMakeContextCurrent),
2282*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXGetCurrentReadDrawableSGI, glXGetCurrentReadDrawable),
2283*61046927SAndroid Build Coastguard Worker
2284*61046927SAndroid Build Coastguard Worker /*** GLX_EXT_import_context ***/
2285*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXFreeContextEXT),
2286*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetContextIDEXT),
2287*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXGetCurrentDisplayEXT, glXGetCurrentDisplay),
2288*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXImportContextEXT),
2289*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXQueryContextInfoEXT, glXQueryContext),
2290*61046927SAndroid Build Coastguard Worker
2291*61046927SAndroid Build Coastguard Worker /*** GLX_SGIX_pbuffer ***/
2292*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreateGLXPbufferSGIX),
2293*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXDestroyGLXPbufferSGIX),
2294*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryGLXPbufferSGIX),
2295*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXSelectEventSGIX),
2296*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetSelectedEventSGIX),
2297*61046927SAndroid Build Coastguard Worker
2298*61046927SAndroid Build Coastguard Worker /*** GLX_MESA_copy_sub_buffer ***/
2299*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCopySubBufferMESA),
2300*61046927SAndroid Build Coastguard Worker
2301*61046927SAndroid Build Coastguard Worker /*** GLX_MESA_swap_control ***/
2302*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXSwapIntervalMESA),
2303*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetSwapIntervalMESA),
2304*61046927SAndroid Build Coastguard Worker
2305*61046927SAndroid Build Coastguard Worker /*** GLX_OML_sync_control ***/
2306*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXWaitForSbcOML),
2307*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXWaitForMscOML),
2308*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXSwapBuffersMscOML),
2309*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetMscRateOML),
2310*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetSyncValuesOML),
2311*61046927SAndroid Build Coastguard Worker
2312*61046927SAndroid Build Coastguard Worker /*** GLX_EXT_texture_from_pixmap ***/
2313*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXBindTexImageEXT),
2314*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXReleaseTexImageEXT),
2315*61046927SAndroid Build Coastguard Worker
2316*61046927SAndroid Build Coastguard Worker /*** GLX_EXT_swap_control ***/
2317*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXSwapIntervalEXT),
2318*61046927SAndroid Build Coastguard Worker #endif
2319*61046927SAndroid Build Coastguard Worker
2320*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && defined(GLX_USE_DRM)
2321*61046927SAndroid Build Coastguard Worker /*** DRI configuration ***/
2322*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetScreenDriver),
2323*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXGetDriverConfig),
2324*61046927SAndroid Build Coastguard Worker #endif
2325*61046927SAndroid Build Coastguard Worker
2326*61046927SAndroid Build Coastguard Worker /*** GLX_ARB_create_context and GLX_ARB_create_context_profile ***/
2327*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXCreateContextAttribsARB),
2328*61046927SAndroid Build Coastguard Worker
2329*61046927SAndroid Build Coastguard Worker /*** GLX_MESA_query_renderer ***/
2330*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryRendererIntegerMESA),
2331*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryRendererStringMESA),
2332*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryCurrentRendererIntegerMESA),
2333*61046927SAndroid Build Coastguard Worker GLX_FUNCTION(glXQueryCurrentRendererStringMESA),
2334*61046927SAndroid Build Coastguard Worker
2335*61046927SAndroid Build Coastguard Worker /*** GLX_MESA_gl_interop ***/
2336*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2337*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXGLInteropQueryDeviceInfoMESA, MesaGLInteropGLXQueryDeviceInfo),
2338*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXGLInteropExportObjectMESA, MesaGLInteropGLXExportObject),
2339*61046927SAndroid Build Coastguard Worker GLX_FUNCTION2(glXGLInteropFlushObjectsMESA, MesaGLInteropGLXFlushObjects),
2340*61046927SAndroid Build Coastguard Worker #endif
2341*61046927SAndroid Build Coastguard Worker
2342*61046927SAndroid Build Coastguard Worker {NULL, NULL} /* end of list */
2343*61046927SAndroid Build Coastguard Worker };
2344*61046927SAndroid Build Coastguard Worker
2345*61046927SAndroid Build Coastguard Worker static const GLvoid *
get_glx_proc_address(const char * funcName)2346*61046927SAndroid Build Coastguard Worker get_glx_proc_address(const char *funcName)
2347*61046927SAndroid Build Coastguard Worker {
2348*61046927SAndroid Build Coastguard Worker GLuint i;
2349*61046927SAndroid Build Coastguard Worker
2350*61046927SAndroid Build Coastguard Worker /* try static functions */
2351*61046927SAndroid Build Coastguard Worker for (i = 0; GLX_functions[i].Name; i++) {
2352*61046927SAndroid Build Coastguard Worker if (strcmp(GLX_functions[i].Name, funcName) == 0)
2353*61046927SAndroid Build Coastguard Worker return GLX_functions[i].Address;
2354*61046927SAndroid Build Coastguard Worker }
2355*61046927SAndroid Build Coastguard Worker
2356*61046927SAndroid Build Coastguard Worker return NULL;
2357*61046927SAndroid Build Coastguard Worker }
2358*61046927SAndroid Build Coastguard Worker
2359*61046927SAndroid Build Coastguard Worker /**
2360*61046927SAndroid Build Coastguard Worker * Get the address of a named GL function. This is the pre-GLX 1.4 name for
2361*61046927SAndroid Build Coastguard Worker * \c glXGetProcAddress.
2362*61046927SAndroid Build Coastguard Worker *
2363*61046927SAndroid Build Coastguard Worker * \param procName Name of a GL or GLX function.
2364*61046927SAndroid Build Coastguard Worker * \returns A pointer to the named function
2365*61046927SAndroid Build Coastguard Worker *
2366*61046927SAndroid Build Coastguard Worker * \sa glXGetProcAddress
2367*61046927SAndroid Build Coastguard Worker */
glXGetProcAddressARB(const GLubyte * procName)2368*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC void (*glXGetProcAddressARB(const GLubyte * procName)) (void)
2369*61046927SAndroid Build Coastguard Worker {
2370*61046927SAndroid Build Coastguard Worker typedef void (*gl_function) (void);
2371*61046927SAndroid Build Coastguard Worker gl_function f = NULL;
2372*61046927SAndroid Build Coastguard Worker
2373*61046927SAndroid Build Coastguard Worker if (!strncmp((const char *) procName, "glX", 3))
2374*61046927SAndroid Build Coastguard Worker f = (gl_function) get_glx_proc_address((const char *) procName);
2375*61046927SAndroid Build Coastguard Worker
2376*61046927SAndroid Build Coastguard Worker if (f == NULL)
2377*61046927SAndroid Build Coastguard Worker f = (gl_function) _glapi_get_proc_address((const char *) procName);
2378*61046927SAndroid Build Coastguard Worker
2379*61046927SAndroid Build Coastguard Worker #ifdef GLX_USE_APPLEGL
2380*61046927SAndroid Build Coastguard Worker if (f == NULL)
2381*61046927SAndroid Build Coastguard Worker f = applegl_get_proc_address((const char *) procName);
2382*61046927SAndroid Build Coastguard Worker #endif
2383*61046927SAndroid Build Coastguard Worker
2384*61046927SAndroid Build Coastguard Worker return f;
2385*61046927SAndroid Build Coastguard Worker }
2386*61046927SAndroid Build Coastguard Worker
2387*61046927SAndroid Build Coastguard Worker /**
2388*61046927SAndroid Build Coastguard Worker * Get the address of a named GL function. This is the GLX 1.4 name for
2389*61046927SAndroid Build Coastguard Worker * \c glXGetProcAddressARB.
2390*61046927SAndroid Build Coastguard Worker *
2391*61046927SAndroid Build Coastguard Worker * \param procName Name of a GL or GLX function.
2392*61046927SAndroid Build Coastguard Worker * \returns A pointer to the named function
2393*61046927SAndroid Build Coastguard Worker *
2394*61046927SAndroid Build Coastguard Worker * \sa glXGetProcAddressARB
2395*61046927SAndroid Build Coastguard Worker */
2396*61046927SAndroid Build Coastguard Worker _GLX_PUBLIC
2397*61046927SAndroid Build Coastguard Worker GLX_ALIAS(__GLXextFuncPtr, glXGetProcAddress,
2398*61046927SAndroid Build Coastguard Worker (const GLubyte * procName),
2399*61046927SAndroid Build Coastguard Worker (procName), glXGetProcAddressARB)
2400*61046927SAndroid Build Coastguard Worker
2401*61046927SAndroid Build Coastguard Worker #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2402*61046927SAndroid Build Coastguard Worker
2403*61046927SAndroid Build Coastguard Worker PUBLIC int
MesaGLInteropGLXQueryDeviceInfo(Display * dpy,GLXContext context,struct mesa_glinterop_device_info * out)2404*61046927SAndroid Build Coastguard Worker MesaGLInteropGLXQueryDeviceInfo(Display *dpy, GLXContext context,
2405*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_device_info *out)
2406*61046927SAndroid Build Coastguard Worker {
2407*61046927SAndroid Build Coastguard Worker struct glx_context *gc = (struct glx_context*)context;
2408*61046927SAndroid Build Coastguard Worker int ret;
2409*61046927SAndroid Build Coastguard Worker
2410*61046927SAndroid Build Coastguard Worker __glXLock();
2411*61046927SAndroid Build Coastguard Worker
2412*61046927SAndroid Build Coastguard Worker if (!gc || gc->xid == None || !gc->isDirect) {
2413*61046927SAndroid Build Coastguard Worker __glXUnlock();
2414*61046927SAndroid Build Coastguard Worker return MESA_GLINTEROP_INVALID_CONTEXT;
2415*61046927SAndroid Build Coastguard Worker }
2416*61046927SAndroid Build Coastguard Worker
2417*61046927SAndroid Build Coastguard Worker ret = dri_interop_query_device_info(gc->driContext, out);
2418*61046927SAndroid Build Coastguard Worker __glXUnlock();
2419*61046927SAndroid Build Coastguard Worker return ret;
2420*61046927SAndroid Build Coastguard Worker }
2421*61046927SAndroid Build Coastguard Worker
2422*61046927SAndroid Build Coastguard Worker PUBLIC int
MesaGLInteropGLXExportObject(Display * dpy,GLXContext context,struct mesa_glinterop_export_in * in,struct mesa_glinterop_export_out * out)2423*61046927SAndroid Build Coastguard Worker MesaGLInteropGLXExportObject(Display *dpy, GLXContext context,
2424*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_export_in *in,
2425*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_export_out *out)
2426*61046927SAndroid Build Coastguard Worker {
2427*61046927SAndroid Build Coastguard Worker struct glx_context *gc = (struct glx_context*)context;
2428*61046927SAndroid Build Coastguard Worker int ret;
2429*61046927SAndroid Build Coastguard Worker
2430*61046927SAndroid Build Coastguard Worker __glXLock();
2431*61046927SAndroid Build Coastguard Worker
2432*61046927SAndroid Build Coastguard Worker if (!gc || gc->xid == None || !gc->isDirect) {
2433*61046927SAndroid Build Coastguard Worker __glXUnlock();
2434*61046927SAndroid Build Coastguard Worker return MESA_GLINTEROP_INVALID_CONTEXT;
2435*61046927SAndroid Build Coastguard Worker }
2436*61046927SAndroid Build Coastguard Worker
2437*61046927SAndroid Build Coastguard Worker ret = dri_interop_export_object(gc->driContext, in, out);
2438*61046927SAndroid Build Coastguard Worker __glXUnlock();
2439*61046927SAndroid Build Coastguard Worker return ret;
2440*61046927SAndroid Build Coastguard Worker }
2441*61046927SAndroid Build Coastguard Worker
2442*61046927SAndroid Build Coastguard Worker PUBLIC int
MesaGLInteropGLXFlushObjects(Display * dpy,GLXContext context,unsigned count,struct mesa_glinterop_export_in * resources,struct mesa_glinterop_flush_out * out)2443*61046927SAndroid Build Coastguard Worker MesaGLInteropGLXFlushObjects(Display *dpy, GLXContext context,
2444*61046927SAndroid Build Coastguard Worker unsigned count,
2445*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_export_in *resources,
2446*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_flush_out *out)
2447*61046927SAndroid Build Coastguard Worker {
2448*61046927SAndroid Build Coastguard Worker struct glx_context *gc = (struct glx_context*)context;
2449*61046927SAndroid Build Coastguard Worker int ret;
2450*61046927SAndroid Build Coastguard Worker
2451*61046927SAndroid Build Coastguard Worker __glXLock();
2452*61046927SAndroid Build Coastguard Worker
2453*61046927SAndroid Build Coastguard Worker if (!gc || gc->xid == None || !gc->isDirect) {
2454*61046927SAndroid Build Coastguard Worker __glXUnlock();
2455*61046927SAndroid Build Coastguard Worker return MESA_GLINTEROP_INVALID_CONTEXT;
2456*61046927SAndroid Build Coastguard Worker }
2457*61046927SAndroid Build Coastguard Worker
2458*61046927SAndroid Build Coastguard Worker ret = dri_interop_flush_objects(gc->driContext, count, resources, out);
2459*61046927SAndroid Build Coastguard Worker __glXUnlock();
2460*61046927SAndroid Build Coastguard Worker return ret;
2461*61046927SAndroid Build Coastguard Worker }
2462*61046927SAndroid Build Coastguard Worker
2463*61046927SAndroid Build Coastguard Worker #endif /* defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) */
2464