glxcmds.c revision c356f5867f2c1fad7155df538b9affa8dbdcf869
1cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson *
5dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Permission is hereby granted, free of charge, to any person obtaining a
6dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * copy of this software and associated documentation files (the "Software"),
7dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * to deal in the Software without restriction, including without limitation
8dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * and/or sell copies of the Software, and to permit persons to whom the
10dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Software is furnished to do so, subject to the following conditions:
11dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson *
12dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * The above copyright notice including the dates of first publication and
13dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * either this permission notice or a reference to
14dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * http://oss.sgi.com/projects/FreeB/
15dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * shall be included in all copies or substantial portions of the Software.
16dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson *
17dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * SOFTWARE.
24dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson *
25dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Except as contained in this notice, the name of Silicon Graphics, Inc.
26dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * shall not be used in advertising or otherwise to promote the sale, use or
27dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * other dealings in this Software without prior written authorization from
28dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Silicon Graphics, Inc.
29dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson */
30cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
31cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
32cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \file glxcmds.c
33cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Client-side GLX interface.
34cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
35cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
36cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "glxclient.h"
37cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "glapi.h"
38cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "glxextensions.h"
39df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis
40df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#ifdef GLX_DIRECT_RENDERING
41ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
42ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx_context.h"
43ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx.h"
44ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "glx_error.h"
4580b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#define GC_IS_DIRECT(gc) ((gc)->isDirect)
46ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
47cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <sys/time.h>
48df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#include <X11/extensions/xf86vmode.h>
49df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#include "xf86dri.h"
502b4e009ed56b69b243f5cc88f490dcf8166cf729Ian Romanick#define GC_IS_DIRECT(gc) ((gc)->driContext != NULL)
5180b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#endif
522b4e009ed56b69b243f5cc88f490dcf8166cf729Ian Romanick#else
532b4e009ed56b69b243f5cc88f490dcf8166cf729Ian Romanick#define GC_IS_DIRECT(gc) (0)
54df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#endif
55cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
569c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#if defined(USE_XCB)
579c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#include <X11/Xlib-xcb.h>
589c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#include <xcb/xcb.h>
599c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#include <xcb/glx.h>
609c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#endif
619c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf
6226d2ce0a09f1aac628519cf3473fcabd3f149446Ian Romanickstatic const char __glXGLXClientVendorName[] = "Mesa Project and SGI";
63cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic const char __glXGLXClientVersion[] = "1.4";
6431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsbergstatic const struct glx_context_vtable indirect_context_vtable;
654a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
6680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
674a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
684a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsbergstatic Bool windowExistsFlag;
690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
700896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófwindowExistsErrorHandler(Display * dpy, XErrorEvent * xerr)
714a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg{
7226b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick   (void) dpy;
7326b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (xerr->error_code == BadWindow) {
750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      windowExistsFlag = GL_FALSE;
760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return 0;
784a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg}
794a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
804a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg/**
814a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg * Find drawables in the local hash that have been destroyed on the
824a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg * server.
830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
844a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg * \param dpy    Display to destroy drawables for
854a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg * \param screen Screen number to destroy drawables for
864a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg */
87c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg_X_HIDDEN void
8866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian HøgsbergGarbageCollectDRIDrawables(struct glx_screen * sc)
890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XID draw;
910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIdrawable *pdraw;
92c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = sc->display;
930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XWindowAttributes xwa;
940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int (*oldXErrorHandler) (Display *, XErrorEvent *);
950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Set no-op error handler so Xlib doesn't bail out if the windows
970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * has alreay been destroyed on the server. */
98e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg   XSync(priv->dpy, GL_FALSE);
990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   oldXErrorHandler = XSetErrorHandler(windowExistsErrorHandler);
1000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
101e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg   if (__glxHashFirst(priv->drawHash, &draw, (void *) &pdraw) == 1) {
1020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      do {
1030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         windowExistsFlag = GL_TRUE;
104e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg         XGetWindowAttributes(priv->dpy, draw, &xwa); /* dummy request */
1050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (!windowExistsFlag) {
1060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            /* Destroy the local drawable data, if the drawable no
1070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               longer exists in the Xserver */
1080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            (*pdraw->destroyDrawable) (pdraw);
109e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg            __glxHashDelete(priv->drawHash, draw);
1100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
111e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg      } while (__glxHashNext(priv->drawHash, &draw, (void *) &pdraw) == 1);
1120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
114e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg   XSync(priv->dpy, GL_FALSE);
1150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XSetErrorHandler(oldXErrorHandler);
1160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf}
1170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
118cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
119cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the __DRIdrawable for the drawable associated with a GLXContext
1200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
121cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy       The display associated with \c drawable.
122cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param drawable  GLXDrawable whose __DRIdrawable part is to be retrieved.
1234a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg * \param scrn_num  If non-NULL, the drawables screen is stored there
124cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns  A pointer to the context's __DRIdrawable on success, or NULL if
125cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *           the drawable is not associated with a direct-rendering context.
126cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
127e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg_X_HIDDEN __GLXDRIdrawable *
128eeaab2047cfce8a7445fd9f835e737682eb503acKristian HøgsbergGetGLXDRIDrawable(Display * dpy, GLXDrawable drawable)
129cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
130c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = __glXInitialize(dpy);
1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIdrawable *pdraw;
132cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (priv == NULL)
1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
135e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
136eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   if (__glxHashLookup(priv->drawHash, drawable, (void *) &pdraw) == 0)
137e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg      return pdraw;
138cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return NULL;
140cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1414a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
143cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
144cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the GLX per-screen data structure associated with a GLX context.
1470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
148cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy   Display for which the GLX per-screen information is to be
149cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *              retrieved.
150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param scrn  Screen on \c dpy for which the GLX per-screen information is
151cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *              to be retrieved.
152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns A pointer to the GLX per-screen data if \c dpy and \c scrn
153cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          specify a valid GLX screen, or NULL otherwise.
1540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \todo Should this function validate that \c scrn is within the screen
156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       number range for \c dpy?
157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
158cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergstatic struct glx_screen *
1600896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGetGLXScreenConfigs(Display * dpy, int scrn)
161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
162c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *const priv = __glXInitialize(dpy);
163cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return (priv
16566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg           && priv->screens !=
16666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg           NULL) ? priv->screens[scrn] : NULL;
167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
168cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
169cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
170cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int
171c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergGetGLXPrivScreenConfig(Display * dpy, int scrn, struct glx_display ** ppriv,
17266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg                       struct glx_screen ** ppsc)
173cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Initialize the extension, if needed .  This has the added value
1750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * of initializing/allocating the display private
1760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
177cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (dpy == NULL) {
1790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_NO_EXTENSION;
1800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
181cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *ppriv = __glXInitialize(dpy);
1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (*ppriv == NULL) {
1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_NO_EXTENSION;
1850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
186cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Check screen number to see if its valid */
1880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((scrn < 0) || (scrn >= ScreenCount(dpy))) {
1890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_SCREEN;
1900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
191cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Check to see if the GL is supported on this screen */
19366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   *ppsc = (*ppriv)->screens[scrn];
1940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((*ppsc)->configs == NULL) {
1950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* No support for GL on this screen regardless of visual */
1960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_VISUAL;
1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return Success;
200cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
201cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
202cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
203cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
204cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine if a \c GLXFBConfig supplied by the application is valid.
205cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
206cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy     Application supplied \c Display pointer.
207cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param config  Application supplied \c GLXFBConfig.
208cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
209cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns If the \c GLXFBConfig is valid, the a pointer to the matching
2106ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg *          \c struct glx_config structure is returned.  Otherwise, \c NULL
211cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          is returned.
212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
2136ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic struct glx_config *
2146ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergValidateGLXFBConfig(Display * dpy, GLXFBConfig fbconfig)
2150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
216c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *const priv = __glXInitialize(dpy);
2176ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   int num_screens = ScreenCount(dpy);
2180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   unsigned i;
2196ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
2200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (priv != NULL) {
2220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      for (i = 0; i < num_screens; i++) {
22366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg	 for (config = priv->screens[i]->configs; config != NULL;
2246ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	      config = config->next) {
2256ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	    if (config == (struct glx_config *) fbconfig) {
2266ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	       return config;
2276ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	    }
2286ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 }
2290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
2300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
23177c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
2320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return NULL;
233cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
234cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2356ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg#ifdef GLX_USE_APPLEGL
2366ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
2376ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsbergstatic const struct glx_context_vtable applegl_context_vtable;
2386ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
239c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic struct glx_context *
24066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergapplegl_create_context(struct glx_screen *psc,
2416ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg		       struct glx_config *mode,
242c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg		       struct glx_context *shareList, int renderType)
2436ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg{
244c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc;
2456ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   int errorcode;
2466ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   bool x11error;
2476ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
2486ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   /* TODO: Integrate this with apple_glx_create_context and make
249c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg    * struct apple_glx_context inherit from struct glx_context. */
2506ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
2516ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc = Xmalloc(sizeof *gc);
2526ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (pcp == NULL)
2536ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
2546ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
2556ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   memset(gc, 0, sizeof *gc);
2566ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (!glx_context_init(&gc->base, &psc->base, mode)) {
2576ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      Xfree(gc);
2586ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
2596ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   }
2606ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
2616ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc->vtable = &applegl_context_vtable;
2626ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc->driContext = NULL;
2636ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc->do_destroy = False;
2646ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
2656ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   /* TODO: darwin: Integrate with above to do indirect */
2666ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if(apple_glx_create_context(&gc->driContext, dpy, screen, fbconfig,
2676ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg			       shareList ? shareList->driContext : NULL,
2686ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg			       &errorcode, &x11error)) {
2696ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      __glXSendError(dpy, errorcode, 0, X_GLXCreateContext, x11error);
2706ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      gc->vtable->destroy(gc);
2716ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
2726ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   }
2736ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
2746ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc->currentContextTag = -1;
2756ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc->mode = fbconfig;
2766ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc->isDirect = allowDirect;
2776ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc->xid = 1; /* Just something not None, so we know when to destroy
2786ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg		 * it in MakeContextCurrent. */
2796ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
2806ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   return gc;
2816ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg}
2826ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg#endif
2836ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
284cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
286cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \todo It should be possible to move the allocate of \c client_state_private
287cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * later in the function for direct-rendering contexts.  Direct-rendering
288cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * contexts don't need to track client state, so they don't need that memory
289cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * at all.
2900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
291cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \todo Eliminate \c __glXInitVertexArrayState.  Replace it with a new
292cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * function called \c __glXAllocateClientState that allocates the memory and
293cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * does all the initialization (including the pixel pack / unpack).
294cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
295c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergstatic struct glx_context *
29666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergindirect_create_context(struct glx_screen *psc,
2976ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			struct glx_config *mode,
298c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg			struct glx_context *shareList, int renderType)
2990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
300c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc;
3010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int bufSize;
3020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
3030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXattribute *state;
3040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3056ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   opcode = __glXSetupForCommand(psc->dpy);
3060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
3070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
3080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Allocate our context record */
311c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   gc = Xmalloc(sizeof *gc);
3120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!gc) {
3130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Out of memory */
3140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
3150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
316c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   memset(gc, 0, sizeof *gc);
3170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3186ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   glx_context_init(gc, psc, mode);
3196ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc->isDirect = GL_FALSE;
32031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->vtable = &indirect_context_vtable;
3210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   state = Xmalloc(sizeof(struct __GLXattributeRec));
3220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (state == NULL) {
3230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Out of memory */
3240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      Xfree(gc);
3250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
3260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->client_state_private = state;
3280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   memset(gc->client_state_private, 0, sizeof(struct __GLXattributeRec));
3290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   state->NoDrawArraysProtocol = (getenv("LIBGL_NO_DRAWARRAYS") != NULL);
3300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
332cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Create a temporary buffer to hold GLX rendering commands.  The size
333cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** of the buffer is selected so that the maximum number of GLX rendering
334cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** commands can fit in a single X packet and still have room in the X
335cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** packet for the GLXRenderReq header.
336cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
337cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3386ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   bufSize = (XMaxRequestSize(psc->dpy) * 4) - sz_xGLXRenderReq;
3390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->buf = (GLubyte *) Xmalloc(bufSize);
3400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!gc->buf) {
3410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      Xfree(gc->client_state_private);
3420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      Xfree(gc);
3430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
3440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->bufSize = bufSize;
346cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Fill in the new context */
3480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->renderMode = GL_RENDER;
349cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   state->storePack.alignment = 4;
3510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   state->storeUnpack.alignment = 4;
352cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->attributes.stackPointer = &gc->attributes.stack[0];
354cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
356cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** PERFORMANCE NOTE: A mode dependent fill image can speed things up.
357cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Other code uses the fastImageUnpack bit, but it is never set
358cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** to GL_TRUE.
359cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
3600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->fastImageUnpack = GL_FALSE;
3610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->fillImage = __glFillImage;
3620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->pc = gc->buf;
3630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->bufEnd = gc->buf + bufSize;
3640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->isDirect = GL_FALSE;
3650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (__glXDebug) {
3660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /*
3670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       ** Set limit register so that there will be one command per packet
3680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       */
3690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      gc->limit = gc->buf;
3700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
3720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      gc->limit = gc->buf + bufSize - __GLX_BUFFER_LIMIT_SIZE;
3730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->majorOpcode = opcode;
3750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
3760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
377cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Constrain the maximum drawing command size allowed to be
378cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** transfered using the X_GLXRender protocol request.  First
379cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** constrain by a software limit, then constrain by the protocl
380cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** limit.
381cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
3820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (bufSize > __GLX_RENDER_CMD_SIZE_LIMIT) {
3830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      bufSize = __GLX_RENDER_CMD_SIZE_LIMIT;
3840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (bufSize > __GLX_MAX_RENDER_CMD_SIZE) {
3860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      bufSize = __GLX_MAX_RENDER_CMD_SIZE;
3870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc->maxSmallRenderCommandSize = bufSize;
389ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
390ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
3910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc;
392cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
393cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3946ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsbergstruct glx_screen_vtable indirect_screen_vtable = {
3956ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   indirect_create_context
3966ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg};
3976ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
39866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg_X_HIDDEN struct glx_screen *
399c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergindirect_create_screen(int screen, struct glx_display * priv)
4006ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg{
40166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
4026ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
4036ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   psc = Xmalloc(sizeof *psc);
4046ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (psc == NULL)
4056ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
4066ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
4076ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   memset(psc, 0, sizeof *psc);
4086ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   glx_screen_init(psc, screen, priv);
4096ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   psc->vtable = &indirect_screen_vtable;
4106ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
4116ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   return psc;
4126ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg}
4136ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
4146ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
41531819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg_X_HIDDEN Bool
416c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergglx_context_init(struct glx_context *gc,
41766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg		 struct glx_screen *psc, struct glx_config *config)
41831819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg{
41931819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->majorOpcode = __glXSetupForCommand(psc->display->dpy);
42031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   if (!gc->majorOpcode)
42131819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg      return GL_FALSE;
42231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg
42331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->screen = psc->scr;
42431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->psc = psc;
4256ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   gc->config = config;
42631819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->isDirect = GL_TRUE;
42731819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg
42831819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   return GL_TRUE;
42931819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg}
43031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg
431cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
432cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
433cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Create a new context.  Exactly one of \c vis and \c fbconfig should be
434cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * non-NULL.
4350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
436cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param use_glx_1_3  For FBConfigs, should GLX 1.3 protocol or
437cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     SGIX_fbconfig protocol be used?
438cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param renderType   For FBConfigs, what is the rendering type?
439cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
440cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
441cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic GLXContext
442d46d30f997c1718217545947ca4d80ec7d18e684Ian RomanickCreateContext(Display * dpy, int generic_id,
4436ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg              struct glx_config *config,
444c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg              GLXContext shareList_user,
4452243029eeec9e31b92079ff0e8fafdc0315053d6Ian Romanick              Bool allowDirect,
4467bcfb66000557a0ef32bdc6b31949a92f95a9ff6Ian Romanick	      unsigned code, int renderType, int screen)
447cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
448c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = NULL;
44966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *const psc = GetGLXScreenConfigs(dpy, screen);
450c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *shareList = (struct glx_context *) shareList_user;
4510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (dpy == NULL)
4520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
453cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
454d46d30f997c1718217545947ca4d80ec7d18e684Ian Romanick   if (generic_id == None)
4550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
456cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4576ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc = NULL;
4586ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (allowDirect && psc->vtable->create_context)
4596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      gc = psc->vtable->create_context(psc, config, shareList, renderType);
46031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   if (!gc)
4616ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      gc = indirect_create_context(psc, config, shareList, renderType);
46231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   if (!gc)
46331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg      return NULL;
464643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
465bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   LockDisplay(dpy);
466bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   switch (code) {
467bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   case X_GLXCreateContext: {
468bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      xGLXCreateContextReq *req;
469bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick
470bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      /* Send the glXCreateContext request */
471bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      GetReq(GLXCreateContext, req);
472bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->reqType = gc->majorOpcode;
473bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->glxCode = X_GLXCreateContext;
474bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->context = gc->xid = XAllocID(dpy);
475d46d30f997c1718217545947ca4d80ec7d18e684Ian Romanick      req->visual = generic_id;
476c3db1d621e1f7c73006ed76855d31b1034bc3aefIan Romanick      req->screen = screen;
477bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->shareList = shareList ? shareList->xid : None;
478bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->isDirect = GC_IS_DIRECT(gc);
479bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      break;
480bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   }
481cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
482bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   case X_GLXCreateNewContext: {
483bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      xGLXCreateNewContextReq *req;
484bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick
485bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      /* Send the glXCreateNewContext request */
486bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      GetReq(GLXCreateNewContext, req);
487bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->reqType = gc->majorOpcode;
488bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->glxCode = X_GLXCreateNewContext;
489bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->context = gc->xid = XAllocID(dpy);
490d46d30f997c1718217545947ca4d80ec7d18e684Ian Romanick      req->fbconfig = generic_id;
491c3db1d621e1f7c73006ed76855d31b1034bc3aefIan Romanick      req->screen = screen;
492bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->renderType = renderType;
493bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->shareList = shareList ? shareList->xid : None;
494bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->isDirect = GC_IS_DIRECT(gc);
495bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      break;
4960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4978bffadbc83d19ecd8be8f0107d51463e36477666Ian Romanick
498bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   case X_GLXvop_CreateContextWithConfigSGIX: {
499bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      xGLXVendorPrivateWithReplyReq *vpreq;
500bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      xGLXCreateContextWithConfigSGIXReq *req;
501bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick
502bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      /* Send the glXCreateNewContext request */
503bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      GetReqExtra(GLXVendorPrivateWithReply,
504bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick		  sz_xGLXCreateContextWithConfigSGIXReq -
505bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick		  sz_xGLXVendorPrivateWithReplyReq, vpreq);
506bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req = (xGLXCreateContextWithConfigSGIXReq *) vpreq;
507bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->reqType = gc->majorOpcode;
508bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->glxCode = X_GLXVendorPrivateWithReply;
509bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->vendorCode = X_GLXvop_CreateContextWithConfigSGIX;
510bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->context = gc->xid = XAllocID(dpy);
511d46d30f997c1718217545947ca4d80ec7d18e684Ian Romanick      req->fbconfig = generic_id;
512c3db1d621e1f7c73006ed76855d31b1034bc3aefIan Romanick      req->screen = screen;
513bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->renderType = renderType;
514bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->shareList = shareList ? shareList->xid : None;
515bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->isDirect = GC_IS_DIRECT(gc);
516bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      break;
517bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   }
5188bffadbc83d19ecd8be8f0107d51463e36477666Ian Romanick
519bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   default:
520bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      /* What to do here?  This case is the sign of an internal error.  It
521bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick       * should never be reachable.
522bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick       */
523bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      break;
5240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
525cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
526bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   UnlockDisplay(dpy);
527bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   SyncHandle();
528cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
529bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   gc->imported = GL_FALSE;
530521e4b9b7e3c79e7362f7cbd594a2e8cf74cdfe4Brian Paul   gc->renderType = renderType;
531521e4b9b7e3c79e7362f7cbd594a2e8cf74cdfe4Brian Paul
532c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   return (GLXContext) gc;
533cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
534cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
53538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
5360896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateContext(Display * dpy, XVisualInfo * vis,
5370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                 GLXContext shareList, Bool allowDirect)
538cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
5396ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = NULL;
54052cf8db428909156b062f17a9e6251a38178dec3Ian Romanick   int renderType = 0;
54152cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
542ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#if defined(GLX_DIRECT_RENDERING) || defined(GLX_USE_APPLEGL)
54366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *const psc = GetGLXScreenConfigs(dpy, vis->screen);
54452cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
5456ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   config = glx_config_find_visual(psc->visuals, vis->visualid);
5466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if (config == NULL) {
54752cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      xError error;
54852cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
54952cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.errorCode = BadValue;
55052cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.resourceID = vis->visualid;
55152cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.sequenceNumber = dpy->request;
55252cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.type = X_Error;
55352cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.majorCode = __glXSetupForCommand(dpy);
55452cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.minorCode = X_GLXCreateContext;
55552cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      _XError(dpy, &error);
55652cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      return None;
55752cf8db428909156b062f17a9e6251a38178dec3Ian Romanick   }
55852cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
5596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   renderType = config->rgbMode ? GLX_RGBA_TYPE : GLX_COLOR_INDEX_TYPE;
56052cf8db428909156b062f17a9e6251a38178dec3Ian Romanick#endif
56152cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
5626ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return CreateContext(dpy, vis->visualid, config, shareList, allowDirect,
56352cf8db428909156b062f17a9e6251a38178dec3Ian Romanick                        X_GLXCreateContext, renderType, vis->screen);
564cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
565cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
5660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN void
567c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsbergglx_send_destroy_context(Display *dpy, XID xid)
568cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
569c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   CARD8 opcode = __glXSetupForCommand(dpy);
570c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   xGLXDestroyContextReq *req;
571c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
572c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   LockDisplay(dpy);
573c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   GetReq(GLXDestroyContext, req);
574c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->reqType = opcode;
575c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->glxCode = X_GLXDestroyContext;
576c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->context = xid;
577c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   UnlockDisplay(dpy);
578c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   SyncHandle();
579c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg}
580c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
581c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsbergstatic void
582c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergindirect_destroy_context(struct glx_context *gc)
583c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg{
584d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg   if (!gc->imported && gc->xid)
585c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg      glx_send_destroy_context(gc->psc->dpy, gc->xid);
586c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
587c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   __glXFreeVertexArrayState(gc);
588c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
5890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gc->vendor)
5900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      XFree((char *) gc->vendor);
5910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gc->renderer)
5920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      XFree((char *) gc->renderer);
5930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gc->version)
5940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      XFree((char *) gc->version);
5950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gc->extensions)
5960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      XFree((char *) gc->extensions);
5970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glFreeAttributeState(gc);
5980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XFree((char *) gc->buf);
5990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree((char *) gc->client_state_private);
6000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XFree((char *) gc);
601cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
602cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
603cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
604cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Destroy the named context
605cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
6060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
607c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergDestroyContext(Display * dpy, GLXContext ctx)
608cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
609c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = (struct glx_context *) ctx;
610c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
611c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   if (!gc)
6120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
613cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXLock();
6155e6a6a2719c695996490bde491dac267e52f78afBrian Paul   if (gc->currentDpy) {
6165e6a6a2719c695996490bde491dac267e52f78afBrian Paul      /* This context is bound to some thread.  According to the man page,
6175e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * we should not actually delete the context until it's unbound.
6185e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * Note that we set gc->xid = None above.  In MakeContextCurrent()
6195e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * we check for that and delete the context there.
6205e6a6a2719c695996490bde491dac267e52f78afBrian Paul       */
621d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg      if (!gc->imported)
622d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg	 glx_send_destroy_context(dpy, gc->xid);
623c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg      gc->xid = None;
6245e6a6a2719c695996490bde491dac267e52f78afBrian Paul      __glXUnlock();
6255e6a6a2719c695996490bde491dac267e52f78afBrian Paul      return;
6265e6a6a2719c695996490bde491dac267e52f78afBrian Paul   }
627c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   __glXUnlock();
6285e6a6a2719c695996490bde491dac267e52f78afBrian Paul
629c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   if (gc->vtable->destroy)
630c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg      gc->vtable->destroy(gc);
631cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
632489ccef3982267b0d35c8548921f58d553c25a3aAdam Jackson
63338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
6340896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXDestroyContext(Display * dpy, GLXContext gc)
635cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
6360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   DestroyContext(dpy, gc);
637cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
638cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
639cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
640cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return the major and minor version #s for the GLX extension
641cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
64238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Bool
6430896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryVersion(Display * dpy, int *major, int *minor)
644cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
645c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
646cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Init the extension.  This fetches the major and minor version. */
6480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   priv = __glXInitialize(dpy);
6490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!priv)
6500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_FALSE;
651cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (major)
6530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *major = priv->majorVersion;
6540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (minor)
6550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *minor = priv->minorVersion;
6560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return GL_TRUE;
657cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
658cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
659cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
660cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Query the existance of the GLX extension
661cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
66238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Bool
6630896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryExtension(Display * dpy, int *errorBase, int *eventBase)
6640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
6650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int major_op, erb, evb;
6660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Bool rv;
6670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
6680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   rv = XQueryExtension(dpy, GLX_EXTENSION_NAME, &major_op, &evb, &erb);
6690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (rv) {
6700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (errorBase)
6710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *errorBase = erb;
6720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (eventBase)
6730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *eventBase = evb;
6740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
6750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return rv;
676cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
677cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6787b7845a076c933e096ac511b4184141ba194449aKristian Høgsbergstatic void
679c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergindirect_wait_gl(struct glx_context *gc)
680cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
6810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXWaitGLReq *req;
6820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Display *dpy = gc->currentDpy;
683cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Flush any pending commands out */
6850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXFlushRenderBuffer(gc, gc->pc);
686cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXWaitGL request */
6880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
6890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXWaitGL, req);
6900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = gc->majorOpcode;
6910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXWaitGL;
6920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = gc->currentContextTag;
6930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
6940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
695cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
696cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
697cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
6987b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg** Put a barrier in the token stream that forces the GL to finish its
6997b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg** work before X can proceed.
700cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
70138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
7027b7845a076c933e096ac511b4184141ba194449aKristian HøgsbergglXWaitGL(void)
703cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
704c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
705cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
7067b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   if (gc && gc->vtable->use_x_font)
7077b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg      gc->vtable->wait_gl(gc);
7087b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg}
7097b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
7107b7845a076c933e096ac511b4184141ba194449aKristian Høgsbergstatic void
711c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergindirect_wait_x(struct glx_context *gc)
7127b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg{
7137b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   xGLXWaitXReq *req;
7147b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   Display *dpy = gc->currentDpy;
715cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
7160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Flush any pending commands out */
7170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXFlushRenderBuffer(gc, gc->pc);
718cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
7190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
7200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXWaitX, req);
7210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = gc->majorOpcode;
7220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXWaitX;
7230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = gc->currentContextTag;
7240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
7250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
726cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
727cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
7287b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg/*
7297b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg** Put a barrier in the token stream that forces X to finish its
7307b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg** work before GL can proceed.
7317b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg*/
73238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
7337b7845a076c933e096ac511b4184141ba194449aKristian HøgsbergglXWaitX(void)
734cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
735c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
736cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
7377b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   if (gc && gc->vtable->use_x_font)
7387b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg      gc->vtable->wait_x(gc);
7397b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg}
7407b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
7417b7845a076c933e096ac511b4184141ba194449aKristian Høgsbergstatic void
742c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergindirect_use_x_font(struct glx_context *gc,
7437b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg		    Font font, int first, int count, int listBase)
7447b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg{
7457b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   xGLXUseXFontReq *req;
7467b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   Display *dpy = gc->currentDpy;
747cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
7480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Flush any pending commands out */
7497b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   __glXFlushRenderBuffer(gc, gc->pc);
750cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
7510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXUseFont request */
7520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
7530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXUseXFont, req);
7540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = gc->majorOpcode;
7550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXUseXFont;
7560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = gc->currentContextTag;
7570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->font = font;
7580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->first = first;
7590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->count = count;
7600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->listBase = listBase;
7610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
7620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
7637b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg}
7647b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
7657b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg#ifdef GLX_USE_APPLEGL
7667b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
7677b7845a076c933e096ac511b4184141ba194449aKristian Høgsbergstatic void
768c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergapplegl_destroy_context(struct glx_context *gc)
769c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg{
770c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   apple_glx_destroy_context(&gc->driContext, gc->currentDpy);
771c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg}
772c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
773c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsbergstatic void
774c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergapplegl_wait_gl(struct glx_context *gc)
7757b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg{
7767b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   glFinish();
7777b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg}
7787b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
7797b7845a076c933e096ac511b4184141ba194449aKristian Høgsbergstatic void
780c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergapplegl_wait_x(struct glx_context *gc)
7817b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg{
7827b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   apple_glx_waitx(gc->dpy, gc->driContext);
7837b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg}
7847b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
7857b7845a076c933e096ac511b4184141ba194449aKristian Høgsbergstatic const struct glx_context_vtable applegl_context_vtable = {
786c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   applegl_destroy_context,
7877b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   applegl_wait_gl,
7887b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   applegl_wait_x,
7897b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   DRI_glXUseXFont,
7907b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   NULL, /* bind_tex_image, */
7917b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   NULL, /* release_tex_image, */
7927b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg};
7937b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
7947b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg#endif
7957b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
79638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
7977b7845a076c933e096ac511b4184141ba194449aKristian HøgsbergglXUseXFont(Font font, int first, int count, int listBase)
7987b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg{
799c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
8007b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
8017b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   if (gc && gc->vtable->use_x_font)
8027b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg      gc->vtable->use_x_font(gc, font, first, count, listBase);
803cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
804cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
805cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/
806cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
807cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
808cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Copy the source context to the destination context using the
809cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** attribute "mask".
810cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
81138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
812c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergglXCopyContext(Display * dpy, GLXContext source_user,
813c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg	       GLXContext dest_user, unsigned long mask)
814cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
815c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *source = (struct glx_context *) source_user;
816c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *dest = (struct glx_context *) dest_user;
817ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
818c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
819ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   int errorcode;
820ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   bool x11error;
821ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
82280b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston   if(apple_glx_copy_context(gc->driContext, source->driContext, dest->driContext,
823ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                             mask, &errorcode, &x11error)) {
824ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      __glXSendError(dpy, errorcode, 0, X_GLXCopyContext, x11error);
825ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
826ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
827ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
8280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXCopyContextReq *req;
829c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
8300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContextTag tag;
8310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
832cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
8340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
8350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
8360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
837cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
83880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
8390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gc->driContext) {
8400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* NOT_DONE: This does not work yet */
8410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
842cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
843cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
845cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** If the source is the current context, send its tag so that the context
846cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** can be flushed before the copy.
847cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
8480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (source == gc && dpy == gc->currentDpy) {
8490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = gc->currentContextTag;
8500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
8520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = 0;
8530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXCopyContext request */
8560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
8570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXCopyContext, req);
8580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
8590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXCopyContext;
8600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->source = source ? source->xid : None;
8610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dest = dest ? dest->xid : None;
8620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->mask = mask;
8630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = tag;
8640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
8650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
866ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
867cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
868cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
869cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
870cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
871cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine if a context uses direct rendering.
872cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
873cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy        Display where the context was created.
874cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param contextID  ID of the context to be tested.
875cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
876cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns \c GL_TRUE if the context is direct rendering or not.
877cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
8780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
8790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXIsDirect(Display * dpy, GLXContextID contextID)
880cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
8819c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#if !defined(USE_XCB)
8820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXIsDirectReq *req;
8830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXIsDirectReply reply;
8849c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#endif
8850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
886cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
8880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
8890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_FALSE;
8900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
891cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8929c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#ifdef USE_XCB
8930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_connection_t *c = XGetXCBConnection(dpy);
8940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_glx_is_direct_reply_t *reply = xcb_glx_is_direct_reply(c,
8950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                              xcb_glx_is_direct
8960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                              (c, contextID),
8970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                              NULL);
8989c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf
8999c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf   const Bool is_direct = reply->is_direct ? True : False;
9009c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf   free(reply);
9019c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf
9029c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf   return is_direct;
9039c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#else
9040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXIsDirect request */
9050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
9060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXIsDirect, req);
9070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
9080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXIsDirect;
9090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->context = contextID;
9100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReply(dpy, (xReply *) & reply, 0, False);
9110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
9120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
9130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return reply.isDirect;
9159c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#endif /* USE_XCB */
916cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
917cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
918c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick/**
919c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * \todo
920c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * Shouldn't this function \b always return \c GL_FALSE when
921c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * \c GLX_DIRECT_RENDERING is not defined?  Do we really need to bother with
922c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * the GLX protocol here at all?
923c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick */
92438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Bool
925c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergglXIsDirect(Display * dpy, GLXContext gc_user)
926cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
927c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = (struct glx_context *) gc_user;
928c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
9290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!gc) {
9300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_FALSE;
9310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
9322b4e009ed56b69b243f5cc88f490dcf8166cf729Ian Romanick   else if (GC_IS_DIRECT(gc)) {
9330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_TRUE;
9340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
935a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#ifdef GLX_USE_APPLEGL  /* TODO: indirect on darwin */
936a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston      return GL_FALSE;
937a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#else
9380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return __glXIsDirect(dpy, gc->xid);
939a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#endif
940cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
941cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
94238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
9430896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap)
944cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
945ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
946ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   int screen = vis->screen;
94766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *const psc = GetGLXScreenConfigs(dpy, screen);
9486ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   const struct glx_config *config;
949ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
9506ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   config = _gl_context_modes_find_visual(psc->visuals, vis->visualid);
951ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
9526ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if(apple_glx_pixmap_create(dpy, vis->screen, pixmap, config))
953ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return None;
954ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
955ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return pixmap;
956ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
9570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXCreateGLXPixmapReq *req;
9580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXPixmap xid;
9590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
960cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
9610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
9620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
9630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
9640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
965cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
9660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXCreateGLXPixmap request */
9670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
9680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXCreateGLXPixmap, req);
9690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
9700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXCreateGLXPixmap;
9710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->screen = vis->screen;
9720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->visual = vis->visualid;
9730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->pixmap = pixmap;
9740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxpixmap = xid = XAllocID(dpy);
9750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
9760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
977edb117879846155632aaeb66483a3085c7a78815Michel Dänzer
97880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
9799053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer   do {
9809053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      /* FIXME: Maybe delay __DRIdrawable creation until the drawable
9819053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer       * is actually bound to a context... */
9829053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
983c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg      struct glx_display *const priv = __glXInitialize(dpy);
9849053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      __GLXDRIdrawable *pdraw;
98566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
9866ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      struct glx_config *config;
9879053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
98866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      psc = priv->screens[vis->screen];
9899053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      if (psc->driScreen == NULL)
9909053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         break;
9916ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config = glx_config_find_visual(psc->visuals, vis->visualid);
9926ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      pdraw = psc->driScreen->createDrawable(psc, pixmap, req->glxpixmap, config);
9939053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      if (pdraw == NULL) {
9949053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         fprintf(stderr, "failed to create pixmap\n");
9959053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         break;
9969053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      }
9979053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
998e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg      if (__glxHashInsert(priv->drawHash, req->glxpixmap, pdraw)) {
9999053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         (*pdraw->destroyDrawable) (pdraw);
10009053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         return None;           /* FIXME: Check what we're supposed to do here... */
10019053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      }
10029053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer   } while (0);
1003edb117879846155632aaeb66483a3085c7a78815Michel Dänzer#endif
1004edb117879846155632aaeb66483a3085c7a78815Michel Dänzer
10050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return xid;
1006ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1007cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1008cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1009cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1010cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Destroy the named pixmap
1011cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
101238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
10130896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXDestroyGLXPixmap(Display * dpy, GLXPixmap glxpixmap)
10140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
1015ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
1016ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if(apple_glx_pixmap_destroy(dpy, glxpixmap))
1017ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      __glXSendError(dpy, GLXBadPixmap, glxpixmap, X_GLXDestroyPixmap, false);
1018ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
10190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXDestroyGLXPixmapReq *req;
10200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
10210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
10230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
10240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
10250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
10260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXDestroyGLXPixmap request */
10280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
10290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXDestroyGLXPixmap, req);
10300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
10310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXDestroyGLXPixmap;
10320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxpixmap = glxpixmap;
10330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
10340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
10359dfce365c7f35ddea6d81b7f595ddcd6d35382a5Michel Dänzer
103680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
10370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {
1038c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg      struct glx_display *const priv = __glXInitialize(dpy);
1039eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, glxpixmap);
10400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (pdraw != NULL) {
10420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (*pdraw->destroyDrawable) (pdraw);
1043e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg         __glxHashDelete(priv->drawHash, glxpixmap);
10440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
10450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
10469dfce365c7f35ddea6d81b7f595ddcd6d35382a5Michel Dänzer#endif
1047ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
104877c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg}
104977c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
105038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
10510896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXSwapBuffers(Display * dpy, GLXDrawable drawable)
105277c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg{
1053ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
1054ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   GLXContext gc = glXGetCurrentContext();
105580b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston   if(gc && apple_glx_is_current_drawable(dpy, gc->driContext, drawable)) {
105680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston      apple_glx_swap_buffers(gc->driContext);
1057ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   } else {
1058ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      __glXSendError(dpy, GLXBadCurrentWindow, 0, X_GLXSwapBuffers, false);
1059ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
1060ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
1061c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc;
10620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContextTag tag;
10630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
1064b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#ifdef USE_XCB
10650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_connection_t *c;
1066b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#else
10670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXSwapBuffersReq *req;
1068b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#endif
1069b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul
107080b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
1071eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
1072cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (pdraw != NULL) {
10740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      glFlush();
1075daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      (*pdraw->psc->driScreen->swapBuffers)(pdraw, 0, 0, 0);
10760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
10770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1078cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
1079cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
10810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
10820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
10830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1084cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1086cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** The calling thread may or may not have a current context.  If it
1087cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** does, send the context tag so the server can do a flush.
1088cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
10890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc = __glXGetCurrentContext();
10900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((gc != NULL) && (dpy == gc->currentDpy) &&
10910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       ((drawable == gc->currentDrawable)
10920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        || (drawable == gc->currentReadable))) {
10930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = gc->currentContextTag;
10940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
10950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
10960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = 0;
10970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
109877c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
1099ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#ifdef USE_XCB
11000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   c = XGetXCBConnection(dpy);
11010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_glx_swap_buffers(c, tag, drawable);
11020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_flush(c);
1103ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#else
11040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXSwapBuffers request */
11050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
11060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXSwapBuffers, req);
11070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
11080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXSwapBuffers;
11090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->drawable = drawable;
11100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = tag;
11110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
11120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
11130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XFlush(dpy);
1114ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#endif /* USE_XCB */
1115ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
1116cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1117cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1118cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1119cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1120cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return configuration information for the given display, screen and
1121cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** visual combination.
1122cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
112338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
11240896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetConfig(Display * dpy, XVisualInfo * vis, int attribute,
11250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf             int *value_return)
11260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
1127c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
112866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
11296ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
11300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int status;
11310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   status = GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc);
11330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (status == Success) {
11346ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config = glx_config_find_visual(psc->visuals, vis->visualid);
11350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Lookup attribute after first finding a match on the visual */
11376ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (config != NULL) {
11386ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 return glx_config_get(config, attribute, value_return);
11390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
11400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      status = GLX_BAD_VISUAL;
11420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
11430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** If we can't find the config for this visual, this visual is not
1146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** supported by the OpenGL implementation on the server.
1147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
11480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((status == GLX_BAD_VISUAL) && (attribute == GLX_USE_GL)) {
11490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *value_return = GL_FALSE;
11500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      status = Success;
11510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return status;
1154cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/
1157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1158cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void
11596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberginit_fbconfig_for_chooser(struct glx_config * config,
11600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                          GLboolean fbconfig_style_tags)
11610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
11626ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   memset(config, 0, sizeof(struct glx_config));
11630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualID = (XID) GLX_DONT_CARE;
11640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualType = GLX_DONT_CARE;
11650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* glXChooseFBConfig specifies different defaults for these two than
11670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * glXChooseVisual.
11680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (fbconfig_style_tags) {
11700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      config->rgbMode = GL_TRUE;
11710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      config->doubleBufferMode = GLX_DONT_CARE;
11720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
11730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualRating = GLX_DONT_CARE;
11750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentPixel = GLX_NONE;
11760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentRed = GLX_DONT_CARE;
11770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentGreen = GLX_DONT_CARE;
11780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentBlue = GLX_DONT_CARE;
11790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentAlpha = GLX_DONT_CARE;
11800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentIndex = GLX_DONT_CARE;
11810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->drawableType = GLX_WINDOW_BIT;
11830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->renderType =
11840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
11850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->xRenderable = GLX_DONT_CARE;
11860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->fbconfigID = (GLXFBConfigID) (GLX_DONT_CARE);
11870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->swapMethod = GLX_DONT_CARE;
11890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf}
11900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_DONT_CARE( param )        \
11920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                  \
119371a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick    if ( ((int) a-> param != (int) GLX_DONT_CARE)   \
11940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         && (a-> param != b-> param) ) {        \
11950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
11960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
11970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
11980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_MINIMUM( param )                  \
12000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
120171a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick    if ( ((int) a-> param != (int) GLX_DONT_CARE)	\
12020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         && (a-> param > b-> param) ) {         \
12030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
12040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
12050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
12060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_EXACT( param )                    \
12080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
12090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( a-> param != b-> param) {              \
12100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
12110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
12120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
1213cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1214edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg/* Test that all bits from a are contained in b */
1215edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg#define MATCH_MASK(param)			\
1216edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg  do {						\
1217edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg    if ((a->param & ~b->param) != 0)		\
1218edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg      return False;				\
1219edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg  } while (0);
1220edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg
1221cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
1222cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine if two GLXFBConfigs are compatible.
1223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
1224cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param a  Application specified config to test.
1225cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param b  Server specified config to test against \c a.
1226cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1227cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic Bool
12286ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergfbconfigs_compatible(const struct glx_config * const a,
12296ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                     const struct glx_config * const b)
12300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
12310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(doubleBufferMode);
12320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(visualType);
12330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(visualRating);
12340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(xRenderable);
12350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(fbconfigID);
12360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(swapMethod);
12370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(rgbBits);
12390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(numAuxBuffers);
12400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(redBits);
12410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(greenBits);
12420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(blueBits);
12430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(alphaBits);
12440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(depthBits);
12450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(stencilBits);
12460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumRedBits);
12470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumGreenBits);
12480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumBlueBits);
12490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumAlphaBits);
12500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(sampleBuffers);
12510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferWidth);
12520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferHeight);
12530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferPixels);
12540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(samples);
12550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(stereoMode);
12570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_EXACT(level);
12580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1259edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg   MATCH_MASK(drawableType);
1260edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg   MATCH_MASK(renderType);
12610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* There is a bug in a few of the XFree86 DDX drivers.  They contain
12630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * visuals with a "transparent type" of 0 when they really mean GLX_NONE.
12640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * Technically speaking, it is a bug in the DDX driver, but there is
12650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * enough of an installed base to work around the problem here.  In any
12660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * case, 0 is not a valid value of the transparent type, so we'll treat 0
12670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * from the app as GLX_DONT_CARE. We'll consider GLX_NONE from the app and
12680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * 0 from the server to be a match to maintain backward compatibility with
12690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * the (broken) drivers.
12700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
12710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
127271a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick   if (a->transparentPixel != (int) GLX_DONT_CARE && a->transparentPixel != 0) {
12730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (a->transparentPixel == GLX_NONE) {
12740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (b->transparentPixel != GLX_NONE && b->transparentPixel != 0)
12750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            return False;
12760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
12770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {
12780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_EXACT(transparentPixel);
12790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
12800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      switch (a->transparentPixel) {
12820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case GLX_TRANSPARENT_RGB:
12830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentRed);
12840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentGreen);
12850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentBlue);
12860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentAlpha);
12870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
12880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case GLX_TRANSPARENT_INDEX:
12900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentIndex);
12910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
12920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      default:
12940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
12950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
12960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
12970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return True;
1299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1301cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1302cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* There's some trickly language in the GLX spec about how this is supposed
1303cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * to work.  Basically, if a given component size is either not specified
1304cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * or the requested size is zero, it is supposed to act like PERFER_SMALLER.
1305cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Well, that's really hard to do with the code as-is.  This behavior is
1306cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * closer to correct, but still not technically right.
1307cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
13080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_LARGER_OR_ZERO(comp)             \
13090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
13100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
13110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if ( ((*a)-> comp) == 0 ) {               \
13120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return -1;                              \
13130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
13140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else if ( ((*b)-> comp) == 0 ) {          \
13150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return 1;                               \
13160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
13170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {                                    \
13180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return ((*b)-> comp) - ((*a)-> comp) ;  \
13190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
13200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
13210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
13220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_LARGER(comp)                     \
13240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
13250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
13260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return ((*b)-> comp) - ((*a)-> comp) ;    \
13270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
13280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
13290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_SMALLER(comp)                    \
13310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
13320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
13330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return ((*a)-> comp) - ((*b)-> comp) ;    \
13340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
13350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
1336cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1337cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
1338cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Compare two GLXFBConfigs.  This function is intended to be used as the
1339cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * compare function passed in to qsort.
13400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1341cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns If \c a is a "better" config, according to the specification of
1342cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          SGIX_fbconfig, a number less than zero is returned.  If \c b is
1343cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          better, then a number greater than zero is return.  If both are
1344cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          equal, zero is returned.
1345cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa qsort, glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
1346cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1347cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int
13486ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergfbconfig_compare(struct glx_config **a, struct glx_config **b)
1349cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
13500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* The order of these comparisons must NOT change.  It is defined by
13510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * the GLX 1.3 spec and ARB_multisample.
13520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
1353cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualSelectGroup);
1355cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* The sort order for the visualRating is GLX_NONE, GLX_SLOW, and
13570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * GLX_NON_CONFORMANT_CONFIG.  It just so happens that this is the
13580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * numerical sort order of the enums (0x8000, 0x8001, and 0x800D).
13590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
13600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualRating);
1361cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This isn't quite right.  It is supposed to compare the sum of the
13630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * components the user specifically set minimums for.
13640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
13650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(redBits);
13660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(greenBits);
13670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(blueBits);
13680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(alphaBits);
1369cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(rgbBits);
1371cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (((*a)->doubleBufferMode != (*b)->doubleBufferMode)) {
13730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Prefer single-buffer.
13740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       */
13750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (!(*a)->doubleBufferMode) ? -1 : 1;
13760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1377cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(numAuxBuffers);
1379cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(depthBits);
13810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(stencilBits);
1382cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This isn't quite right.  It is supposed to compare the sum of the
13840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * components the user specifically set minimums for.
13850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
13860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumRedBits);
13870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumGreenBits);
13880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumBlueBits);
13890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumAlphaBits);
1390cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualType);
1392cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* None of the multisample specs say where this comparison should happen,
13940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * so I put it near the end.
13950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
13960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(sampleBuffers);
13970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(samples);
1398cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* None of the pbuffer or fbconfig specs say that this comparison needs
14000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * to happen at all, but it seems like it should.
14010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
14020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferWidth);
14030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferHeight);
14040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferPixels);
1405cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
14060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return 0;
1407cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1408cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1409cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
1411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Selects and sorts a subset of the supplied configs based on the attributes.
1412cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function forms to basis of \c glXChooseVisual, \c glXChooseFBConfig,
1413cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * and \c glXChooseFBConfigSGIX.
14140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1415cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param configs   Array of pointers to possible configs.  The elements of
1416cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  this array that do not meet the criteria will be set to
1417cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  NULL.  The remaining elements will be sorted according to
1418cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  the various visual / FBConfig selection rules.
1419cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param num_configs  Number of elements in the \c configs array.
1420cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param attribList   Attributes used select from \c configs.  This array is
1421cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     terminated by a \c None tag.  The array can either take
1422cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     the form expected by \c glXChooseVisual (where boolean
1423cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     tags do not have a value) or by \c glXChooseFBConfig
1424cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     (where every tag has a value).
1425cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param fbconfig_style_tags  Selects whether \c attribList is in
1426cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                             \c glXChooseVisual style or
1427cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                             \c glXChooseFBConfig style.
1428cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns The number of valid elements left in \c configs.
14290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1430cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
1431cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1432cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int
14336ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergchoose_visual(struct glx_config ** configs, int num_configs,
14340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf              const int *attribList, GLboolean fbconfig_style_tags)
14350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
14366ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config test_config;
14370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int base;
14380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
14390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This is a fairly direct implementation of the selection method
14410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * described by GLX_SGIX_fbconfig.  Start by culling out all the
14420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * configs that are not compatible with the selected parameter
14430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * list.
14440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
14450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   init_fbconfig_for_chooser(&test_config, fbconfig_style_tags);
14470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXInitializeVisualConfigFromTags(&test_config, 512,
14480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       (const INT32 *) attribList,
14490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       GL_TRUE, fbconfig_style_tags);
14500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   base = 0;
14520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < num_configs; i++) {
14530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (fbconfigs_compatible(&test_config, configs[i])) {
14540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         configs[base] = configs[i];
14550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         base++;
14560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
14570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
14580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (base == 0) {
14600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
14610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
14620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (base < num_configs) {
14640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      (void) memset(&configs[base], 0, sizeof(void *) * (num_configs - base));
14650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
14660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* After the incompatible configs are removed, the resulting
14680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * list is sorted according to the rules set out in the various
14690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * specifications.
14700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
14710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14726ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   qsort(configs, base, sizeof(struct glx_config *),
14730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (int (*)(const void *, const void *)) fbconfig_compare);
14740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return base;
1475cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1476cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1477cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1478cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1479cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1480cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1481cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return the visual that best matches the template.  Return None if no
1482cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** visual matches the template.
1483cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
148438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT XVisualInfo *
14850896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXChooseVisual(Display * dpy, int screen, int *attribList)
1486cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
14870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XVisualInfo *visualList = NULL;
1488c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
148966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
14906ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config test_config;
14916ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
14926ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *best_config = NULL;
1493cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
14940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1495cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Get a list of all visuals, return if list is empty
1496cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
14970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
14980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
14990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1500cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
15020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1503cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Build a template from the defaults and the attribute list
1504cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Free visual list and return if an unexpected token is encountered
1505cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
15060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   init_fbconfig_for_chooser(&test_config, GL_FALSE);
15070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXInitializeVisualConfigFromTags(&test_config, 512,
15080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       (const INT32 *) attribList,
15090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       GL_TRUE, GL_FALSE);
1510cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1512cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Eliminate visuals that don't meet minimum requirements
1513cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Compute a score for those that do
1514cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Remember which visual, if any, got the highest score
151546b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** If no visual is acceptable, return None
151646b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** Otherwise, create an XVisualInfo list with just the selected X visual
151746b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** and return this.
1518cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
15196ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   for (config = psc->visuals; config != NULL; config = config->next) {
15206ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (fbconfigs_compatible(&test_config, config)
15216ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg          && ((best_config == NULL) ||
15226ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg              (fbconfig_compare (&config, &best_config) < 0))) {
15230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XVisualInfo visualTemplate;
15240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XVisualInfo *newList;
15250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         int i;
15260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
15270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         visualTemplate.screen = screen;
15286ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         visualTemplate.visualid = config->visualID;
15290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         newList = XGetVisualInfo(dpy, VisualScreenMask | VisualIDMask,
15300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                  &visualTemplate, &i);
15310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
15320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (newList) {
15330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            Xfree(visualList);
15340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            visualList = newList;
15356ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg            best_config = config;
15360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
15370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
15380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
153977c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
1540ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
1541ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if(visualList && getenv("LIBGL_DUMP_VISUALID")) {
1542ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      printf("visualid 0x%lx\n", visualList[0].visualid);
1543ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
1544ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1545ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
15460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return visualList;
1547cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1548cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1549cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
155038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
15510896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryExtensionsString(Display * dpy, int screen)
1552cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
155366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1554c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
1555cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
15570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
15580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1559cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!psc->effectiveGLXexts) {
15610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!psc->serverGLXexts) {
15620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         psc->serverGLXexts =
15630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            __glXQueryServerString(dpy, priv->majorOpcode, screen,
15640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   GLX_EXTENSIONS);
15650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1566cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __glXCalculateUsableExtensions(psc,
156880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
15690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     (psc->driScreen != NULL),
1570cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
15710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     GL_FALSE,
1572cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
15730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     priv->minorVersion);
15740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1575cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return psc->effectiveGLXexts;
1577cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1578cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
157938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
15800896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetClientString(Display * dpy, int name)
1581cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
158226b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick   (void) dpy;
158326b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
15840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (name) {
15850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VENDOR:
15860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGLXClientVendorName);
15870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VERSION:
15880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGLXClientVersion);
15890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_EXTENSIONS:
15900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGetClientExtensions());
15910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
15920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
15930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1594cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1595cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
159638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
15970896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryServerString(Display * dpy, int screen, int name)
1598cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
159966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1600c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
16010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   const char **str;
1602cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1603cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
16050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
16060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1607cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (name) {
16090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VENDOR:
16100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &priv->serverGLXvendor;
16110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
16120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VERSION:
16130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &priv->serverGLXversion;
16140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
16150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_EXTENSIONS:
16160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &psc->serverGLXexts;
16170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
16180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
16190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
16200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1621cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (*str == NULL) {
16230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *str = __glXQueryServerString(dpy, priv->majorOpcode, screen, name);
16240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
16250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
16260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return *str;
1627cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1628cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófvoid
16300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXClientInfo(Display * dpy, int opcode)
1631cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
16320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   char *ext_str = __glXGetClientGLExtensionString();
16330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int size = strlen(ext_str) + 1;
163466db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf
163566db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#ifdef USE_XCB
163666db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf   xcb_connection_t *c = XGetXCBConnection(dpy);
163766db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf   xcb_glx_client_info(c,
16380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       GLX_MAJOR_VERSION, GLX_MINOR_VERSION, size, ext_str);
163966db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#else
16400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXClientInfoReq *req;
16410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
16420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXClientInfo request */
16430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
16440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXClientInfo, req);
16450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
16460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXClientInfo;
16470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->major = GLX_MAJOR_VERSION;
16480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->minor = GLX_MINOR_VERSION;
16490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
16500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->length += (size + 3) >> 2;
16510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->numbytes = size;
16520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Data(dpy, ext_str, size);
16530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
16540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
16550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
165666db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#endif /* USE_XCB */
165766db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf
16580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(ext_str);
1659cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1660cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1661cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1662cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1663cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** EXT_import_context
1664cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
1665cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
166638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Display *
16670896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetCurrentDisplay(void)
1668cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1669c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
16700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (NULL == gc)
16710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
16720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc->currentDpy;
1673cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1674cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
167538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
16760896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(Display *, glXGetCurrentDisplayEXT, (void), (),
16770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          glXGetCurrentDisplay)
1678cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1679ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
168038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
16816ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian HøgsbergglXImportContextEXT(Display *dpy, GLXContextID contextID)
16820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
1683c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = __glXInitialize(dpy);
168466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
16850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXQueryContextReply reply;
16860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
1687c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx;
16886ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   int propList[__GLX_MAX_CONTEXT_PROPS * 2], *pProp, nPropListBytes;
16896ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   int i, renderType;
16906ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   XID share;
16916ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *mode;
16926ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
16936ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (contextID == None || __glXIsDirect(dpy, contextID))
16946ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
16950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
16960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
16976ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (!opcode)
16980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
16990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXQueryContextInfoEXT request */
17010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
17020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17036ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (priv->majorVersion > 1 || priv->minorVersion >= 3) {
17040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXQueryContextReq *req;
17050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReq(GLXQueryContext, req);
17070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
17090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXQueryContext;
17106ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      req->context = contextID;
17110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
17120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
17130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXVendorPrivateReq *vpreq;
17140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXQueryContextInfoEXTReq *req;
17150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReqExtra(GLXVendorPrivate,
17176ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg		  sz_xGLXQueryContextInfoEXTReq - sz_xGLXVendorPrivateReq,
17186ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg		  vpreq);
17190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req = (xGLXQueryContextInfoEXTReq *) vpreq;
17200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
17210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXVendorPrivateWithReply;
17220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->vendorCode = X_GLXvop_QueryContextInfoEXT;
17236ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      req->context = contextID;
17240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
17250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReply(dpy, (xReply *) & reply, 0, False);
17270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17286ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (reply.n <= __GLX_MAX_CONTEXT_PROPS)
17296ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      nPropListBytes = reply.n * 2 * sizeof propList[0];
17306ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   else
17316ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      nPropListBytes = 0;
17326ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   _XRead(dpy, (char *) propList, nPropListBytes);
17330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
17340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
17356ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
17366ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   /* Look up screen first so we can look up visuals/fbconfigs later */
17376ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   psc = NULL;
17386ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   for (i = 0, pProp = propList; i < reply.n; i++, pProp += 2)
17396ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      if (pProp[0] == GLX_SCREEN)
17406ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 psc = GetGLXScreenConfigs(dpy, pProp[1]);
17416ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (psc == NULL)
17426ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
17436ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
17446ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   share = None;
17456ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   mode = NULL;
17466ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   renderType = 0;
17476ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   pProp = propList;
17486ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
17496ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   for (i = 0, pProp = propList; i < reply.n; i++, pProp += 2)
17506ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      switch (pProp[0]) {
17516ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_SHARE_CONTEXT_EXT:
17526ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 share = pProp[1];
17536ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
17546ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_VISUAL_ID_EXT:
17556ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 mode = glx_config_find_visual(psc->visuals, pProp[1]);
17566ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
17576ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_FBCONFIG_ID:
17586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 mode = glx_config_find_fbconfig(psc->configs, pProp[1]);
17596ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
17606ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_RENDER_TYPE:
17616ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 renderType = pProp[1];
17626ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
17636ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      }
17646ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
17656ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (mode == NULL)
17666ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
17676ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
17686ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx = indirect_create_context(psc, mode, NULL, renderType);
17696ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (ctx == NULL)
17706ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
17716ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
17726ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->xid = contextID;
17736ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->imported = GL_TRUE;
17746ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->share_xid = share;
17756ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
1776c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   return (GLXContext) ctx;
1777cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1778cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1779ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1780ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
178138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
1782c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergglXQueryContext(Display * dpy, GLXContext ctx_user, int attribute, int *value)
1783cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1784c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx = (struct glx_context *) ctx_user;
1785c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
17860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (attribute) {
1787ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GLX_SHARE_CONTEXT_EXT:
17886ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->share_xid;
17890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
17900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VISUAL_ID_EXT:
17916ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      *value = ctx->config ? ctx->config->visualID : None;
17920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
17930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_SCREEN:
17946ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->screen;
17950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
17960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_FBCONFIG_ID:
17976ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      *value = ctx->config ? ctx->config->fbconfigID : None;
17980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
17990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_RENDER_TYPE:
18006ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->renderType;
18010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
18020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
18030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_ATTRIBUTE;
18040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
18050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return Success;
1806cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1807cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
180838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
18090896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(int, glXQueryContextInfoEXT,
18100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (Display * dpy, GLXContext ctx, int attribute, int *value),
18110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (dpy, ctx, attribute, value), glXQueryContext)
1812cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1813c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg_X_EXPORT GLXContextID glXGetContextIDEXT(const GLXContext ctx_user)
1814cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1815c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx = (struct glx_context *) ctx_user;
1816c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
18170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return ctx->xid;
1818cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1819cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
182038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
18210896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXFreeContextEXT(Display * dpy, GLXContext ctx)
1822cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
18230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   DestroyContext(dpy, ctx);
1824cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1825cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1826cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
182738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfig *
18280896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXChooseFBConfig(Display * dpy, int screen,
18290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  const int *attribList, int *nitems)
1830cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
18316ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config **config_list;
18320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int list_size;
1833cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1834cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18356ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   config_list = (struct glx_config **)
18360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      glXGetFBConfigs(dpy, screen, &list_size);
1837cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((config_list != NULL) && (list_size > 0) && (attribList != NULL)) {
18390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      list_size = choose_visual(config_list, list_size, attribList, GL_TRUE);
18400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (list_size == 0) {
18410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XFree(config_list);
18420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         config_list = NULL;
18430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
18440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1845cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *nitems = list_size;
18470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return (GLXFBConfig *) config_list;
1848cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1849cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1850cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
185138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
18526ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXCreateNewContext(Display * dpy, GLXFBConfig fbconfig,
18530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                    int renderType, GLXContext shareList, Bool allowDirect)
1854cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
18556ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
18567bcfb66000557a0ef32bdc6b31949a92f95a9ff6Ian Romanick
18576ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return CreateContext(dpy, config->fbconfigID, config, shareList,
18586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			allowDirect, X_GLXCreateNewContext, renderType,
18596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			config->screen);
1860cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1861cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1862cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
186338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXDrawable
18640896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetCurrentReadDrawable(void)
1865cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1866c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1867c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
18680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc->currentReadable;
1869cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1870cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1871cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
187238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfig *
18730896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetFBConfigs(Display * dpy, int screen, int *nelements)
1874cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1875c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = __glXInitialize(dpy);
18766ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config **config_list = NULL;
18776ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
18786ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   unsigned num_configs = 0;
18790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
1880cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *nelements = 0;
188266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   if (priv && (priv->screens != NULL)
18830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && (screen >= 0) && (screen <= ScreenCount(dpy))
188466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg       && (priv->screens[screen]->configs != NULL)
188566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg       && (priv->screens[screen]->configs->fbconfigID
188671a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick	   != (int) GLX_DONT_CARE)) {
1887cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
188866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      for (config = priv->screens[screen]->configs; config != NULL;
18896ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg           config = config->next) {
18906ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         if (config->fbconfigID != (int) GLX_DONT_CARE) {
18910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            num_configs++;
18920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
18930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1894cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18956ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config_list = Xmalloc(num_configs * sizeof *config_list);
18966ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (config_list != NULL) {
18970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *nelements = num_configs;
18980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         i = 0;
189966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg         for (config = priv->screens[screen]->configs; config != NULL;
19006ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg              config = config->next) {
19016ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg            if (config->fbconfigID != (int) GLX_DONT_CARE) {
19026ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg               config_list[i] = config;
19030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               i++;
19040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            }
19050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
19060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
19070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
19086ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg
19096ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return (GLXFBConfig *) config_list;
1910cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1911cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1912cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
191338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
19146ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXGetFBConfigAttrib(Display * dpy, GLXFBConfig fbconfig,
19150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                     int attribute, int *value)
1916cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
19176ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = ValidateGLXFBConfig(dpy, fbconfig);
19186ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg
19196ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if (config == NULL)
19206ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      return GLXBadFBConfig;
1921cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19226ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return glx_config_get(config, attribute, value);
1923cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1924cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1925cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
192638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT XVisualInfo *
19276ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXGetVisualFromFBConfig(Display * dpy, GLXFBConfig fbconfig)
1928cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
19290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XVisualInfo visualTemplate;
19306ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
19310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int count;
1932cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1934cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Get a list of all visuals, return if list is empty
1935cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
19366ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   visualTemplate.visualid = config->visualID;
19370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return XGetVisualInfo(dpy, VisualIDMask, &visualTemplate, &count);
1938cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1939cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1940ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
1941cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1942cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGI_swap_control
1943cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
19440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
19450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapIntervalSGI(int interval)
1946cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1947cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   xGLXVendorPrivateReq *req;
1948c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
194966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
19500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Display *dpy;
19510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *interval_ptr;
1952cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   CARD8 opcode;
1953cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gc == NULL) {
1955cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return GLX_BAD_CONTEXT;
1956cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
19570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
19580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (interval <= 0) {
1959cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return GLX_BAD_VALUE;
1960cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
1961cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1962efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
1963efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
196416f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
1965efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   if (gc->driContext && psc->driScreen && psc->driScreen->setSwapInterval) {
1966eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg      __GLXDRIdrawable *pdraw =
1967eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	 GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1968efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc->driScreen->setSwapInterval(pdraw, interval);
1969efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      return 0;
1970efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
197116f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
1972efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1973cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   dpy = gc->currentDpy;
1974cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   opcode = __glXSetupForCommand(dpy);
1975cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   if (!opcode) {
1976cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return 0;
1977cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
1978cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1979cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* Send the glXSwapIntervalSGI request */
1980cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   LockDisplay(dpy);
19810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(GLXVendorPrivate, sizeof(CARD32), req);
1982cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->reqType = opcode;
1983cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->glxCode = X_GLXVendorPrivate;
1984cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->vendorCode = X_GLXvop_SwapIntervalSGI;
1985cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->contextTag = gc->currentContextTag;
1986cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1987a70d56485a2d0f15ee5b660e8931eb8657535e2dIan Romanick   interval_ptr = (CARD32 *) (req + 1);
1988cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   *interval_ptr = interval;
1989cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1990cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   UnlockDisplay(dpy);
1991cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   SyncHandle();
1992cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   XFlush(dpy);
1993cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1994cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
1995cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1996cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1997cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1998cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1999cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_MESA_swap_control
2000cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
20010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
20020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapIntervalMESA(unsigned int interval)
2003cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2004089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#ifdef GLX_DIRECT_RENDERING
2005c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
2006cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2007efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   if (gc != NULL && gc->driContext) {
200866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
2009efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
2010efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
2011efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      if (psc->driScreen && psc->driScreen->setSwapInterval) {
2012eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg         __GLXDRIdrawable *pdraw =
2013eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	    GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
2014089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	 return psc->driScreen->setSwapInterval(pdraw, interval);
2015efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      }
2016efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
201716f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
2018efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
2019cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
2020cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2021841a823d6ded26585aaecbc69a937b1ece8fccb2Brian Paul
20220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
20230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
20240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetSwapIntervalMESA(void)
2025cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2026089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#ifdef GLX_DIRECT_RENDERING
2027c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
2028cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2029020c64b2cf2973b5cb41e233d2bfbd85f1b699f7Kristian Høgsberg   if (gc != NULL && gc->driContext) {
203066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
2031efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
2032efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
2033efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      if (psc->driScreen && psc->driScreen->getSwapInterval) {
2034eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg         __GLXDRIdrawable *pdraw =
2035eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	    GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
2036efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes	 return psc->driScreen->getSwapInterval(pdraw);
2037efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      }
2038efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
203967776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2040cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2041cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
2042cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2043cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2044cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2045cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2046cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGI_video_sync
2047cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
20480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
20490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetVideoSyncSGI(unsigned int *count)
2050cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2051daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int64_t ust, msc, sbc;
2052daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int ret;
2053c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
205466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
205567776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2056daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
205767776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2058daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
205916f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee   if (!gc)
2060daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return GLX_BAD_CONTEXT;
2061daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
206216f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
206316f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee   if (!gc->driContext)
206416f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return GLX_BAD_CONTEXT;
206516f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
206616f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
2067daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   psc = GetGLXScreenConfigs(gc->currentDpy, gc->screen);
206867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2069eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
207067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2071daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2072cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* FIXME: Looking at the GLX_SGI_video_sync spec in the extension registry,
2073cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * FIXME: there should be a GLX encoding for this call.  I can find no
2074cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * FIXME: documentation for the GLX encoding.
2075cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
207667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2077daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->getDrawableMSC) {
2078daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->getDrawableMSC(psc, pdraw, &ust, &msc, &sbc);
2079daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      *count = (unsigned) msc;
2080daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (ret == True) ? 0 : GLX_BAD_CONTEXT;
2081daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
208267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2083daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2084cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
2085cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2086cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
20880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
2089cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2090c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
209166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
209267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2093daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
209467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2095daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int64_t ust, msc, sbc;
2096daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int ret;
2097cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor <= 0 || remainder < 0)
20990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_VALUE;
2100cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
210116f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee   if (!gc)
2102daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return GLX_BAD_CONTEXT;
2103daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
210416f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
210516f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee   if (!gc->driContext)
210616f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return GLX_BAD_CONTEXT;
210716f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
210816f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
2109daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
211067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2111eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
211267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2113daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
211467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2115daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->waitForMSC) {
2116daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForMSC(pdraw, 0, divisor, remainder, &ust, &msc,
2117daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes				       &sbc);
2118daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      *count = (unsigned) msc;
2119daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (ret == True) ? 0 : GLX_BAD_CONTEXT;
2120daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
212167776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2122daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2123cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
2124cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2125cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2126ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
2127cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2128cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2129cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_fbconfig
2130cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Many of these functions are aliased to GLX 1.3 entry points in the
2131cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_functions table.
2132cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
2133cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
213438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
21350896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(int, glXGetFBConfigAttribSGIX,
21360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (Display * dpy, GLXFBConfigSGIX config, int attribute, int *value),
21370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (dpy, config, attribute, value), glXGetFBConfigAttrib)
2138cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
213938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLX_ALIAS(GLXFBConfigSGIX *, glXChooseFBConfigSGIX,
2140ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (Display * dpy, int screen, int *attrib_list,
2141ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                  int *nelements), (dpy, screen, attrib_list, nelements),
2142ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 glXChooseFBConfig)
2143cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
214438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLX_ALIAS(XVisualInfo *, glXGetVisualFromFBConfigSGIX,
2145ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (Display * dpy, GLXFBConfigSGIX config),
2146ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (dpy, config), glXGetVisualFromFBConfig)
2147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
214838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
2149ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian PaulglXCreateGLXPixmapWithConfigSGIX(Display * dpy,
21506ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                                 GLXFBConfigSGIX fbconfig,
2151ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                                 Pixmap pixmap)
2152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2153ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
21540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXVendorPrivateWithReplyReq *vpreq;
21550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXCreateGLXPixmapWithConfigSGIXReq *req;
21560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXPixmap xid = None;
21570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
215866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
2159ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
21606ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
2161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((dpy == NULL) || (config == NULL)) {
21640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
21650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2166ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
21676ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if(apple_glx_pixmap_create(dpy, config->screen, pixmap, config))
2168ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return None;
2169ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return pixmap;
2170ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
2171cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21726ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   psc = GetGLXScreenConfigs(dpy, config->screen);
21730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((psc != NULL)
21740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)) {
21750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      opcode = __glXSetupForCommand(dpy);
21760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!opcode) {
21770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return None;
21780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
2179cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Send the glXCreateGLXPixmapWithConfigSGIX request */
21810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      LockDisplay(dpy);
21820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReqExtra(GLXVendorPrivateWithReply,
21830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  sz_xGLXCreateGLXPixmapWithConfigSGIXReq -
21840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  sz_xGLXVendorPrivateWithReplyReq, vpreq);
21850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req = (xGLXCreateGLXPixmapWithConfigSGIXReq *) vpreq;
21860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
21870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXVendorPrivateWithReply;
21880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->vendorCode = X_GLXvop_CreateGLXPixmapWithConfigSGIX;
21896ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      req->screen = config->screen;
21906ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      req->fbconfig = config->fbconfigID;
21910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->pixmap = pixmap;
21920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxpixmap = xid = XAllocID(dpy);
21930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
21940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
21950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2196cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return xid;
2198ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2199cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2200cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
220138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
22020896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateContextWithConfigSGIX(Display * dpy,
22036ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                               GLXFBConfigSGIX fbconfig, int renderType,
22040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                               GLXContext shareList, Bool allowDirect)
2205cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
22060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContext gc = NULL;
22076ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
220866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
2209cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2210cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((dpy == NULL) || (config == NULL)) {
22120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
22130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2214cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22156ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   psc = GetGLXScreenConfigs(dpy, config->screen);
22160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((psc != NULL)
22170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)) {
22186ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      gc = CreateContext(dpy, config->fbconfigID, config, shareList,
22192243029eeec9e31b92079ff0e8fafdc0315053d6Ian Romanick                         allowDirect,
22207bcfb66000557a0ef32bdc6b31949a92f95a9ff6Ian Romanick			 X_GLXvop_CreateContextWithConfigSGIX, renderType,
22216ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			 config->screen);
22220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc;
2225cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2226cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2227cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
222838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfigSGIX
22290896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis)
2230cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2231c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
223266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = NULL;
2233cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc) != Success)
22350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)
223671a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick       && (psc->configs->fbconfigID != (int) GLX_DONT_CARE)) {
22376ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      return (GLXFBConfigSGIX) glx_config_find_visual(psc->configs,
22386ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg						      vis->visualid);
22390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2240cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return NULL;
2242cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2243cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2244ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2245cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2246cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_swap_group
2247cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
22480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
22490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXJoinSwapGroupSGIX(Display * dpy, GLXDrawable drawable,
22500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       GLXDrawable member)
2251cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2252cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2253cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) drawable;
2254cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) member;
2255cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2256cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2257cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2258cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2259cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_swap_barrier
2260cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
22610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
22620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXBindSwapBarrierSGIX(Display * dpy, GLXDrawable drawable, int barrier)
2263cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2264cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2265cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) drawable;
2266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) barrier;
2267cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2268cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
22700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXQueryMaxSwapBarriersSGIX(Display * dpy, int screen, int *max)
2271cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2272cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2273cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) screen;
2274cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) max;
2275cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2276cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2277cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2278cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_OML_sync_control
2281cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
22820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
22830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetSyncValuesOML(Display * dpy, GLXDrawable drawable,
22840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                      int64_t * ust, int64_t * msc, int64_t * sbc)
2285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2286c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display * const priv = __glXInitialize(dpy);
2287eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   int ret;
228867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2289daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
229067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
229166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
22920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2293daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (!priv)
2294daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return False;
22950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
229667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2297eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(dpy, drawable);
2298eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   psc = pdraw ? pdraw->psc : NULL;
2299eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   if (pdraw && psc->driScreen->getDrawableMSC) {
2300daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->getDrawableMSC(psc, pdraw, ust, msc, sbc);
2301daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2302daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
230367776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2304daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2305cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2306cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2307cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
230880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
23093d28a2690f3752990be50a25447747e237d7bee9Kristian Høgsberg_X_HIDDEN GLboolean
23107a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg__glxGetMscRate(__GLXDRIdrawable *glxDraw,
23117a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg		int32_t * numerator, int32_t * denominator)
2312286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg{
2313286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg#ifdef XF86VIDMODE
231466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
23150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XF86VidModeModeLine mode_line;
23160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int dot_clock;
23170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
231826b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
23190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psc = glxDraw->psc;
23200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (XF86VidModeQueryVersion(psc->dpy, &i, &i) &&
23210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       XF86VidModeGetModeLine(psc->dpy, psc->scr, &dot_clock, &mode_line)) {
23220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      unsigned n = dot_clock * 1000;
23230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      unsigned d = mode_line.vtotal * mode_line.htotal;
23240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2325286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg# define V_INTERLACE 0x010
2326286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg# define V_DBLSCAN   0x020
2327286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg
23280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (mode_line.flags & V_INTERLACE)
23290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         n *= 2;
23300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else if (mode_line.flags & V_DBLSCAN)
23310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         d *= 2;
23320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* The OML_sync_control spec requires that if the refresh rate is a
23340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       * whole number, that the returned numerator be equal to the refresh
23350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       * rate and the denominator be 1.
23360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       */
23370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (n % d == 0) {
23390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         n /= d;
23400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         d = 1;
23410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
23420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {
23430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         static const unsigned f[] = { 13, 11, 7, 5, 3, 2, 0 };
23440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         /* This is a poor man's way to reduce a fraction.  It's far from
23460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          * perfect, but it will work well enough for this situation.
23470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          */
23480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         for (i = 0; f[i] != 0; i++) {
23500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            while (n % f[i] == 0 && d % f[i] == 0) {
23510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               d /= f[i];
23520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               n /= f[i];
23530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            }
23540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
23550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
23560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *numerator = n;
23580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *denominator = d;
23590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return True;
23610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
23620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else
23630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
2364286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg#else
236526b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick   (void) draw;
236626b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick   (void) numerator;
236726b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick   (void) denominator;
236826b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick   (void) private;
236926b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
23700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return False;
2371286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg#endif
2372286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg}
2373286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg#endif
2374cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2375cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2376cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine the refresh rate of the specified drawable and display.
23770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2378cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy          Display whose refresh rate is to be determined.
2379cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param drawable     Drawable whose refresh rate is to be determined.
2380cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param numerator    Numerator of the refresh rate.
2381cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param demoninator  Denominator of the refresh rate.
2382cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \return  If the refresh rate for the specified display and drawable could
2383cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          be calculated, True is returned.  Otherwise False is returned.
23840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2385cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \note This function is implemented entirely client-side.  A lot of other
2386cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       functionality is required to export GLX_OML_sync_control, so on
2387cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       XFree86 this function can be called for direct-rendering contexts
2388cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       when GLX_OML_sync_control appears in the client extension string.
2389cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
2390cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
23910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN GLboolean
23920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
23930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int32_t * numerator, int32_t * denominator)
2394cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2395cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if defined( GLX_DIRECT_RENDERING ) && defined( XF86VIDMODE )
2396eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *draw = GetGLXDRIDrawable(dpy, drawable);
2397cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
23980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (draw == NULL)
23990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
2400cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
24017a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg   return __glxGetMscRate(draw, numerator, denominator);
2402cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
2403286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg   (void) dpy;
2404286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg   (void) drawable;
2405cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) numerator;
2406cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) denominator;
2407cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2408cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2409cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
24120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int64_t
24130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable,
24140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       int64_t target_msc, int64_t divisor, int64_t remainder)
2415cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2416c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
241767776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2418eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
241966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
242067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2421cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
242267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee   if (!gc) /* no GLX for this */
2423daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return -1;
2424daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
242516f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
242667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee   if (!pdraw || !gc->driContext)
242716f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return -1;
242816f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
242916f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
2430cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
2431cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but it also says "It [glXSwapBuffersMscOML] will return a value
2432cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * of -1 if the function failed because of errors detected in the input
2433cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * parameters"
2434cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
24350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor < 0 || remainder < 0 || target_msc < 0)
2436cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return -1;
24370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor > 0 && remainder >= divisor)
2438cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return -1;
2439cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
24408f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes   if (target_msc == 0 && divisor == 0 && remainder == 0)
24418f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes      remainder = 1;
24428f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes
2443daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes#ifdef GLX_DIRECT_RENDERING
2444daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->swapBuffers)
2445daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (*psc->driScreen->swapBuffers)(pdraw, target_msc, divisor,
2446daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes					    remainder);
2447cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2448daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2449daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   return -1;
2450cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2451cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2452cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
24530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
24540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitForMscOML(Display * dpy, GLXDrawable drawable,
24550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t target_msc, int64_t divisor,
24560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t remainder, int64_t * ust,
24570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t * msc, int64_t * sbc)
2458cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
245967776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2460eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
246167776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
246266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
24630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int ret;
2464cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2465daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2466cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
2467cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but the return type in the spec is Bool.
2468cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
24690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor < 0 || remainder < 0 || target_msc < 0)
2470cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
24710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor > 0 && remainder >= divisor)
2472cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
2473cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
247467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2475daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (pdraw && psc->driScreen && psc->driScreen->waitForMSC) {
2476daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForMSC(pdraw, target_msc, divisor, remainder,
2477daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes				       ust, msc, sbc);
2478daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2479daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
248067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2481daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2482cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2483cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2484cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2485cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
24860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
24870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitForSbcOML(Display * dpy, GLXDrawable drawable,
24880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t target_sbc, int64_t * ust,
24890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t * msc, int64_t * sbc)
2490cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
249167776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2492eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
249367776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
249466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
24950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int ret;
2496cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2497cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says this should "generate a GLX_BAD_VALUE
2498cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but the return type in the spec is Bool.
2499cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
25000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (target_sbc < 0)
2501cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
250267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee
250367776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2504251bf298bfddd06c6d6cd4b03ba9aadfc02e2895kleinerm   if (pdraw && psc->driScreen && psc->driScreen->waitForSBC) {
2505daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForSBC(pdraw, target_sbc, ust, msc, sbc);
2506daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2507daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
250867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
250967776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee
2510cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2511cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2512cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2513cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*@}*/
2514cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2515cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2516cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2517cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Mesa extension stubs.  These will help reduce portability problems.
2518cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
2519cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*@{*/
2520cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2521cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2522cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Release all buffers associated with the specified GLX drawable.
2523cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2524cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \todo
2525cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function was intended for stand-alone Mesa.  The issue there is that
2526cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * the library doesn't get any notification when a window is closed.  In
2527cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * DRI there is a similar but slightly different issue.  When GLX 1.3 is
2528cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * supported, there are 3 different functions to destroy a drawable.  It
2529cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * should be possible to create GLX protocol (or have it determine which
2530cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * protocol to use based on the type of the drawable) to have one function
2531cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * do the work of 3.  For the direct-rendering case, this function could
2532cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * just call the driver's \c __DRIdrawableRec::destroyDrawable function.
2533cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This would reduce the frequency with which \c __driGarbageCollectDrawables
2534cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * would need to be used.  This really should be done as part of the new DRI
2535cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * interface work.
2536cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2537cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa http://oss.sgi.com/projects/ogl-sample/registry/MESA/release_buffers.txt
2538cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     __driGarbageCollectDrawables
2539cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyGLXPixmap
2540cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyPbuffer glXDestroyPixmap glXDestroyWindow
2541cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyGLXPbufferSGIX glXDestroyGLXVideoSourceSGIX
2542cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
25430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
25440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXReleaseBuffersMESA(Display * dpy, GLXDrawable d)
2545cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2546cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2547cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) d;
2548cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2549cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2550cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2551cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
255238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
25530896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateGLXPixmapMESA(Display * dpy, XVisualInfo * visual,
25540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       Pixmap pixmap, Colormap cmap)
2555cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2556cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2557cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) visual;
2558cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) pixmap;
2559cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) cmap;
2560cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
2561cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
25620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2563fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/*@}*/
2564cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2565fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick
2566fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/**
2567fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick * GLX_MESA_copy_sub_buffer
2568fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick */
2569f2ad1b60c0da11283b399008f491792790cea294Brian Paul#define X_GLXvop_CopySubBufferMESA 5154 /* temporary */
25700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
25710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable,
25720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       int x, int y, int width, int height)
2573cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
25740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXVendorPrivateReq *req;
2575c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc;
25760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContextTag tag;
25770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *drawable_ptr;
25780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   INT32 *x_ptr, *y_ptr, *w_ptr, *h_ptr;
25790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
2580f2ad1b60c0da11283b399008f491792790cea294Brian Paul
25812235b1c72d79ec00a03c99219154e3f9103e692bKristian Høgsberg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2582eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
25830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (pdraw != NULL) {
258466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc = pdraw->psc;
25850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (psc->driScreen->copySubBuffer != NULL) {
25860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         glFlush();
25870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (*psc->driScreen->copySubBuffer) (pdraw, x, y, width, height);
25880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
25890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
25900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
25910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2592f2ad1b60c0da11283b399008f491792790cea294Brian Paul#endif
2593f2ad1b60c0da11283b399008f491792790cea294Brian Paul
25940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
25950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode)
25960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
2597cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
25980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
2599f2ad1b60c0da11283b399008f491792790cea294Brian Paul    ** The calling thread may or may not have a current context.  If it
2600f2ad1b60c0da11283b399008f491792790cea294Brian Paul    ** does, send the context tag so the server can do a flush.
2601f2ad1b60c0da11283b399008f491792790cea294Brian Paul    */
26020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc = __glXGetCurrentContext();
26030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((gc != NULL) && (dpy == gc->currentDpy) &&
26040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       ((drawable == gc->currentDrawable) ||
26050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        (drawable == gc->currentReadable))) {
26060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = gc->currentContextTag;
26070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
26080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
26090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = 0;
26100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
26110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
26130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32) * 4, req);
26140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
26150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXVendorPrivate;
26160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->vendorCode = X_GLXvop_CopySubBufferMESA;
26170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = tag;
26180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drawable_ptr = (CARD32 *) (req + 1);
26200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   x_ptr = (INT32 *) (drawable_ptr + 1);
26210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   y_ptr = (INT32 *) (drawable_ptr + 2);
26220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   w_ptr = (INT32 *) (drawable_ptr + 3);
26230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   h_ptr = (INT32 *) (drawable_ptr + 4);
26240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *drawable_ptr = drawable;
26260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *x_ptr = x;
26270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *y_ptr = y;
26280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *w_ptr = width;
26290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *h_ptr = height;
26300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
26320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
2633f2ad1b60c0da11283b399008f491792790cea294Brian Paul}
2634cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2635cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2636fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/**
2637fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick * GLX_EXT_texture_from_pixmap
2638fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick */
26390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
264031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsbergindirect_bind_tex_image(Display * dpy,
264131819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg			GLXDrawable drawable,
264231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg			int buffer, const int *attrib_list)
26430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
26440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXVendorPrivateReq *req;
2645c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
26460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *drawable_ptr;
26470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   INT32 *buffer_ptr;
26480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *num_attrib_ptr;
26490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *attrib_ptr;
26500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
26510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   unsigned int i;
26520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   i = 0;
26540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (attrib_list) {
26550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      while (attrib_list[i * 2] != None)
26560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         i++;
26570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
26580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
26600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode)
26610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
26620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
26640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(GLXVendorPrivate, 12 + 8 * i, req);
26650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
26660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXVendorPrivate;
26670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->vendorCode = X_GLXvop_BindTexImageEXT;
26680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = gc->currentContextTag;
26690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drawable_ptr = (CARD32 *) (req + 1);
26710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   buffer_ptr = (INT32 *) (drawable_ptr + 1);
26720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   num_attrib_ptr = (CARD32 *) (buffer_ptr + 1);
26730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   attrib_ptr = (CARD32 *) (num_attrib_ptr + 1);
26740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *drawable_ptr = drawable;
26760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *buffer_ptr = buffer;
26770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *num_attrib_ptr = (CARD32) i;
26780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   i = 0;
26800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (attrib_list) {
26810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      while (attrib_list[i * 2] != None) {
26820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 0];
26830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *attrib_ptr++ = (CARD32) attrib_list[i * 2 + 1];
26840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         i++;
26850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
26860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
26870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
26890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
26900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf}
26910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
269331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsbergindirect_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
26940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
26950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXVendorPrivateReq *req;
2696c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
26970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *drawable_ptr;
26980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   INT32 *buffer_ptr;
26990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
27000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
27010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
27020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode)
27030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
270442725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul
27050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
27060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32), req);
27070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
27080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXVendorPrivate;
27090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->vendorCode = X_GLXvop_ReleaseTexImageEXT;
27100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = gc->currentContextTag;
271142725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul
27120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drawable_ptr = (CARD32 *) (req + 1);
27130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   buffer_ptr = (INT32 *) (drawable_ptr + 1);
271442725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul
27150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *drawable_ptr = drawable;
27160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *buffer_ptr = buffer;
271742725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul
27180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
27190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
272042725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul}
27210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
272231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsbergstatic const struct glx_context_vtable indirect_context_vtable = {
2723c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   indirect_destroy_context,
27247b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   indirect_wait_gl,
27257b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   indirect_wait_x,
27267b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg   indirect_use_x_font,
272731819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   indirect_bind_tex_image,
272831819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   indirect_release_tex_image,
2729643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg};
2730643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2731643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg/*@{*/
2732643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void
2733643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg__glXBindTexImageEXT(Display * dpy,
2734643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg                     GLXDrawable drawable, int buffer, const int *attrib_list)
2735643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{
2736c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
2737643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2738643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   if (gc == NULL || gc->vtable->bind_tex_image == NULL)
2739643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg      return;
2740643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2741643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   gc->vtable->bind_tex_image(dpy, drawable, buffer, attrib_list);
2742643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}
2743643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2744643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void
2745643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg__glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
2746643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{
2747c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
2748643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2749643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   if (gc == NULL || gc->vtable->release_tex_image == NULL)
2750643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg      return;
2751643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2752643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   gc->vtable->release_tex_image(dpy, drawable, buffer);
2753643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}
2754643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2755fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/*@}*/
2756cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2757ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
2758ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
2759cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2760cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c strdup is actually not a standard ANSI C or POSIX routine.
2761cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Irix will not define it if ANSI mode is in effect.
27620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2763cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa strdup
2764cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
27653d28a2690f3752990be50a25447747e237d7bee9Kristian Høgsberg_X_HIDDEN char *
2766cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson__glXstrdup(const char *str)
2767cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2768cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   char *copy;
2769cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   copy = (char *) Xmalloc(strlen(str) + 1);
2770cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   if (!copy)
2771cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return NULL;
2772cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   strcpy(copy, str);
2773cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return copy;
2774cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2775cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2776cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2777cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** glXGetProcAddress support
2778cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
2779cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
27800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstruct name_address_pair
27810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
2782cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   const char *Name;
2783cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   GLvoid *Address;
2784cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson};
2785cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2786cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define GLX_FUNCTION(f) { # f, (GLvoid *) f }
2787cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define GLX_FUNCTION2(n,f) { # n, (GLvoid *) f }
2788cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2789cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic const struct name_address_pair GLX_functions[] = {
2790cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_0 ***/
27910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXChooseVisual),
27920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCopyContext),
27930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateContext),
27940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmap),
27950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyContext),
27960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyGLXPixmap),
27970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetConfig),
27980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentContext),
27990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentDrawable),
28000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXIsDirect),
28010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXMakeCurrent),
28020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryExtension),
28030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryVersion),
28040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSwapBuffers),
28050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXUseXFont),
28060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXWaitGL),
28070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXWaitX),
2808cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2809cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_1 ***/
28100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetClientString),
28110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryExtensionsString),
28120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryServerString),
2813cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2814cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_2 ***/
28150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentDisplay),
2816cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2817cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_3 ***/
28180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXChooseFBConfig),
28190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateNewContext),
28200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreatePbuffer),
28210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreatePixmap),
28220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateWindow),
28230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyPbuffer),
28240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyPixmap),
28250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyWindow),
28260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentReadDrawable),
28270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigAttrib),
28280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigs),
28290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetSelectedEvent),
28300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetVisualFromFBConfig),
28310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXMakeContextCurrent),
28320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryContext),
28330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryDrawable),
28340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSelectEvent),
2835cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2836ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2837cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_swap_control ***/
28380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapIntervalSGI, __glXSwapIntervalSGI),
2839cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2840cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_video_sync ***/
28410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetVideoSyncSGI, __glXGetVideoSyncSGI),
28420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitVideoSyncSGI, __glXWaitVideoSyncSGI),
2843cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2844cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_make_current_read ***/
28450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXMakeCurrentReadSGI, glXMakeContextCurrent),
28460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetCurrentReadDrawableSGI, glXGetCurrentReadDrawable),
2847cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2848cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_EXT_import_context ***/
28490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXFreeContextEXT),
28500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetContextIDEXT),
28510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetCurrentDisplayEXT, glXGetCurrentDisplay),
28520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXImportContextEXT),
28530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXQueryContextInfoEXT, glXQueryContext),
2854ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2855cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2856cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_fbconfig ***/
28570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetFBConfigAttribSGIX, glXGetFBConfigAttrib),
28580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXChooseFBConfigSGIX, glXChooseFBConfig),
28590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmapWithConfigSGIX),
28600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateContextWithConfigSGIX),
28610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetVisualFromFBConfigSGIX, glXGetVisualFromFBConfig),
28620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigFromVisualSGIX),
2863cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2864ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2865cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_pbuffer ***/
28660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPbufferSGIX),
28670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyGLXPbufferSGIX),
28680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryGLXPbufferSGIX),
28690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSelectEventSGIX),
28700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetSelectedEventSGIX),
2871cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2872cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_swap_group ***/
28730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXJoinSwapGroupSGIX, __glXJoinSwapGroupSGIX),
2874cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2875cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_swap_barrier ***/
28760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXBindSwapBarrierSGIX, __glXBindSwapBarrierSGIX),
28770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXQueryMaxSwapBarriersSGIX, __glXQueryMaxSwapBarriersSGIX),
2878cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2879cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_copy_sub_buffer ***/
28800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXCopySubBufferMESA, __glXCopySubBufferMESA),
2881cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2882cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_pixmap_colormap ***/
28830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmapMESA),
2884cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2885cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_release_buffers ***/
28860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXReleaseBuffersMESA, __glXReleaseBuffersMESA),
2887cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2888cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_swap_control ***/
28890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapIntervalMESA, __glXSwapIntervalMESA),
28900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetSwapIntervalMESA, __glXGetSwapIntervalMESA),
2891ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2892cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2893cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_ARB_get_proc_address ***/
28940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetProcAddressARB),
2895cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2896cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX 1.4 ***/
28970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetProcAddress, glXGetProcAddressARB),
2898cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2899ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2900cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_OML_sync_control ***/
29010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitForSbcOML, __glXWaitForSbcOML),
29020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitForMscOML, __glXWaitForMscOML),
29030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapBuffersMscOML, __glXSwapBuffersMscOML),
29040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetMscRateOML, __glXGetMscRateOML),
29050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetSyncValuesOML, __glXGetSyncValuesOML),
2906cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
290742725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul   /*** GLX_EXT_texture_from_pixmap ***/
29080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXBindTexImageEXT, __glXBindTexImageEXT),
29090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXReleaseTexImageEXT, __glXReleaseTexImageEXT),
2910ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
291142725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul
291280b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2913cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** DRI configuration ***/
29140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetScreenDriver),
29150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetDriverConfig),
2916cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2917cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
29180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {NULL, NULL}                 /* end of list */
2919cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson};
2920cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2921ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2922cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic const GLvoid *
2923cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonget_glx_proc_address(const char *funcName)
2924cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2925cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   GLuint i;
2926cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2927cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* try static functions */
2928cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   for (i = 0; GLX_functions[i].Name; i++) {
2929cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      if (strcmp(GLX_functions[i].Name, funcName) == 0)
29300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return GLX_functions[i].Address;
2931cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
2932cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2933cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return NULL;
2934cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2935ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2936cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2937cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2938cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the address of a named GL function.  This is the pre-GLX 1.4 name for
2939cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddress.
2940cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2941cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param procName  Name of a GL or GLX function.
2942cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns         A pointer to the named function
2943cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2944cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddress
2945cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
294638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void (*glXGetProcAddressARB(const GLubyte * procName)) (void)
2947cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
29480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   typedef void (*gl_function) (void);
2949cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   gl_function f;
2950cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2951cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2952cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* Search the table of GLX and internal functions first.  If that
2953cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * fails and the supplied name could be a valid core GL name, try
2954cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * searching the core GL function table.  This check is done to prevent
2955cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * DRI based drivers from searching the core GL function table for
2956cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * internal API functions.
2957cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
2958ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
2959ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   f = (gl_function) apple_glx_get_proc_address(procName);
2960ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
2961cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   f = (gl_function) get_glx_proc_address((const char *) procName);
29620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((f == NULL) && (procName[0] == 'g') && (procName[1] == 'l')
29630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && (procName[2] != 'X')) {
2964cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      f = (gl_function) _glapi_get_proc_address((const char *) procName);
2965cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
2966ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2967cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return f;
2968cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2969cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2970cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2971cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the address of a named GL function.  This is the GLX 1.4 name for
2972cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddressARB.
2973cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2974cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param procName  Name of a GL or GLX function.
2975cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns         A pointer to the named function
2976cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2977cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddressARB
2978cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
297938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void (*glXGetProcAddress(const GLubyte * procName)) (void)
2980cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if defined(__GNUC__) && !defined(GLX_ALIAS_UNSUPPORTED)
29810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __attribute__ ((alias("glXGetProcAddressARB")));
2982cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
2983cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2984cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return glXGetProcAddressARB(procName);
2985cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2986cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif /* __GNUC__ */
2987cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2988cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
298980b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2990cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2991cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the unadjusted system time (UST).  Currently, the UST is measured in
2992cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * microseconds since Epoc.  The actual resolution of the UST may vary from
2993cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * system to system, and the units may vary from release to release.
2994cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Drivers should not call this function directly.  They should instead use
2995cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddress to obtain a pointer to the function.
2996cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2997cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param ust Location to store the 64-bit UST
2998cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns Zero on success or a negative errno value on failure.
29990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
3000cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddress, PFNGLXGETUSTPROC
3001cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
3002cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \since Internal API version 20030317.
3003cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
30040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN int
30050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetUST(int64_t * ust)
30060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
30070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   struct timeval tv;
30080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
30090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (ust == NULL) {
30100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return -EFAULT;
30110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
30120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
30130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gettimeofday(&tv, NULL) == 0) {
30140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ust[0] = (tv.tv_sec * 1000000) + tv.tv_usec;
30150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
30160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
30170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
30180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return -errno;
30190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3020cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
3021cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif /* GLX_DIRECT_RENDERING */
3022