xref: /aosp_15_r20/external/mesa3d/src/glx/glxcmds.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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