glxcmds.c revision 5a849e864ea2db3b705ba301089ee2ec1fe78aa1
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"
39e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu#include "indirect.h"
40df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis
41df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#ifdef GLX_DIRECT_RENDERING
42ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
43ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx_context.h"
44ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx.h"
45ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "glx_error.h"
46ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
47cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <sys/time.h>
482b9dac397bd97909876bbda8532e2cbce9d8a77fJon TURNEY#ifdef XF86VIDMODE
49df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#include <X11/extensions/xf86vmode.h>
502b9dac397bd97909876bbda8532e2cbce9d8a77fJon TURNEY#endif
51df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#include "xf86dri.h"
5280b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#endif
532b4e009ed56b69b243f5cc88f490dcf8166cf729Ian Romanick#else
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";
644a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
6580b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
664a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
67cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
68cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the __DRIdrawable for the drawable associated with a GLXContext
690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
70cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy       The display associated with \c drawable.
71cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param drawable  GLXDrawable whose __DRIdrawable part is to be retrieved.
724a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg * \param scrn_num  If non-NULL, the drawables screen is stored there
73cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns  A pointer to the context's __DRIdrawable on success, or NULL if
74cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *           the drawable is not associated with a direct-rendering context.
75cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
76e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg_X_HIDDEN __GLXDRIdrawable *
77eeaab2047cfce8a7445fd9f835e737682eb503acKristian HøgsbergGetGLXDRIDrawable(Display * dpy, GLXDrawable drawable)
78cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
79c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = __glXInitialize(dpy);
800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __GLXDRIdrawable *pdraw;
81cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (priv == NULL)
830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
84e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
85eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   if (__glxHashLookup(priv->drawHash, drawable, (void *) &pdraw) == 0)
86e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg      return pdraw;
87cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return NULL;
89cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
904a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsberg
91cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
92cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
934df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes_X_HIDDEN struct glx_drawable *
944df137691ee29bb812347fa2c5f19095243ede22Jesse BarnesGetGLXDrawable(Display *dpy, GLXDrawable drawable)
954df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes{
964df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   struct glx_display *priv = __glXInitialize(dpy);
974df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   struct glx_drawable *glxDraw;
984df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
994df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   if (priv == NULL)
1004df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      return NULL;
1014df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1024df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   if (__glxHashLookup(priv->glXDrawHash, drawable, (void *) &glxDraw) == 0)
1034df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      return glxDraw;
1044df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1054df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   return NULL;
1064df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes}
1074df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1084df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes_X_HIDDEN int
1094df137691ee29bb812347fa2c5f19095243ede22Jesse BarnesInitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw, XID xDrawable,
1104df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes		GLXDrawable drawable)
1114df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes{
1124df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   struct glx_display *priv = __glXInitialize(dpy);
1134df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1144df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   if (!priv)
1154df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      return -1;
1164df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1174df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   glxDraw->xDrawable = xDrawable;
1184df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   glxDraw->drawable = drawable;
1194df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   glxDraw->lastEventSbc = 0;
1204df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   glxDraw->eventSbcWrap = 0;
1214df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1224df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   return __glxHashInsert(priv->glXDrawHash, drawable, glxDraw);
1234df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes}
1244df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1254df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes_X_HIDDEN void
1264df137691ee29bb812347fa2c5f19095243ede22Jesse BarnesDestroyGLXDrawable(Display *dpy, GLXDrawable drawable)
1274df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes{
1284df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   struct glx_display *priv = __glXInitialize(dpy);
1294df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   struct glx_drawable *glxDraw;
1304df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1314df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   if (!priv)
1324df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      return;
1334df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
1344df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   glxDraw = GetGLXDrawable(dpy, drawable);
1354df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   __glxHashDelete(priv->glXDrawHash, drawable);
1364df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   free(glxDraw);
1374df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes}
138cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
139cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
140cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the GLX per-screen data structure associated with a GLX context.
1410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy   Display for which the GLX per-screen information is to be
143cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *              retrieved.
144cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param scrn  Screen on \c dpy for which the GLX per-screen information is
145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *              to be retrieved.
146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns A pointer to the GLX per-screen data if \c dpy and \c scrn
147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          specify a valid GLX screen, or NULL otherwise.
1480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
149cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \todo Should this function validate that \c scrn is within the screen
150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       number range for \c dpy?
151cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergstatic struct glx_screen *
1540896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGetGLXScreenConfigs(Display * dpy, int scrn)
155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
156c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *const priv = __glXInitialize(dpy);
157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return (priv
15966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg           && priv->screens !=
16066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg           NULL) ? priv->screens[scrn] : NULL;
161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
163cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
164cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int
165c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergGetGLXPrivScreenConfig(Display * dpy, int scrn, struct glx_display ** ppriv,
16666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg                       struct glx_screen ** ppsc)
167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Initialize the extension, if needed .  This has the added value
1690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * of initializing/allocating the display private
1700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
171cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (dpy == NULL) {
1730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_NO_EXTENSION;
1740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
175cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *ppriv = __glXInitialize(dpy);
1770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (*ppriv == NULL) {
1780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_NO_EXTENSION;
1790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
180cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Check screen number to see if its valid */
1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((scrn < 0) || (scrn >= ScreenCount(dpy))) {
1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_SCREEN;
1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
185cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Check to see if the GL is supported on this screen */
18766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   *ppsc = (*ppriv)->screens[scrn];
1880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((*ppsc)->configs == NULL) {
1890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* No support for GL on this screen regardless of visual */
1900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_VISUAL;
1910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
1930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return Success;
194cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
195cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
196cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
197cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
198cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine if a \c GLXFBConfig supplied by the application is valid.
199cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
200cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy     Application supplied \c Display pointer.
201cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param config  Application supplied \c GLXFBConfig.
202cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
203cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns If the \c GLXFBConfig is valid, the a pointer to the matching
2046ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg *          \c struct glx_config structure is returned.  Otherwise, \c NULL
205cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          is returned.
206cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
2076ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic struct glx_config *
2086ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergValidateGLXFBConfig(Display * dpy, GLXFBConfig fbconfig)
2090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
210c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *const priv = __glXInitialize(dpy);
2116ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   int num_screens = ScreenCount(dpy);
2120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   unsigned i;
2136ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
2140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (priv != NULL) {
2160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      for (i = 0; i < num_screens; i++) {
21766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg	 for (config = priv->screens[i]->configs; config != NULL;
2186ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	      config = config->next) {
2196ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	    if (config == (struct glx_config *) fbconfig) {
2206ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	       return config;
2216ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	    }
2226ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 }
2230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
2240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
22577c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
2260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return NULL;
227cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
228cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22931819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg_X_HIDDEN Bool
230c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergglx_context_init(struct glx_context *gc,
23166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg		 struct glx_screen *psc, struct glx_config *config)
23231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg{
23331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->majorOpcode = __glXSetupForCommand(psc->display->dpy);
23431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   if (!gc->majorOpcode)
23531819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg      return GL_FALSE;
23631819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg
23731819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->screen = psc->scr;
23831819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->psc = psc;
2396ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   gc->config = config;
24031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   gc->isDirect = GL_TRUE;
241c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   gc->currentContextTag = -1;
24231819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg
24331819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   return GL_TRUE;
24431819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg}
24531819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg
246cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
247cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2483869be74afb184dbdf9d67fda3de3e3ac7e3db6cAdam Jackson * Create a new context.
2490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
250cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param renderType   For FBConfigs, what is the rendering type?
251cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
252cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
253cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic GLXContext
2543869be74afb184dbdf9d67fda3de3e3ac7e3db6cAdam JacksonCreateContext(Display *dpy, int generic_id, struct glx_config *config,
2553869be74afb184dbdf9d67fda3de3e3ac7e3db6cAdam Jackson              GLXContext shareList_user, Bool allowDirect,
2567bcfb66000557a0ef32bdc6b31949a92f95a9ff6Ian Romanick	      unsigned code, int renderType, int screen)
257cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
258b5dc40710d0e5edffb9f673dfbf26df4d0043eefnobled   struct glx_context *gc;
259b5dc40710d0e5edffb9f673dfbf26df4d0043eefnobled   struct glx_screen *psc;
260c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *shareList = (struct glx_context *) shareList_user;
2610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (dpy == NULL)
2620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
263cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
264b5dc40710d0e5edffb9f673dfbf26df4d0043eefnobled   psc = GetGLXScreenConfigs(dpy, screen);
265b5dc40710d0e5edffb9f673dfbf26df4d0043eefnobled   if (psc == NULL)
266b5dc40710d0e5edffb9f673dfbf26df4d0043eefnobled      return NULL;
267b5dc40710d0e5edffb9f673dfbf26df4d0043eefnobled
268d46d30f997c1718217545947ca4d80ec7d18e684Ian Romanick   if (generic_id == None)
2690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
270cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2716ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   gc = NULL;
2721885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston#ifdef GLX_USE_APPLEGL
2731885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston   gc = applegl_create_context(psc, config, shareList, renderType);
2741885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston#else
2756ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (allowDirect && psc->vtable->create_context)
2766ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      gc = psc->vtable->create_context(psc, config, shareList, renderType);
27731819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   if (!gc)
2786ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      gc = indirect_create_context(psc, config, shareList, renderType);
2791885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston#endif
28031819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg   if (!gc)
28131819830b66a49f1b62e09090cc65aefc657aeb8Kristian Høgsberg      return NULL;
282643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
283bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   LockDisplay(dpy);
284bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   switch (code) {
285bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   case X_GLXCreateContext: {
286bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      xGLXCreateContextReq *req;
287bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick
288bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      /* Send the glXCreateContext request */
289bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      GetReq(GLXCreateContext, req);
290bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->reqType = gc->majorOpcode;
291bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->glxCode = X_GLXCreateContext;
292bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->context = gc->xid = XAllocID(dpy);
293d46d30f997c1718217545947ca4d80ec7d18e684Ian Romanick      req->visual = generic_id;
294c3db1d621e1f7c73006ed76855d31b1034bc3aefIan Romanick      req->screen = screen;
295bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->shareList = shareList ? shareList->xid : None;
296c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      req->isDirect = gc->isDirect;
297bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      break;
298bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   }
299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
300bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   case X_GLXCreateNewContext: {
301bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      xGLXCreateNewContextReq *req;
302bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick
303bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      /* Send the glXCreateNewContext request */
304bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      GetReq(GLXCreateNewContext, req);
305bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->reqType = gc->majorOpcode;
306bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->glxCode = X_GLXCreateNewContext;
307bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->context = gc->xid = XAllocID(dpy);
308d46d30f997c1718217545947ca4d80ec7d18e684Ian Romanick      req->fbconfig = generic_id;
309c3db1d621e1f7c73006ed76855d31b1034bc3aefIan Romanick      req->screen = screen;
310bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->renderType = renderType;
311bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->shareList = shareList ? shareList->xid : None;
312c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      req->isDirect = gc->isDirect;
313bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      break;
3140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
3158bffadbc83d19ecd8be8f0107d51463e36477666Ian Romanick
316bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   case X_GLXvop_CreateContextWithConfigSGIX: {
317bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      xGLXVendorPrivateWithReplyReq *vpreq;
318bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      xGLXCreateContextWithConfigSGIXReq *req;
319bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick
320bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      /* Send the glXCreateNewContext request */
321bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      GetReqExtra(GLXVendorPrivateWithReply,
322bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick		  sz_xGLXCreateContextWithConfigSGIXReq -
323bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick		  sz_xGLXVendorPrivateWithReplyReq, vpreq);
324bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req = (xGLXCreateContextWithConfigSGIXReq *) vpreq;
325bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->reqType = gc->majorOpcode;
326bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->glxCode = X_GLXVendorPrivateWithReply;
327bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->vendorCode = X_GLXvop_CreateContextWithConfigSGIX;
328bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->context = gc->xid = XAllocID(dpy);
329d46d30f997c1718217545947ca4d80ec7d18e684Ian Romanick      req->fbconfig = generic_id;
330c3db1d621e1f7c73006ed76855d31b1034bc3aefIan Romanick      req->screen = screen;
331bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->renderType = renderType;
332bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      req->shareList = shareList ? shareList->xid : None;
333c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg      req->isDirect = gc->isDirect;
334bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      break;
335bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   }
3368bffadbc83d19ecd8be8f0107d51463e36477666Ian Romanick
337bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   default:
338bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      /* What to do here?  This case is the sign of an internal error.  It
339bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick       * should never be reachable.
340bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick       */
341bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick      break;
3420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
343cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
344bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   UnlockDisplay(dpy);
345bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   SyncHandle();
346cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
347bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   gc->imported = GL_FALSE;
348521e4b9b7e3c79e7362f7cbd594a2e8cf74cdfe4Brian Paul   gc->renderType = renderType;
349521e4b9b7e3c79e7362f7cbd594a2e8cf74cdfe4Brian Paul
350c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   return (GLXContext) gc;
351cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
352cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
35338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
3540896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateContext(Display * dpy, XVisualInfo * vis,
3550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                 GLXContext shareList, Bool allowDirect)
356cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
3576ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = NULL;
35852cf8db428909156b062f17a9e6251a38178dec3Ian Romanick   int renderType = 0;
35952cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
360ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#if defined(GLX_DIRECT_RENDERING) || defined(GLX_USE_APPLEGL)
36166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *const psc = GetGLXScreenConfigs(dpy, vis->screen);
36252cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
3636ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   config = glx_config_find_visual(psc->visuals, vis->visualid);
3646ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if (config == NULL) {
36552cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      xError error;
36652cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
36752cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.errorCode = BadValue;
36852cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.resourceID = vis->visualid;
36952cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.sequenceNumber = dpy->request;
37052cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.type = X_Error;
37152cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.majorCode = __glXSetupForCommand(dpy);
37252cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.minorCode = X_GLXCreateContext;
37352cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      _XError(dpy, &error);
37452cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      return None;
37552cf8db428909156b062f17a9e6251a38178dec3Ian Romanick   }
37652cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
3776ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   renderType = config->rgbMode ? GLX_RGBA_TYPE : GLX_COLOR_INDEX_TYPE;
37852cf8db428909156b062f17a9e6251a38178dec3Ian Romanick#endif
37952cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
3806ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return CreateContext(dpy, vis->visualid, config, shareList, allowDirect,
38152cf8db428909156b062f17a9e6251a38178dec3Ian Romanick                        X_GLXCreateContext, renderType, vis->screen);
382cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
383cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN void
385c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsbergglx_send_destroy_context(Display *dpy, XID xid)
386cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
387c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   CARD8 opcode = __glXSetupForCommand(dpy);
388c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   xGLXDestroyContextReq *req;
389c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
390c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   LockDisplay(dpy);
391c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   GetReq(GLXDestroyContext, req);
392c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->reqType = opcode;
393c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->glxCode = X_GLXDestroyContext;
394c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->context = xid;
395c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   UnlockDisplay(dpy);
396c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   SyncHandle();
397c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg}
398c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
399cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
400cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Destroy the named context
401cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
4029e2bc5d4b0385e374e06c0b26db266067a723bf3Adam Jackson
4039e2bc5d4b0385e374e06c0b26db266067a723bf3Adam Jackson_X_EXPORT void
4049e2bc5d4b0385e374e06c0b26db266067a723bf3Adam JacksonglXDestroyContext(Display * dpy, GLXContext ctx)
405cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
406c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = (struct glx_context *) ctx;
407c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
408c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   if (!gc)
4090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXLock();
4125e6a6a2719c695996490bde491dac267e52f78afBrian Paul   if (gc->currentDpy) {
4135e6a6a2719c695996490bde491dac267e52f78afBrian Paul      /* This context is bound to some thread.  According to the man page,
4145e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * we should not actually delete the context until it's unbound.
4155e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * Note that we set gc->xid = None above.  In MakeContextCurrent()
4165e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * we check for that and delete the context there.
4175e6a6a2719c695996490bde491dac267e52f78afBrian Paul       */
418d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg      if (!gc->imported)
419d77bb8e059ecfed9b714301fc31b093c6026c7bcKristian Høgsberg	 glx_send_destroy_context(dpy, gc->xid);
420c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg      gc->xid = None;
4215e6a6a2719c695996490bde491dac267e52f78afBrian Paul      __glXUnlock();
4225e6a6a2719c695996490bde491dac267e52f78afBrian Paul      return;
4235e6a6a2719c695996490bde491dac267e52f78afBrian Paul   }
424c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   __glXUnlock();
4255e6a6a2719c695996490bde491dac267e52f78afBrian Paul
426816b8acfe81d5e2d666eb926f669d6015df0bbacJeremy Huddleston   gc->vtable->destroy(gc);
427cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
428489ccef3982267b0d35c8548921f58d553c25a3aAdam Jackson
429cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
430cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return the major and minor version #s for the GLX extension
431cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
43238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Bool
4330896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryVersion(Display * dpy, int *major, int *minor)
434cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
435c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
436cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Init the extension.  This fetches the major and minor version. */
4380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   priv = __glXInitialize(dpy);
4390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!priv)
4400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_FALSE;
441cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (major)
4430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *major = priv->majorVersion;
4440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (minor)
4450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *minor = priv->minorVersion;
4460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return GL_TRUE;
447cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
448cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
449cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
450cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Query the existance of the GLX extension
451cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
45238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Bool
4530896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryExtension(Display * dpy, int *errorBase, int *eventBase)
4540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
4550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int major_op, erb, evb;
4560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Bool rv;
4570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
4580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   rv = XQueryExtension(dpy, GLX_EXTENSION_NAME, &major_op, &evb, &erb);
4590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (rv) {
4600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (errorBase)
4610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *errorBase = erb;
4620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (eventBase)
4630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *eventBase = evb;
4640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
4650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return rv;
466cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
467cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
468cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
4697b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg** Put a barrier in the token stream that forces the GL to finish its
4707b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg** work before X can proceed.
471cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
47238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
4737b7845a076c933e096ac511b4184141ba194449aKristian HøgsbergglXWaitGL(void)
474cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
475c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
476cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4773ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg   if (gc && gc->vtable->wait_gl)
4787b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg      gc->vtable->wait_gl(gc);
4797b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg}
4807b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
4817b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg/*
4827b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg** Put a barrier in the token stream that forces X to finish its
4837b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg** work before GL can proceed.
4847b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg*/
48538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
4867b7845a076c933e096ac511b4184141ba194449aKristian HøgsbergglXWaitX(void)
487cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
488c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
489cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4903ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg   if (gc && gc->vtable->wait_x)
4917b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg      gc->vtable->wait_x(gc);
4927b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg}
4937b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
49438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
4957b7845a076c933e096ac511b4184141ba194449aKristian HøgsbergglXUseXFont(Font font, int first, int count, int listBase)
4967b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg{
497c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
4987b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg
4993ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg   if (gc && gc->vtable->use_x_font)
5007b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg      gc->vtable->use_x_font(gc, font, first, count, listBase);
501cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
502cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
503cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/
504cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
505cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
506cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Copy the source context to the destination context using the
507cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** attribute "mask".
508cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
50938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
510c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergglXCopyContext(Display * dpy, GLXContext source_user,
511c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg	       GLXContext dest_user, unsigned long mask)
512cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
513c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *source = (struct glx_context *) source_user;
514c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *dest = (struct glx_context *) dest_user;
515ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
516c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
517ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   int errorcode;
518ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   bool x11error;
519ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
52080b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston   if(apple_glx_copy_context(gc->driContext, source->driContext, dest->driContext,
521ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston                             mask, &errorcode, &x11error)) {
522ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      __glXSendError(dpy, errorcode, 0, X_GLXCopyContext, x11error);
523ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
524ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
525ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
5260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXCopyContextReq *req;
527c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
5280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContextTag tag;
5290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
530cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
5310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
5320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
5330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
5340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
535cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
53680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
537c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (gc->isDirect) {
5380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* NOT_DONE: This does not work yet */
5390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
540cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
541cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
5420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
543cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** If the source is the current context, send its tag so that the context
544cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** can be flushed before the copy.
545cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
5460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (source == gc && dpy == gc->currentDpy) {
5470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = gc->currentContextTag;
5480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
5490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
5500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = 0;
5510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
5520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
5530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXCopyContext request */
5540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
5550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXCopyContext, req);
5560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
5570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXCopyContext;
5580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->source = source ? source->xid : None;
5590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->dest = dest ? dest->xid : None;
5600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->mask = mask;
5610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = tag;
5620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
5630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
564ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
565cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
566cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
567cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
568cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
569cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine if a context uses direct rendering.
570cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
571cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy        Display where the context was created.
572cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param contextID  ID of the context to be tested.
573cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
574cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns \c GL_TRUE if the context is direct rendering or not.
575cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
5760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
5770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXIsDirect(Display * dpy, GLXContextID contextID)
578cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
5799c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#if !defined(USE_XCB)
5800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXIsDirectReq *req;
5810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXIsDirectReply reply;
5829c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#endif
5830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
584cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
5850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
5860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
5870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_FALSE;
5880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
589cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
5909c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#ifdef USE_XCB
5910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_connection_t *c = XGetXCBConnection(dpy);
5920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_glx_is_direct_reply_t *reply = xcb_glx_is_direct_reply(c,
5930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                              xcb_glx_is_direct
5940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                              (c, contextID),
5950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                              NULL);
5969c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf
5977c2f1160c23970929a2846d210357447d07ff5f0Ian Romanick   const Bool is_direct = (reply != NULL && reply->is_direct) ? True : False;
5989c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf   free(reply);
5999c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf
6009c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf   return is_direct;
6019c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#else
6020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXIsDirect request */
6030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
6040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXIsDirect, req);
6050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
6060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXIsDirect;
6070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->context = contextID;
6080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReply(dpy, (xReply *) & reply, 0, False);
6090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
6100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
6110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
6120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return reply.isDirect;
6139c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#endif /* USE_XCB */
614cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
615cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
616c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick/**
617c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * \todo
618c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * Shouldn't this function \b always return \c GL_FALSE when
619c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * \c GLX_DIRECT_RENDERING is not defined?  Do we really need to bother with
620c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * the GLX protocol here at all?
621c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick */
62238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Bool
623c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergglXIsDirect(Display * dpy, GLXContext gc_user)
624cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
625c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = (struct glx_context *) gc_user;
626c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
6270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!gc) {
6280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_FALSE;
6290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
630c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   else if (gc->isDirect) {
6310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_TRUE;
6320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
633a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#ifdef GLX_USE_APPLEGL  /* TODO: indirect on darwin */
634a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston      return GL_FALSE;
635a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#else
6360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return __glXIsDirect(dpy, gc->xid);
637a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#endif
638cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
639cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
64038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
6410896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap)
642cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
643ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
644ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   int screen = vis->screen;
64566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *const psc = GetGLXScreenConfigs(dpy, screen);
6466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   const struct glx_config *config;
647ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
648b7f0ed8444544b7fc927823a903db93ebf723cadJeremy Huddleston   config = glx_config_find_visual(psc->visuals, vis->visualid);
649ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
6506ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if(apple_glx_pixmap_create(dpy, vis->screen, pixmap, config))
651ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return None;
652ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
653ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return pixmap;
654ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
6550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXCreateGLXPixmapReq *req;
6564df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   struct glx_drawable *glxDraw;
6570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXPixmap xid;
6580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
659cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
6610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
6620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
6630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
664cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6654df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   glxDraw = Xmalloc(sizeof(*glxDraw));
6664df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   if (!glxDraw)
6674df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      return None;
6684df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
6690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXCreateGLXPixmap request */
6700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
6710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXCreateGLXPixmap, req);
6720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
6730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXCreateGLXPixmap;
6740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->screen = vis->screen;
6750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->visual = vis->visualid;
6760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->pixmap = pixmap;
6770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxpixmap = xid = XAllocID(dpy);
6780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
6790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
680edb117879846155632aaeb66483a3085c7a78815Michel Dänzer
6814df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   if (InitGLXDrawable(dpy, glxDraw, pixmap, req->glxpixmap)) {
6824df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      free(glxDraw);
6834df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      return None;
6844df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   }
6854df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
68680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
6879053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer   do {
6889053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      /* FIXME: Maybe delay __DRIdrawable creation until the drawable
6899053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer       * is actually bound to a context... */
6909053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
691c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg      struct glx_display *const priv = __glXInitialize(dpy);
6929053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      __GLXDRIdrawable *pdraw;
69366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
6946ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      struct glx_config *config;
6959053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
69666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      psc = priv->screens[vis->screen];
6979053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      if (psc->driScreen == NULL)
6984833104718677caad0027d5e7539ca9bba389392Adam Jackson         return xid;
6994833104718677caad0027d5e7539ca9bba389392Adam Jackson
7006ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config = glx_config_find_visual(psc->visuals, vis->visualid);
701776a2a54473194e2f0926902276a1f880cded91fAdam Jackson      pdraw = psc->driScreen->createDrawable(psc, pixmap, xid, config);
7029053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      if (pdraw == NULL) {
7039053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         fprintf(stderr, "failed to create pixmap\n");
7044833104718677caad0027d5e7539ca9bba389392Adam Jackson         xid = None;
7059053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         break;
7069053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      }
7079053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
708776a2a54473194e2f0926902276a1f880cded91fAdam Jackson      if (__glxHashInsert(priv->drawHash, xid, pdraw)) {
7099053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         (*pdraw->destroyDrawable) (pdraw);
7104833104718677caad0027d5e7539ca9bba389392Adam Jackson         xid = None;
7114833104718677caad0027d5e7539ca9bba389392Adam Jackson         break;
7129053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      }
7139053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer   } while (0);
7144833104718677caad0027d5e7539ca9bba389392Adam Jackson
7154833104718677caad0027d5e7539ca9bba389392Adam Jackson   if (xid == None) {
7164833104718677caad0027d5e7539ca9bba389392Adam Jackson      xGLXDestroyGLXPixmapReq *dreq;
7174833104718677caad0027d5e7539ca9bba389392Adam Jackson      LockDisplay(dpy);
7184833104718677caad0027d5e7539ca9bba389392Adam Jackson      GetReq(GLXDestroyGLXPixmap, dreq);
7194833104718677caad0027d5e7539ca9bba389392Adam Jackson      dreq->reqType = opcode;
7204833104718677caad0027d5e7539ca9bba389392Adam Jackson      dreq->glxCode = X_GLXDestroyGLXPixmap;
7214833104718677caad0027d5e7539ca9bba389392Adam Jackson      dreq->glxpixmap = xid;
7224833104718677caad0027d5e7539ca9bba389392Adam Jackson      UnlockDisplay(dpy);
7234833104718677caad0027d5e7539ca9bba389392Adam Jackson      SyncHandle();
7244833104718677caad0027d5e7539ca9bba389392Adam Jackson   }
725edb117879846155632aaeb66483a3085c7a78815Michel Dänzer#endif
726edb117879846155632aaeb66483a3085c7a78815Michel Dänzer
7270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return xid;
728ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
729cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
730cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
731cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
732cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Destroy the named pixmap
733cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
73438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
7350896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXDestroyGLXPixmap(Display * dpy, GLXPixmap glxpixmap)
7360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
737ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
738ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if(apple_glx_pixmap_destroy(dpy, glxpixmap))
739ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      __glXSendError(dpy, GLXBadPixmap, glxpixmap, X_GLXDestroyPixmap, false);
740ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
7410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXDestroyGLXPixmapReq *req;
7420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
7430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
7440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
7450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
7460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
7470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
7480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
7490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXDestroyGLXPixmap request */
7500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
7510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXDestroyGLXPixmap, req);
7520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
7530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXDestroyGLXPixmap;
7540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxpixmap = glxpixmap;
7550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
7560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
7579dfce365c7f35ddea6d81b7f595ddcd6d35382a5Michel Dänzer
7584df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   DestroyGLXDrawable(dpy, glxpixmap);
7594df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
76080b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
7610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {
762c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg      struct glx_display *const priv = __glXInitialize(dpy);
763eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, glxpixmap);
7640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
7650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (pdraw != NULL) {
7660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (*pdraw->destroyDrawable) (pdraw);
767e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg         __glxHashDelete(priv->drawHash, glxpixmap);
7680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
7690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
7709dfce365c7f35ddea6d81b7f595ddcd6d35382a5Michel Dänzer#endif
771ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
77277c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg}
77377c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
77438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
7750896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXSwapBuffers(Display * dpy, GLXDrawable drawable)
77677c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg{
777ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
778279e471750e3ee6a4841ebf16ef2d038e1c12077Jeremy Huddleston   struct glx_context * gc = __glXGetCurrentContext();
77980b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston   if(gc && apple_glx_is_current_drawable(dpy, gc->driContext, drawable)) {
78080b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston      apple_glx_swap_buffers(gc->driContext);
781ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   } else {
782ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      __glXSendError(dpy, GLXBadCurrentWindow, 0, X_GLXSwapBuffers, false);
783ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
784ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
785c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc;
7860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContextTag tag;
7870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
788b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#ifdef USE_XCB
7890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_connection_t *c;
790b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#else
7910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXSwapBuffersReq *req;
792b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#endif
793b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul
7944d01bea808592aec74be2d2a4bbb6488b9299cdaEric Anholt   gc = __glXGetCurrentContext();
7954d01bea808592aec74be2d2a4bbb6488b9299cdaEric Anholt
79680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
797e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul   {
798e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
799cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
800e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul      if (pdraw != NULL) {
801e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul         if (gc && drawable == gc->currentDrawable) {
802e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul            glFlush();
803e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul         }
8044d01bea808592aec74be2d2a4bbb6488b9299cdaEric Anholt
805e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul         (*pdraw->psc->driScreen->swapBuffers)(pdraw, 0, 0, 0);
806e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul         return;
807e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul      }
8080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
809cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
810cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
8120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
8130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
8140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
815cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
817cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** The calling thread may or may not have a current context.  If it
818cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** does, send the context tag so the server can do a flush.
819cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
8200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((gc != NULL) && (dpy == gc->currentDpy) &&
8210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       ((drawable == gc->currentDrawable)
8220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        || (drawable == gc->currentReadable))) {
8230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = gc->currentContextTag;
8240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
8260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = 0;
8270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
82877c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
829ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#ifdef USE_XCB
8300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   c = XGetXCBConnection(dpy);
8310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_glx_swap_buffers(c, tag, drawable);
8320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_flush(c);
833ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#else
8340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXSwapBuffers request */
8350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
8360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXSwapBuffers, req);
8370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
8380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXSwapBuffers;
8390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->drawable = drawable;
8400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = tag;
8410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
8420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
8430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XFlush(dpy);
844ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#endif /* USE_XCB */
845ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
846cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
847cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
848cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
849cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
850cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return configuration information for the given display, screen and
851cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** visual combination.
852cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
85338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
8540896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetConfig(Display * dpy, XVisualInfo * vis, int attribute,
8550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf             int *value_return)
8560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
857c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
85866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
8596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
8600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int status;
8610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   status = GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc);
8630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (status == Success) {
8646ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config = glx_config_find_visual(psc->visuals, vis->visualid);
8650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Lookup attribute after first finding a match on the visual */
8676ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (config != NULL) {
8686ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 return glx_config_get(config, attribute, value_return);
8690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
8700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      status = GLX_BAD_VISUAL;
8720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
875cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** If we can't find the config for this visual, this visual is not
876cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** supported by the OpenGL implementation on the server.
877cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
8780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((status == GLX_BAD_VISUAL) && (attribute == GLX_USE_GL)) {
8790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *value_return = GL_FALSE;
8800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      status = Success;
8810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
882cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return status;
884cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
885cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
886cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/
887cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
888cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void
8896ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberginit_fbconfig_for_chooser(struct glx_config * config,
8900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                          GLboolean fbconfig_style_tags)
8910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
8926ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   memset(config, 0, sizeof(struct glx_config));
8930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualID = (XID) GLX_DONT_CARE;
8940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualType = GLX_DONT_CARE;
8950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* glXChooseFBConfig specifies different defaults for these two than
8970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * glXChooseVisual.
8980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
8990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (fbconfig_style_tags) {
9000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      config->rgbMode = GL_TRUE;
9010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      config->doubleBufferMode = GLX_DONT_CARE;
9020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
9030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualRating = GLX_DONT_CARE;
9050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentPixel = GLX_NONE;
9060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentRed = GLX_DONT_CARE;
9070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentGreen = GLX_DONT_CARE;
9080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentBlue = GLX_DONT_CARE;
9090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentAlpha = GLX_DONT_CARE;
9100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentIndex = GLX_DONT_CARE;
9110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->drawableType = GLX_WINDOW_BIT;
9130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->renderType =
9140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
9150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->xRenderable = GLX_DONT_CARE;
9160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->fbconfigID = (GLXFBConfigID) (GLX_DONT_CARE);
9170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->swapMethod = GLX_DONT_CARE;
9190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf}
9200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_DONT_CARE( param )        \
9220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                  \
92371a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick    if ( ((int) a-> param != (int) GLX_DONT_CARE)   \
9240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         && (a-> param != b-> param) ) {        \
9250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
9260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
9270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
9280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_MINIMUM( param )                  \
9300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
93171a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick    if ( ((int) a-> param != (int) GLX_DONT_CARE)	\
9320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         && (a-> param > b-> param) ) {         \
9330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
9340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
9350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
9360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_EXACT( param )                    \
9380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
9390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( a-> param != b-> param) {              \
9400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
9410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
9420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
943cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
944edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg/* Test that all bits from a are contained in b */
945edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg#define MATCH_MASK(param)			\
946edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg  do {						\
947edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg    if ((a->param & ~b->param) != 0)		\
948edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg      return False;				\
949edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg  } while (0);
950edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg
951cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
952cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine if two GLXFBConfigs are compatible.
953cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
954cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param a  Application specified config to test.
955cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param b  Server specified config to test against \c a.
956cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
957cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic Bool
9586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergfbconfigs_compatible(const struct glx_config * const a,
9596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                     const struct glx_config * const b)
9600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
9610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(doubleBufferMode);
9620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(visualType);
9630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(visualRating);
9640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(xRenderable);
9650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(fbconfigID);
9660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(swapMethod);
9670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(rgbBits);
9690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(numAuxBuffers);
9700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(redBits);
9710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(greenBits);
9720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(blueBits);
9730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(alphaBits);
9740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(depthBits);
9750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(stencilBits);
9760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumRedBits);
9770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumGreenBits);
9780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumBlueBits);
9790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumAlphaBits);
9800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(sampleBuffers);
9810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferWidth);
9820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferHeight);
9830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferPixels);
9840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(samples);
9850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(stereoMode);
9870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_EXACT(level);
9880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
989edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg   MATCH_MASK(drawableType);
990edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg   MATCH_MASK(renderType);
9910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* There is a bug in a few of the XFree86 DDX drivers.  They contain
9930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * visuals with a "transparent type" of 0 when they really mean GLX_NONE.
9940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * Technically speaking, it is a bug in the DDX driver, but there is
9950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * enough of an installed base to work around the problem here.  In any
9960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * case, 0 is not a valid value of the transparent type, so we'll treat 0
9970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * from the app as GLX_DONT_CARE. We'll consider GLX_NONE from the app and
9980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * 0 from the server to be a match to maintain backward compatibility with
9990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * the (broken) drivers.
10000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
10010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
100271a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick   if (a->transparentPixel != (int) GLX_DONT_CARE && a->transparentPixel != 0) {
10030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (a->transparentPixel == GLX_NONE) {
10040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (b->transparentPixel != GLX_NONE && b->transparentPixel != 0)
10050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            return False;
10060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
10070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {
10080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_EXACT(transparentPixel);
10090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
10100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      switch (a->transparentPixel) {
10120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case GLX_TRANSPARENT_RGB:
10130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentRed);
10140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentGreen);
10150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentBlue);
10160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentAlpha);
10170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
10180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case GLX_TRANSPARENT_INDEX:
10200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentIndex);
10210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
10220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      default:
10240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
10250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
10260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
10270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return True;
1029cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1030cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1031cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1032cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* There's some trickly language in the GLX spec about how this is supposed
1033cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * to work.  Basically, if a given component size is either not specified
1034cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * or the requested size is zero, it is supposed to act like PERFER_SMALLER.
1035cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Well, that's really hard to do with the code as-is.  This behavior is
1036cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * closer to correct, but still not technically right.
1037cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
10380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_LARGER_OR_ZERO(comp)             \
10390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
10400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
10410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if ( ((*a)-> comp) == 0 ) {               \
10420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return -1;                              \
10430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
10440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else if ( ((*b)-> comp) == 0 ) {          \
10450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return 1;                               \
10460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
10470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {                                    \
10480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return ((*b)-> comp) - ((*a)-> comp) ;  \
10490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
10500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
10510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
10520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_LARGER(comp)                     \
10540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
10550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
10560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return ((*b)-> comp) - ((*a)-> comp) ;    \
10570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
10580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
10590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_SMALLER(comp)                    \
10610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
10620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
10630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return ((*a)-> comp) - ((*b)-> comp) ;    \
10640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
10650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
1066cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1067cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
1068cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Compare two GLXFBConfigs.  This function is intended to be used as the
1069cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * compare function passed in to qsort.
10700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1071cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns If \c a is a "better" config, according to the specification of
1072cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          SGIX_fbconfig, a number less than zero is returned.  If \c b is
1073cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          better, then a number greater than zero is return.  If both are
1074cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          equal, zero is returned.
1075cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa qsort, glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
1076cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1077cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int
10786ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergfbconfig_compare(struct glx_config **a, struct glx_config **b)
1079cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
10800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* The order of these comparisons must NOT change.  It is defined by
10810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * the GLX 1.3 spec and ARB_multisample.
10820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
1083cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualSelectGroup);
1085cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* The sort order for the visualRating is GLX_NONE, GLX_SLOW, and
10870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * GLX_NON_CONFORMANT_CONFIG.  It just so happens that this is the
10880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * numerical sort order of the enums (0x8000, 0x8001, and 0x800D).
10890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
10900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualRating);
1091cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This isn't quite right.  It is supposed to compare the sum of the
10930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * components the user specifically set minimums for.
10940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
10950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(redBits);
10960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(greenBits);
10970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(blueBits);
10980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(alphaBits);
1099cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(rgbBits);
1101cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (((*a)->doubleBufferMode != (*b)->doubleBufferMode)) {
11030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Prefer single-buffer.
11040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       */
11050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (!(*a)->doubleBufferMode) ? -1 : 1;
11060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1107cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(numAuxBuffers);
1109cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(depthBits);
11110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(stencilBits);
1112cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This isn't quite right.  It is supposed to compare the sum of the
11140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * components the user specifically set minimums for.
11150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumRedBits);
11170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumGreenBits);
11180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumBlueBits);
11190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumAlphaBits);
1120cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualType);
1122cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* None of the multisample specs say where this comparison should happen,
11240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * so I put it near the end.
11250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(sampleBuffers);
11270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(samples);
1128cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* None of the pbuffer or fbconfig specs say that this comparison needs
11300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * to happen at all, but it seems like it should.
11310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferWidth);
11330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferHeight);
11340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferPixels);
1135cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return 0;
1137cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1138cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1139cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1140cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
1141cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Selects and sorts a subset of the supplied configs based on the attributes.
1142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function forms to basis of \c glXChooseVisual, \c glXChooseFBConfig,
1143cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * and \c glXChooseFBConfigSGIX.
11440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param configs   Array of pointers to possible configs.  The elements of
1146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  this array that do not meet the criteria will be set to
1147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  NULL.  The remaining elements will be sorted according to
1148cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  the various visual / FBConfig selection rules.
1149cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param num_configs  Number of elements in the \c configs array.
1150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param attribList   Attributes used select from \c configs.  This array is
1151cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     terminated by a \c None tag.  The array can either take
1152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     the form expected by \c glXChooseVisual (where boolean
1153cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     tags do not have a value) or by \c glXChooseFBConfig
1154cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     (where every tag has a value).
1155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param fbconfig_style_tags  Selects whether \c attribList is in
1156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                             \c glXChooseVisual style or
1157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                             \c glXChooseFBConfig style.
1158cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns The number of valid elements left in \c configs.
11590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1160cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
1161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int
11636ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergchoose_visual(struct glx_config ** configs, int num_configs,
11640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf              const int *attribList, GLboolean fbconfig_style_tags)
11650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
11666ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config test_config;
11670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int base;
11680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
11690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This is a fairly direct implementation of the selection method
11710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * described by GLX_SGIX_fbconfig.  Start by culling out all the
11720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * configs that are not compatible with the selected parameter
11730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * list.
11740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   init_fbconfig_for_chooser(&test_config, fbconfig_style_tags);
11770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXInitializeVisualConfigFromTags(&test_config, 512,
11780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       (const INT32 *) attribList,
11790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       GL_TRUE, fbconfig_style_tags);
11800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   base = 0;
11820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < num_configs; i++) {
11830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (fbconfigs_compatible(&test_config, configs[i])) {
11840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         configs[base] = configs[i];
11850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         base++;
11860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
11870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
11880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (base == 0) {
11900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
11910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
11920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (base < num_configs) {
11940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      (void) memset(&configs[base], 0, sizeof(void *) * (num_configs - base));
11950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
11960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* After the incompatible configs are removed, the resulting
11980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * list is sorted according to the rules set out in the various
11990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * specifications.
12000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
12010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12026ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   qsort(configs, base, sizeof(struct glx_config *),
12030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (int (*)(const void *, const void *)) fbconfig_compare);
12040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return base;
1205cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1206cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1207cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1208cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1209cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1210cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1211cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return the visual that best matches the template.  Return None if no
1212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** visual matches the template.
1213cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
121438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT XVisualInfo *
12150896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXChooseVisual(Display * dpy, int screen, int *attribList)
1216cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
12170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XVisualInfo *visualList = NULL;
1218c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
121966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
12206ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config test_config;
12216ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
12226ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *best_config = NULL;
1223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1225cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Get a list of all visuals, return if list is empty
1226cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
12270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
12280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
12290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1230cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1233cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Build a template from the defaults and the attribute list
1234cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Free visual list and return if an unexpected token is encountered
1235cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
12360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   init_fbconfig_for_chooser(&test_config, GL_FALSE);
12370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXInitializeVisualConfigFromTags(&test_config, 512,
12380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       (const INT32 *) attribList,
12390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       GL_TRUE, GL_FALSE);
1240cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1242cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Eliminate visuals that don't meet minimum requirements
1243cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Compute a score for those that do
1244cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Remember which visual, if any, got the highest score
124546b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** If no visual is acceptable, return None
124646b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** Otherwise, create an XVisualInfo list with just the selected X visual
124746b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** and return this.
1248cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
12496ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   for (config = psc->visuals; config != NULL; config = config->next) {
12506ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (fbconfigs_compatible(&test_config, config)
12516ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg          && ((best_config == NULL) ||
12526ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg              (fbconfig_compare (&config, &best_config) < 0))) {
12530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XVisualInfo visualTemplate;
12540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XVisualInfo *newList;
12550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         int i;
12560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         visualTemplate.screen = screen;
12586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         visualTemplate.visualid = config->visualID;
12590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         newList = XGetVisualInfo(dpy, VisualScreenMask | VisualIDMask,
12600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                  &visualTemplate, &i);
12610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (newList) {
12630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            Xfree(visualList);
12640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            visualList = newList;
12656ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg            best_config = config;
12660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
12670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
12680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
126977c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
1270ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
1271ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if(visualList && getenv("LIBGL_DUMP_VISUALID")) {
1272ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      printf("visualid 0x%lx\n", visualList[0].visualid);
1273ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
1274ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1275ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
12760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return visualList;
1277cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1278cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
128038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
12810896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryExtensionsString(Display * dpy, int screen)
1282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
128366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1284c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
1285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
12870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
12880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1289cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!psc->effectiveGLXexts) {
12910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!psc->serverGLXexts) {
12920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         psc->serverGLXexts =
12930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            __glXQueryServerString(dpy, priv->majorOpcode, screen,
12940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   GLX_EXTENSIONS);
12950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __glXCalculateUsableExtensions(psc,
129880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
12990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     (psc->driScreen != NULL),
1300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
13010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     GL_FALSE,
1302cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
13030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     priv->minorVersion);
13040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1305cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return psc->effectiveGLXexts;
1307cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1308cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
130938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
13100896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetClientString(Display * dpy, int name)
1311cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
131226b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick   (void) dpy;
131326b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
13140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (name) {
13150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VENDOR:
13160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGLXClientVendorName);
13170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VERSION:
13180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGLXClientVersion);
13190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_EXTENSIONS:
13200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGetClientExtensions());
13210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
13220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
13230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1324cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1325cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
132638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
13270896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryServerString(Display * dpy, int screen, int name)
1328cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
132966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1330c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
13310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   const char **str;
1332cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1333cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
13350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
13360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1337cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (name) {
13390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VENDOR:
13400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &priv->serverGLXvendor;
13410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
13420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VERSION:
13430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &priv->serverGLXversion;
13440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
13450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_EXTENSIONS:
13460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &psc->serverGLXexts;
13470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
13480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
13490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
13500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1351cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (*str == NULL) {
13530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *str = __glXQueryServerString(dpy, priv->majorOpcode, screen, name);
13540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
13550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return *str;
1357cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1358cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófvoid
13600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXClientInfo(Display * dpy, int opcode)
1361cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
13620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   char *ext_str = __glXGetClientGLExtensionString();
13630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int size = strlen(ext_str) + 1;
136466db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf
136566db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#ifdef USE_XCB
136666db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf   xcb_connection_t *c = XGetXCBConnection(dpy);
136766db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf   xcb_glx_client_info(c,
13680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       GLX_MAJOR_VERSION, GLX_MINOR_VERSION, size, ext_str);
136966db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#else
13700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXClientInfoReq *req;
13710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXClientInfo request */
13730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
13740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXClientInfo, req);
13750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
13760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXClientInfo;
13770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->major = GLX_MAJOR_VERSION;
13780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->minor = GLX_MINOR_VERSION;
13790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->length += (size + 3) >> 2;
13810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->numbytes = size;
13820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Data(dpy, ext_str, size);
13830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
13850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
138666db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#endif /* USE_XCB */
138766db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf
13880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(ext_str);
1389cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1390cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1391cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1392cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1393cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** EXT_import_context
1394cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
1395cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
139638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Display *
13970896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetCurrentDisplay(void)
1398cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1399c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
14000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (NULL == gc)
14010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
14020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc->currentDpy;
1403cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1404cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
140538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
14060896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(Display *, glXGetCurrentDisplayEXT, (void), (),
14070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          glXGetCurrentDisplay)
1408cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1409ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
141038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
14116ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian HøgsbergglXImportContextEXT(Display *dpy, GLXContextID contextID)
14120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
1413c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = __glXInitialize(dpy);
14145a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   struct glx_screen *psc = NULL;
14150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXQueryContextReply reply;
14160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
1417c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx;
14185a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick
14195a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   /* This GLX implementation knows about 5 different properties, so
14205a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick    * allow the server to send us one of each.
14215a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick    */
14225a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   int propList[5 * 2], *pProp, nPropListBytes;
14235a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   int numProps;
14246ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   int i, renderType;
14256ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   XID share;
14266ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *mode;
14275a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   uint32_t fbconfigID = 0;
14285a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   uint32_t visualID = 0;
14295a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   uint32_t screen;
14305a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   Bool got_screen = False;
14316ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
14326ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (contextID == None || __glXIsDirect(dpy, contextID))
14336ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
14340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
14366ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (!opcode)
14370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
14380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXQueryContextInfoEXT request */
14400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
14410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14426ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (priv->majorVersion > 1 || priv->minorVersion >= 3) {
14430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXQueryContextReq *req;
14440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReq(GLXQueryContext, req);
14460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
14480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXQueryContext;
14496ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      req->context = contextID;
14500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
14510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
14520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXVendorPrivateReq *vpreq;
14530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXQueryContextInfoEXTReq *req;
14540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReqExtra(GLXVendorPrivate,
14566ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg		  sz_xGLXQueryContextInfoEXTReq - sz_xGLXVendorPrivateReq,
14576ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg		  vpreq);
14580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req = (xGLXQueryContextInfoEXTReq *) vpreq;
14590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
14600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXVendorPrivateWithReply;
14610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->vendorCode = X_GLXvop_QueryContextInfoEXT;
14626ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      req->context = contextID;
14630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
14640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReply(dpy, (xReply *) & reply, 0, False);
14660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14676ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (reply.n <= __GLX_MAX_CONTEXT_PROPS)
14686ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      nPropListBytes = reply.n * 2 * sizeof propList[0];
14696ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   else
14706ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      nPropListBytes = 0;
14716ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   _XRead(dpy, (char *) propList, nPropListBytes);
14720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
14730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
14746ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
14755a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   numProps = nPropListBytes / (2 * sizeof(propList[0]));
14766ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   share = None;
14776ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   mode = NULL;
14786ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   renderType = 0;
14796ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   pProp = propList;
14806ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
14815a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   for (i = 0, pProp = propList; i < numProps; i++, pProp += 2)
14826ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      switch (pProp[0]) {
14835a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      case GLX_SCREEN:
14845a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 screen = pProp[1];
14855a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 got_screen = True;
14865a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 break;
14876ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_SHARE_CONTEXT_EXT:
14886ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 share = pProp[1];
14896ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
14906ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_VISUAL_ID_EXT:
14915a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 visualID = pProp[1];
14926ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
14936ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_FBCONFIG_ID:
14945a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 fbconfigID = pProp[1];
14956ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
14966ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_RENDER_TYPE:
14976ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 renderType = pProp[1];
14986ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
14996ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      }
15006ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
15015a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   if (!got_screen)
15025a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      return NULL;
15035a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick
15045a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   psc = GetGLXScreenConfigs(dpy, screen);
15055a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   if (psc == NULL)
15065a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      return NULL;
15075a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick
15085a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   if (fbconfigID != 0) {
15095a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      mode = glx_config_find_fbconfig(psc->configs, fbconfigID);
15105a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   } else if (visualID != 0) {
15115a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      mode = glx_config_find_visual(psc->visuals, visualID);
15125a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   }
15135a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick
15146ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (mode == NULL)
15156ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
15166ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
15176ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx = indirect_create_context(psc, mode, NULL, renderType);
15186ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (ctx == NULL)
15196ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
15206ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
15216ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->xid = contextID;
15226ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->imported = GL_TRUE;
15236ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->share_xid = share;
15246ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
1525c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   return (GLXContext) ctx;
1526cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1527cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1528ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1529ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
153038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
1531c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergglXQueryContext(Display * dpy, GLXContext ctx_user, int attribute, int *value)
1532cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1533c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx = (struct glx_context *) ctx_user;
1534c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
15350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (attribute) {
1536ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GLX_SHARE_CONTEXT_EXT:
15376ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->share_xid;
15380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VISUAL_ID_EXT:
15406ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      *value = ctx->config ? ctx->config->visualID : None;
15410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_SCREEN:
15436ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->screen;
15440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_FBCONFIG_ID:
15466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      *value = ctx->config ? ctx->config->fbconfigID : None;
15470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_RENDER_TYPE:
15496ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->renderType;
15500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
15520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_ATTRIBUTE;
15530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
15540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return Success;
1555cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1556cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
155738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
15580896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(int, glXQueryContextInfoEXT,
15590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (Display * dpy, GLXContext ctx, int attribute, int *value),
15600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (dpy, ctx, attribute, value), glXQueryContext)
1561cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1562c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg_X_EXPORT GLXContextID glXGetContextIDEXT(const GLXContext ctx_user)
1563cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1564c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx = (struct glx_context *) ctx_user;
1565c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
15660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return ctx->xid;
1567cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1568cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15699e2bc5d4b0385e374e06c0b26db266067a723bf3Adam Jackson_X_EXPORT
15709e2bc5d4b0385e374e06c0b26db266067a723bf3Adam JacksonGLX_ALIAS_VOID(glXFreeContextEXT, (Display *dpy, GLXContext ctx), (dpy, ctx),
15719e2bc5d4b0385e374e06c0b26db266067a723bf3Adam Jackson	       glXDestroyContext);
1572cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
157338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfig *
15740896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXChooseFBConfig(Display * dpy, int screen,
15750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  const int *attribList, int *nitems)
1576cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
15776ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config **config_list;
15780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int list_size;
1579cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1580cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15816ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   config_list = (struct glx_config **)
15820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      glXGetFBConfigs(dpy, screen, &list_size);
1583cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((config_list != NULL) && (list_size > 0) && (attribList != NULL)) {
15850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      list_size = choose_visual(config_list, list_size, attribList, GL_TRUE);
15860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (list_size == 0) {
15870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XFree(config_list);
15880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         config_list = NULL;
15890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
15900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1591cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *nitems = list_size;
15930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return (GLXFBConfig *) config_list;
1594cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1595cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1596cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
159738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
15986ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXCreateNewContext(Display * dpy, GLXFBConfig fbconfig,
15990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                    int renderType, GLXContext shareList, Bool allowDirect)
1600cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
16016ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
16027bcfb66000557a0ef32bdc6b31949a92f95a9ff6Ian Romanick
16036ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return CreateContext(dpy, config->fbconfigID, config, shareList,
16046ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			allowDirect, X_GLXCreateNewContext, renderType,
16056ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			config->screen);
1606cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1607cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1608cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
160938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXDrawable
16100896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetCurrentReadDrawable(void)
1611cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1612c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1613c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
16140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc->currentReadable;
1615cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1616cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1617cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
161838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfig *
16190896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetFBConfigs(Display * dpy, int screen, int *nelements)
1620cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1621c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = __glXInitialize(dpy);
16226ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config **config_list = NULL;
16236ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
16246ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   unsigned num_configs = 0;
16250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
1626cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *nelements = 0;
162866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   if (priv && (priv->screens != NULL)
16290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && (screen >= 0) && (screen <= ScreenCount(dpy))
163066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg       && (priv->screens[screen]->configs != NULL)
163166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg       && (priv->screens[screen]->configs->fbconfigID
163271a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick	   != (int) GLX_DONT_CARE)) {
1633cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
163466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      for (config = priv->screens[screen]->configs; config != NULL;
16356ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg           config = config->next) {
16366ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         if (config->fbconfigID != (int) GLX_DONT_CARE) {
16370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            num_configs++;
16380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
16390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1640cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16416ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config_list = Xmalloc(num_configs * sizeof *config_list);
16426ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (config_list != NULL) {
16430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *nelements = num_configs;
16440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         i = 0;
164566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg         for (config = priv->screens[screen]->configs; config != NULL;
16466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg              config = config->next) {
16476ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg            if (config->fbconfigID != (int) GLX_DONT_CARE) {
16486ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg               config_list[i] = config;
16490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               i++;
16500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            }
16510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
16520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
16530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
16546ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg
16556ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return (GLXFBConfig *) config_list;
1656cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1657cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1658cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
165938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
16606ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXGetFBConfigAttrib(Display * dpy, GLXFBConfig fbconfig,
16610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                     int attribute, int *value)
1662cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
16636ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = ValidateGLXFBConfig(dpy, fbconfig);
16646ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg
16656ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if (config == NULL)
16666ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      return GLXBadFBConfig;
1667cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16686ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return glx_config_get(config, attribute, value);
1669cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1670cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1671cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
167238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT XVisualInfo *
16736ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXGetVisualFromFBConfig(Display * dpy, GLXFBConfig fbconfig)
1674cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
16750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XVisualInfo visualTemplate;
16766ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
16770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int count;
1678cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1680cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Get a list of all visuals, return if list is empty
1681cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
16826ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   visualTemplate.visualid = config->visualID;
16830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return XGetVisualInfo(dpy, VisualIDMask, &visualTemplate, &count);
1684cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1685cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1686ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
1687cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1688cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGI_swap_control
1689cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
16900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
16910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapIntervalSGI(int interval)
1692cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1693cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   xGLXVendorPrivateReq *req;
1694c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
169566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
16960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Display *dpy;
16970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *interval_ptr;
1698cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   CARD8 opcode;
1699cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
17000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gc == NULL) {
1701cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return GLX_BAD_CONTEXT;
1702cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
17030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (interval <= 0) {
1705cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return GLX_BAD_VALUE;
1706cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
1707cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1708efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
1709efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
171016f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
1711c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (gc->isDirect && psc->driScreen && psc->driScreen->setSwapInterval) {
1712eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg      __GLXDRIdrawable *pdraw =
1713eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	 GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1714efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc->driScreen->setSwapInterval(pdraw, interval);
1715efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      return 0;
1716efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
171716f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
1718efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1719cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   dpy = gc->currentDpy;
1720cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   opcode = __glXSetupForCommand(dpy);
1721cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   if (!opcode) {
1722cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return 0;
1723cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
1724cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1725cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* Send the glXSwapIntervalSGI request */
1726cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   LockDisplay(dpy);
17270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(GLXVendorPrivate, sizeof(CARD32), req);
1728cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->reqType = opcode;
1729cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->glxCode = X_GLXVendorPrivate;
1730cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->vendorCode = X_GLXvop_SwapIntervalSGI;
1731cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->contextTag = gc->currentContextTag;
1732cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1733a70d56485a2d0f15ee5b660e8931eb8657535e2dIan Romanick   interval_ptr = (CARD32 *) (req + 1);
1734cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   *interval_ptr = interval;
1735cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1736cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   UnlockDisplay(dpy);
1737cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   SyncHandle();
1738cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   XFlush(dpy);
1739cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1740cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
1741cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1742cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1743cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1744cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1745cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_MESA_swap_control
1746cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
17470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
17480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapIntervalMESA(unsigned int interval)
1749cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1750089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#ifdef GLX_DIRECT_RENDERING
1751c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1752cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1753c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (gc != NULL && gc->isDirect) {
175466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
1755efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1756efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
1757efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      if (psc->driScreen && psc->driScreen->setSwapInterval) {
1758eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg         __GLXDRIdrawable *pdraw =
1759eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	    GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1760089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	 return psc->driScreen->setSwapInterval(pdraw, interval);
1761efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      }
1762efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
176316f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
1764efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1765cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
1766cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1767841a823d6ded26585aaecbc69a937b1ece8fccb2Brian Paul
17680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
17700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetSwapIntervalMESA(void)
1771cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1772089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#ifdef GLX_DIRECT_RENDERING
1773c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1774cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1775c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (gc != NULL && gc->isDirect) {
177666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
1777efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1778efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
1779efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      if (psc->driScreen && psc->driScreen->getSwapInterval) {
1780eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg         __GLXDRIdrawable *pdraw =
1781eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	    GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1782efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes	 return psc->driScreen->getSwapInterval(pdraw);
1783efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      }
1784efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
178567776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1786cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1787cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
1788cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1789cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1790cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1791cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1792cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGI_video_sync
1793cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
17940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
17950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetVideoSyncSGI(unsigned int *count)
1796cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1797daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int64_t ust, msc, sbc;
1798daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int ret;
1799c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
180066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
180167776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1802daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
180367776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1804daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
180516f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee   if (!gc)
1806daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return GLX_BAD_CONTEXT;
1807daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
180816f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
1809c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (!gc->isDirect)
181016f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return GLX_BAD_CONTEXT;
181116f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
181216f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
1813daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   psc = GetGLXScreenConfigs(gc->currentDpy, gc->screen);
181467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1815eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
181667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1817daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
1818cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* FIXME: Looking at the GLX_SGI_video_sync spec in the extension registry,
1819cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * FIXME: there should be a GLX encoding for this call.  I can find no
1820cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * FIXME: documentation for the GLX encoding.
1821cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
182267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1823daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->getDrawableMSC) {
1824daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->getDrawableMSC(psc, pdraw, &ust, &msc, &sbc);
1825daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      *count = (unsigned) msc;
1826daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (ret == True) ? 0 : GLX_BAD_CONTEXT;
1827daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
182867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1829daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
1830cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
1831cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1832cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
18340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
1835cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1836c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
183766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
183867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1839daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
184067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1841daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int64_t ust, msc, sbc;
1842daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int ret;
1843cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor <= 0 || remainder < 0)
18450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_VALUE;
1846cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
184716f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee   if (!gc)
1848daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return GLX_BAD_CONTEXT;
1849daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
185016f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
1851c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (!gc->isDirect)
185216f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return GLX_BAD_CONTEXT;
185316f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
185416f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
1855daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
185667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1857eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
185867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1859daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
186067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1861daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->waitForMSC) {
1862daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForMSC(pdraw, 0, divisor, remainder, &ust, &msc,
1863daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes				       &sbc);
1864daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      *count = (unsigned) msc;
1865daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (ret == True) ? 0 : GLX_BAD_CONTEXT;
1866daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
186767776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1868daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
1869cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
1870cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1871cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1872ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
1873cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1874cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1875cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_fbconfig
1876cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Many of these functions are aliased to GLX 1.3 entry points in the
1877cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_functions table.
1878cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
1879cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
188038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
18810896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(int, glXGetFBConfigAttribSGIX,
18820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (Display * dpy, GLXFBConfigSGIX config, int attribute, int *value),
18830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (dpy, config, attribute, value), glXGetFBConfigAttrib)
1884cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
188538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLX_ALIAS(GLXFBConfigSGIX *, glXChooseFBConfigSGIX,
1886ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (Display * dpy, int screen, int *attrib_list,
1887ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                  int *nelements), (dpy, screen, attrib_list, nelements),
1888ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 glXChooseFBConfig)
1889cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
189038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLX_ALIAS(XVisualInfo *, glXGetVisualFromFBConfigSGIX,
1891ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (Display * dpy, GLXFBConfigSGIX config),
1892ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (dpy, config), glXGetVisualFromFBConfig)
1893cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
189438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
1895ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian PaulglXCreateGLXPixmapWithConfigSGIX(Display * dpy,
18966ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                                 GLXFBConfigSGIX fbconfig,
1897ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                                 Pixmap pixmap)
1898cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1899ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
19000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXVendorPrivateWithReplyReq *vpreq;
19010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXCreateGLXPixmapWithConfigSGIXReq *req;
19020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXPixmap xid = None;
19030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
190466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1905ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
19066ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
1907cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1908cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((dpy == NULL) || (config == NULL)) {
19100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
19110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1912ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
19136ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if(apple_glx_pixmap_create(dpy, config->screen, pixmap, config))
1914ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return None;
1915ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return pixmap;
1916ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
1917cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19186ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   psc = GetGLXScreenConfigs(dpy, config->screen);
19190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((psc != NULL)
19200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)) {
19210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      opcode = __glXSetupForCommand(dpy);
19220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!opcode) {
19230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return None;
19240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1925cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Send the glXCreateGLXPixmapWithConfigSGIX request */
19270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      LockDisplay(dpy);
19280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReqExtra(GLXVendorPrivateWithReply,
19290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  sz_xGLXCreateGLXPixmapWithConfigSGIXReq -
19300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  sz_xGLXVendorPrivateWithReplyReq, vpreq);
19310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req = (xGLXCreateGLXPixmapWithConfigSGIXReq *) vpreq;
19320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
19330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXVendorPrivateWithReply;
19340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->vendorCode = X_GLXvop_CreateGLXPixmapWithConfigSGIX;
19356ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      req->screen = config->screen;
19366ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      req->fbconfig = config->fbconfigID;
19370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->pixmap = pixmap;
19380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxpixmap = xid = XAllocID(dpy);
19390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
19400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
19410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1942cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return xid;
1944ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1945cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1946cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
194738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
19480896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateContextWithConfigSGIX(Display * dpy,
19496ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                               GLXFBConfigSGIX fbconfig, int renderType,
19500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                               GLXContext shareList, Bool allowDirect)
1951cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
19520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContext gc = NULL;
19536ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
195466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1955cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1956cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((dpy == NULL) || (config == NULL)) {
19580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
19590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1960cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19616ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   psc = GetGLXScreenConfigs(dpy, config->screen);
19620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((psc != NULL)
19630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)) {
19646ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      gc = CreateContext(dpy, config->fbconfigID, config, shareList,
19652243029eeec9e31b92079ff0e8fafdc0315053d6Ian Romanick                         allowDirect,
19667bcfb66000557a0ef32bdc6b31949a92f95a9ff6Ian Romanick			 X_GLXvop_CreateContextWithConfigSGIX, renderType,
19676ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			 config->screen);
19680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1969cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc;
1971cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1972cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1973cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
197438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfigSGIX
19750896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis)
1976cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1977c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
197866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = NULL;
1979cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1980fc48de4fabcf3a42a1cd7d447790afefc7d27af8Stéphane Marchesin   if ((GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc) == Success)
19810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)
198271a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick       && (psc->configs->fbconfigID != (int) GLX_DONT_CARE)) {
19836ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      return (GLXFBConfigSGIX) glx_config_find_visual(psc->configs,
19846ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg						      vis->visualid);
19850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1986cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return NULL;
1988cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1989cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1990ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
1991cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1992cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_swap_group
1993cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
19940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
19950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXJoinSwapGroupSGIX(Display * dpy, GLXDrawable drawable,
19960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       GLXDrawable member)
1997cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1998cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
1999cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) drawable;
2000cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) member;
2001cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2002cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2003cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2004cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2005cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_swap_barrier
2006cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
20070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
20080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXBindSwapBarrierSGIX(Display * dpy, GLXDrawable drawable, int barrier)
2009cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2010cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2011cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) drawable;
2012cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) barrier;
2013cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2014cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
20160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXQueryMaxSwapBarriersSGIX(Display * dpy, int screen, int *max)
2017cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2018cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2019cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) screen;
2020cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) max;
2021cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2022cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2023cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2024cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2025cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2026cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_OML_sync_control
2027cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
20280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
20290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetSyncValuesOML(Display * dpy, GLXDrawable drawable,
20300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                      int64_t * ust, int64_t * msc, int64_t * sbc)
2031cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2032c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display * const priv = __glXInitialize(dpy);
2033eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   int ret;
203467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2035daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
203667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
203766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
20380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2039daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (!priv)
2040daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return False;
20410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
204267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2043eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(dpy, drawable);
2044eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   psc = pdraw ? pdraw->psc : NULL;
2045eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   if (pdraw && psc->driScreen->getDrawableMSC) {
2046daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->getDrawableMSC(psc, pdraw, ust, msc, sbc);
2047daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2048daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
204967776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2050daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2051cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2052cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2053cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
205480b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
20553d28a2690f3752990be50a25447747e237d7bee9Kristian Høgsberg_X_HIDDEN GLboolean
20567a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg__glxGetMscRate(__GLXDRIdrawable *glxDraw,
20577a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg		int32_t * numerator, int32_t * denominator)
2058286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg{
2059286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg#ifdef XF86VIDMODE
206066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
20610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XF86VidModeModeLine mode_line;
20620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int dot_clock;
20630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
206426b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
20650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psc = glxDraw->psc;
20660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (XF86VidModeQueryVersion(psc->dpy, &i, &i) &&
20670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       XF86VidModeGetModeLine(psc->dpy, psc->scr, &dot_clock, &mode_line)) {
20680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      unsigned n = dot_clock * 1000;
20690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      unsigned d = mode_line.vtotal * mode_line.htotal;
20700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2071286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg# define V_INTERLACE 0x010
2072286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg# define V_DBLSCAN   0x020
2073286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg
20740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (mode_line.flags & V_INTERLACE)
20750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         n *= 2;
20760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else if (mode_line.flags & V_DBLSCAN)
20770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         d *= 2;
20780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
20790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* The OML_sync_control spec requires that if the refresh rate is a
20800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       * whole number, that the returned numerator be equal to the refresh
20810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       * rate and the denominator be 1.
20820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       */
20830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
20840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (n % d == 0) {
20850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         n /= d;
20860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         d = 1;
20870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
20880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {
20890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         static const unsigned f[] = { 13, 11, 7, 5, 3, 2, 0 };
20900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
20910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         /* This is a poor man's way to reduce a fraction.  It's far from
20920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          * perfect, but it will work well enough for this situation.
20930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          */
20940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
20950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         for (i = 0; f[i] != 0; i++) {
20960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            while (n % f[i] == 0 && d % f[i] == 0) {
20970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               d /= f[i];
20980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               n /= f[i];
20990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            }
21000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
21010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
21020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
21030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *numerator = n;
21040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *denominator = d;
21050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
21060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return True;
21070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
21080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else
210957d3f71132a59315d47c42a110228a523f9ea23dKristian Høgsberg#endif
211026b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
21110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return False;
2112286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg}
2113286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg#endif
2114cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2115cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2116cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine the refresh rate of the specified drawable and display.
21170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2118cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy          Display whose refresh rate is to be determined.
2119cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param drawable     Drawable whose refresh rate is to be determined.
2120cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param numerator    Numerator of the refresh rate.
2121cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param demoninator  Denominator of the refresh rate.
2122cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \return  If the refresh rate for the specified display and drawable could
2123cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          be calculated, True is returned.  Otherwise False is returned.
21240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2125cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \note This function is implemented entirely client-side.  A lot of other
2126cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       functionality is required to export GLX_OML_sync_control, so on
2127cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       XFree86 this function can be called for direct-rendering contexts
2128cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       when GLX_OML_sync_control appears in the client extension string.
2129cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
2130cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN GLboolean
21320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
21330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int32_t * numerator, int32_t * denominator)
2134cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2135cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if defined( GLX_DIRECT_RENDERING ) && defined( XF86VIDMODE )
2136eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *draw = GetGLXDRIDrawable(dpy, drawable);
2137cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (draw == NULL)
21390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
2140cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21417a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg   return __glxGetMscRate(draw, numerator, denominator);
2142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
2143286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg   (void) dpy;
2144286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg   (void) drawable;
2145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) numerator;
2146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) denominator;
2147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2148cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2149cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2151cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int64_t
21530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable,
21540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       int64_t target_msc, int64_t divisor, int64_t remainder)
2155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2156c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
215767776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2158eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
215966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
216067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
216267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee   if (!gc) /* no GLX for this */
2163daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return -1;
2164daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
216516f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
2166c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (!pdraw || !gc->isDirect)
216716f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return -1;
216816f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
216916f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
2170cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
2171cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but it also says "It [glXSwapBuffersMscOML] will return a value
2172cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * of -1 if the function failed because of errors detected in the input
2173cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * parameters"
2174cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
21750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor < 0 || remainder < 0 || target_msc < 0)
2176cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return -1;
21770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor > 0 && remainder >= divisor)
2178cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return -1;
2179cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21808f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes   if (target_msc == 0 && divisor == 0 && remainder == 0)
21818f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes      remainder = 1;
21828f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes
2183daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes#ifdef GLX_DIRECT_RENDERING
2184daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->swapBuffers)
2185daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (*psc->driScreen->swapBuffers)(pdraw, target_msc, divisor,
2186daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes					    remainder);
2187cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2188daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2189daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   return -1;
2190cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2191cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2192cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
21940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitForMscOML(Display * dpy, GLXDrawable drawable,
21950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t target_msc, int64_t divisor,
21960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t remainder, int64_t * ust,
21970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t * msc, int64_t * sbc)
2198cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
219967776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2200eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
220166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
22020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int ret;
2203ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#endif
2204cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2205daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2206cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
2207cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but the return type in the spec is Bool.
2208cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
22090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor < 0 || remainder < 0 || target_msc < 0)
2210cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
22110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor > 0 && remainder >= divisor)
2212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
2213cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
221467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2215daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (pdraw && psc->driScreen && psc->driScreen->waitForMSC) {
2216daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForMSC(pdraw, target_msc, divisor, remainder,
2217daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes				       ust, msc, sbc);
2218daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2219daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
222067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2221daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2222cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2224cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2225cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
22270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitForSbcOML(Display * dpy, GLXDrawable drawable,
22280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t target_sbc, int64_t * ust,
22290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t * msc, int64_t * sbc)
2230cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
223167776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2232eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
223366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
22340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int ret;
2235ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#endif
2236cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2237cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says this should "generate a GLX_BAD_VALUE
2238cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but the return type in the spec is Bool.
2239cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
22400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (target_sbc < 0)
2241cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
224267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee
224367776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2244251bf298bfddd06c6d6cd4b03ba9aadfc02e2895kleinerm   if (pdraw && psc->driScreen && psc->driScreen->waitForSBC) {
2245daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForSBC(pdraw, target_sbc, ust, msc, sbc);
2246daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2247daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
224867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
224967776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee
2250cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2251cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2252cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2253cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*@}*/
2254cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2255cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2256cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2257cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Mesa extension stubs.  These will help reduce portability problems.
2258cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
2259cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*@{*/
2260cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2261cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2262cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Release all buffers associated with the specified GLX drawable.
2263cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2264cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \todo
2265cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function was intended for stand-alone Mesa.  The issue there is that
2266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * the library doesn't get any notification when a window is closed.  In
2267cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * DRI there is a similar but slightly different issue.  When GLX 1.3 is
2268cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * supported, there are 3 different functions to destroy a drawable.  It
2269cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * should be possible to create GLX protocol (or have it determine which
2270cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * protocol to use based on the type of the drawable) to have one function
2271cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * do the work of 3.  For the direct-rendering case, this function could
2272cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * just call the driver's \c __DRIdrawableRec::destroyDrawable function.
2273cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This would reduce the frequency with which \c __driGarbageCollectDrawables
2274cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * would need to be used.  This really should be done as part of the new DRI
2275cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * interface work.
2276cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2277cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa http://oss.sgi.com/projects/ogl-sample/registry/MESA/release_buffers.txt
2278cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     __driGarbageCollectDrawables
2279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyGLXPixmap
2280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyPbuffer glXDestroyPixmap glXDestroyWindow
2281cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyGLXPbufferSGIX glXDestroyGLXVideoSourceSGIX
2282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
22830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
22840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXReleaseBuffersMESA(Display * dpy, GLXDrawable d)
2285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2286cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2287cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) d;
2288cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2289cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2290cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2291cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
229238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
22930896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateGLXPixmapMESA(Display * dpy, XVisualInfo * visual,
22940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       Pixmap pixmap, Colormap cmap)
2295cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2297cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) visual;
2298cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) pixmap;
2299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) cmap;
2300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
2301cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
23020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2303fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/*@}*/
2304cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2305fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick
2306fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/**
2307fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick * GLX_MESA_copy_sub_buffer
2308fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick */
2309f2ad1b60c0da11283b399008f491792790cea294Brian Paul#define X_GLXvop_CopySubBufferMESA 5154 /* temporary */
23100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
23110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable,
23120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       int x, int y, int width, int height)
2313cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
23140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXVendorPrivateReq *req;
2315c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc;
23160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContextTag tag;
23170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *drawable_ptr;
23180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   INT32 *x_ptr, *y_ptr, *w_ptr, *h_ptr;
23190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
2320f2ad1b60c0da11283b399008f491792790cea294Brian Paul
23212235b1c72d79ec00a03c99219154e3f9103e692bKristian Høgsberg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2322eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
23230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (pdraw != NULL) {
232466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc = pdraw->psc;
23250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (psc->driScreen->copySubBuffer != NULL) {
23260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         glFlush();
23270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (*psc->driScreen->copySubBuffer) (pdraw, x, y, width, height);
23280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
23290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
23310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2332f2ad1b60c0da11283b399008f491792790cea294Brian Paul#endif
2333f2ad1b60c0da11283b399008f491792790cea294Brian Paul
23340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
23350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode)
23360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
2337cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
23380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
2339f2ad1b60c0da11283b399008f491792790cea294Brian Paul    ** The calling thread may or may not have a current context.  If it
2340f2ad1b60c0da11283b399008f491792790cea294Brian Paul    ** does, send the context tag so the server can do a flush.
2341f2ad1b60c0da11283b399008f491792790cea294Brian Paul    */
23420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc = __glXGetCurrentContext();
23430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((gc != NULL) && (dpy == gc->currentDpy) &&
23440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       ((drawable == gc->currentDrawable) ||
23450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        (drawable == gc->currentReadable))) {
23460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = gc->currentContextTag;
23470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
23480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
23490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = 0;
23500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
23510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
23530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32) * 4, req);
23540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
23550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXVendorPrivate;
23560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->vendorCode = X_GLXvop_CopySubBufferMESA;
23570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = tag;
23580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drawable_ptr = (CARD32 *) (req + 1);
23600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   x_ptr = (INT32 *) (drawable_ptr + 1);
23610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   y_ptr = (INT32 *) (drawable_ptr + 2);
23620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   w_ptr = (INT32 *) (drawable_ptr + 3);
23630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   h_ptr = (INT32 *) (drawable_ptr + 4);
23640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *drawable_ptr = drawable;
23660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *x_ptr = x;
23670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *y_ptr = y;
23680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *w_ptr = width;
23690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *h_ptr = height;
23700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
23720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
2373f2ad1b60c0da11283b399008f491792790cea294Brian Paul}
2374cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2375643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg/*@{*/
2376643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void
2377643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg__glXBindTexImageEXT(Display * dpy,
2378643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg                     GLXDrawable drawable, int buffer, const int *attrib_list)
2379643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{
2380c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
2381643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
23823ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg   if (gc == NULL || gc->vtable->bind_tex_image == NULL)
2383643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg      return;
2384643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2385643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   gc->vtable->bind_tex_image(dpy, drawable, buffer, attrib_list);
2386643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}
2387643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2388643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void
2389643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg__glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
2390643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{
2391c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
2392643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
23933ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg   if (gc == NULL || gc->vtable->release_tex_image == NULL)
2394643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg      return;
2395643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2396643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   gc->vtable->release_tex_image(dpy, drawable, buffer);
2397643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}
2398643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2399fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/*@}*/
2400cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2401ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
2402ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
2403cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2404cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c strdup is actually not a standard ANSI C or POSIX routine.
2405cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Irix will not define it if ANSI mode is in effect.
24060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2407cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa strdup
2408cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
24093d28a2690f3752990be50a25447747e237d7bee9Kristian Høgsberg_X_HIDDEN char *
2410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson__glXstrdup(const char *str)
2411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2412cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   char *copy;
2413cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   copy = (char *) Xmalloc(strlen(str) + 1);
2414cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   if (!copy)
2415cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return NULL;
2416cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   strcpy(copy, str);
2417cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return copy;
2418cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2419cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2420cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2421cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** glXGetProcAddress support
2422cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
2423cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
24240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstruct name_address_pair
24250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
2426cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   const char *Name;
2427cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   GLvoid *Address;
2428cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson};
2429cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2430cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define GLX_FUNCTION(f) { # f, (GLvoid *) f }
2431cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define GLX_FUNCTION2(n,f) { # n, (GLvoid *) f }
2432cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2433cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic const struct name_address_pair GLX_functions[] = {
2434cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_0 ***/
24350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXChooseVisual),
24360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCopyContext),
24370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateContext),
24380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmap),
24390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyContext),
24400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyGLXPixmap),
24410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetConfig),
24420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentContext),
24430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentDrawable),
24440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXIsDirect),
24450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXMakeCurrent),
24460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryExtension),
24470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryVersion),
24480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSwapBuffers),
24490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXUseXFont),
24500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXWaitGL),
24510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXWaitX),
2452cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2453cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_1 ***/
24540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetClientString),
24550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryExtensionsString),
24560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryServerString),
2457cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2458cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_2 ***/
24590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentDisplay),
2460cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2461cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_3 ***/
24620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXChooseFBConfig),
24630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateNewContext),
24640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreatePbuffer),
24650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreatePixmap),
24660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateWindow),
24670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyPbuffer),
24680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyPixmap),
24690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyWindow),
24700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentReadDrawable),
24710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigAttrib),
24720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigs),
24730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetSelectedEvent),
24740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetVisualFromFBConfig),
24750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXMakeContextCurrent),
24760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryContext),
24770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryDrawable),
24780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSelectEvent),
2479cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2480ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2481cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_swap_control ***/
24820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapIntervalSGI, __glXSwapIntervalSGI),
2483cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2484cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_video_sync ***/
24850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetVideoSyncSGI, __glXGetVideoSyncSGI),
24860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitVideoSyncSGI, __glXWaitVideoSyncSGI),
2487cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2488cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_make_current_read ***/
24890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXMakeCurrentReadSGI, glXMakeContextCurrent),
24900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetCurrentReadDrawableSGI, glXGetCurrentReadDrawable),
2491cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2492cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_EXT_import_context ***/
24930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXFreeContextEXT),
24940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetContextIDEXT),
24950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetCurrentDisplayEXT, glXGetCurrentDisplay),
24960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXImportContextEXT),
24970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXQueryContextInfoEXT, glXQueryContext),
2498ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2499cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2500cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_fbconfig ***/
25010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetFBConfigAttribSGIX, glXGetFBConfigAttrib),
25020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXChooseFBConfigSGIX, glXChooseFBConfig),
25030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmapWithConfigSGIX),
25040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateContextWithConfigSGIX),
25050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetVisualFromFBConfigSGIX, glXGetVisualFromFBConfig),
25060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigFromVisualSGIX),
2507cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2508ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2509cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_pbuffer ***/
25100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPbufferSGIX),
25110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyGLXPbufferSGIX),
25120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryGLXPbufferSGIX),
25130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSelectEventSGIX),
25140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetSelectedEventSGIX),
2515cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2516cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_swap_group ***/
25170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXJoinSwapGroupSGIX, __glXJoinSwapGroupSGIX),
2518cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2519cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_swap_barrier ***/
25200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXBindSwapBarrierSGIX, __glXBindSwapBarrierSGIX),
25210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXQueryMaxSwapBarriersSGIX, __glXQueryMaxSwapBarriersSGIX),
2522cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2523cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_copy_sub_buffer ***/
25240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXCopySubBufferMESA, __glXCopySubBufferMESA),
2525cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2526cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_pixmap_colormap ***/
25270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmapMESA),
2528cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2529cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_release_buffers ***/
25300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXReleaseBuffersMESA, __glXReleaseBuffersMESA),
2531cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2532cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_swap_control ***/
25330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapIntervalMESA, __glXSwapIntervalMESA),
25340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetSwapIntervalMESA, __glXGetSwapIntervalMESA),
2535ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2536cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2537cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_ARB_get_proc_address ***/
25380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetProcAddressARB),
2539cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2540cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX 1.4 ***/
25410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetProcAddress, glXGetProcAddressARB),
2542cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2543ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2544cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_OML_sync_control ***/
25450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitForSbcOML, __glXWaitForSbcOML),
25460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitForMscOML, __glXWaitForMscOML),
25470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapBuffersMscOML, __glXSwapBuffersMscOML),
25480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetMscRateOML, __glXGetMscRateOML),
25490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetSyncValuesOML, __glXGetSyncValuesOML),
2550cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
255142725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul   /*** GLX_EXT_texture_from_pixmap ***/
25520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXBindTexImageEXT, __glXBindTexImageEXT),
25530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXReleaseTexImageEXT, __glXReleaseTexImageEXT),
2554ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
255542725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul
255680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2557cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** DRI configuration ***/
25580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetScreenDriver),
25590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetDriverConfig),
2560cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2561cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
25620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {NULL, NULL}                 /* end of list */
2563cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson};
2564cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2565cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic const GLvoid *
2566cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonget_glx_proc_address(const char *funcName)
2567cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2568cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   GLuint i;
2569cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2570cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* try static functions */
2571cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   for (i = 0; GLX_functions[i].Name; i++) {
2572cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      if (strcmp(GLX_functions[i].Name, funcName) == 0)
25730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return GLX_functions[i].Address;
2574cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
2575cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2576cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return NULL;
2577cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2578cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2579cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2580cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the address of a named GL function.  This is the pre-GLX 1.4 name for
2581cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddress.
2582cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2583cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param procName  Name of a GL or GLX function.
2584cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns         A pointer to the named function
2585cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2586cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddress
2587cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
258838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void (*glXGetProcAddressARB(const GLubyte * procName)) (void)
2589cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
25900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   typedef void (*gl_function) (void);
2591cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   gl_function f;
2592cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2593cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2594cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* Search the table of GLX and internal functions first.  If that
2595cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * fails and the supplied name could be a valid core GL name, try
2596cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * searching the core GL function table.  This check is done to prevent
2597cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * DRI based drivers from searching the core GL function table for
2598cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * internal API functions.
2599cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
2600cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   f = (gl_function) get_glx_proc_address((const char *) procName);
26010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((f == NULL) && (procName[0] == 'g') && (procName[1] == 'l')
26020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && (procName[2] != 'X')) {
2603e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu#ifdef GLX_SHARED_GLAPI
2604e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu      f = (gl_function) __indirect_get_proc_address((const char *) procName);
2605e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu#endif
2606e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu      if (!f)
2607e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu         f = (gl_function) _glapi_get_proc_address((const char *) procName);
2608559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston      if (!f) {
2609559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston         struct glx_context *gc = __glXGetCurrentContext();
2610559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston
2611559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston         if (gc != NULL && gc->vtable->get_proc_address != NULL)
2612559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston            f = gc->vtable->get_proc_address((const char *) procName);
2613559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston      }
2614cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
2615cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return f;
2616cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2617cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2618cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2619cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the address of a named GL function.  This is the GLX 1.4 name for
2620cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddressARB.
2621cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2622cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param procName  Name of a GL or GLX function.
2623cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns         A pointer to the named function
2624cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2625cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddressARB
2626cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
262738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void (*glXGetProcAddress(const GLubyte * procName)) (void)
2628cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if defined(__GNUC__) && !defined(GLX_ALIAS_UNSUPPORTED)
26290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __attribute__ ((alias("glXGetProcAddressARB")));
2630cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
2631cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2632cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return glXGetProcAddressARB(procName);
2633cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2634cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif /* __GNUC__ */
2635cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2636cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
263780b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2638cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2639cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the unadjusted system time (UST).  Currently, the UST is measured in
2640cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * microseconds since Epoc.  The actual resolution of the UST may vary from
2641cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * system to system, and the units may vary from release to release.
2642cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Drivers should not call this function directly.  They should instead use
2643cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddress to obtain a pointer to the function.
2644cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2645cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param ust Location to store the 64-bit UST
2646cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns Zero on success or a negative errno value on failure.
26470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2648cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddress, PFNGLXGETUSTPROC
2649cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2650cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \since Internal API version 20030317.
2651cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
26520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN int
26530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetUST(int64_t * ust)
26540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
26550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   struct timeval tv;
26560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (ust == NULL) {
26580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return -EFAULT;
26590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
26600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
26610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gettimeofday(&tv, NULL) == 0) {
26620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ust[0] = (tv.tv_sec * 1000000) + tv.tv_usec;
26630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
26640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
26650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
26660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return -errno;
26670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2668cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2669cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif /* GLX_DIRECT_RENDERING */
2670