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"
40ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick#include "glx_error.h"
41df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis
42df04ffbf025994abd59e26c8439e77bb340ef20bGeorge Sapountzis#ifdef GLX_DIRECT_RENDERING
43ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
44ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx_context.h"
45ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx.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
153588042a8ec4ea91a952c07a0768516fd590758f4Ian Romanick_X_HIDDEN 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
347a832aa5ba097253f53983e3f1186b71626d164aeIan Romanick   gc->share_xid = shareList ? shareList->xid : None;
348bc7b2f0dc33753f6d6b55bd4058e82ddf0997967Ian Romanick   gc->imported = GL_FALSE;
349521e4b9b7e3c79e7362f7cbd594a2e8cf74cdfe4Brian Paul   gc->renderType = renderType;
350521e4b9b7e3c79e7362f7cbd594a2e8cf74cdfe4Brian Paul
351c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   return (GLXContext) gc;
352cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
353cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
35438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
3550896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateContext(Display * dpy, XVisualInfo * vis,
3560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                 GLXContext shareList, Bool allowDirect)
357cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
3586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = NULL;
35952cf8db428909156b062f17a9e6251a38178dec3Ian Romanick   int renderType = 0;
36052cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
361ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#if defined(GLX_DIRECT_RENDERING) || defined(GLX_USE_APPLEGL)
36266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *const psc = GetGLXScreenConfigs(dpy, vis->screen);
36352cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
3646ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   config = glx_config_find_visual(psc->visuals, vis->visualid);
3656ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if (config == NULL) {
36652cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      xError error;
36752cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
36852cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.errorCode = BadValue;
36952cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.resourceID = vis->visualid;
37052cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.sequenceNumber = dpy->request;
37152cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.type = X_Error;
37252cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.majorCode = __glXSetupForCommand(dpy);
37352cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      error.minorCode = X_GLXCreateContext;
37452cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      _XError(dpy, &error);
37552cf8db428909156b062f17a9e6251a38178dec3Ian Romanick      return None;
37652cf8db428909156b062f17a9e6251a38178dec3Ian Romanick   }
37752cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
3786ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   renderType = config->rgbMode ? GLX_RGBA_TYPE : GLX_COLOR_INDEX_TYPE;
37952cf8db428909156b062f17a9e6251a38178dec3Ian Romanick#endif
38052cf8db428909156b062f17a9e6251a38178dec3Ian Romanick
3816ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return CreateContext(dpy, vis->visualid, config, shareList, allowDirect,
38252cf8db428909156b062f17a9e6251a38178dec3Ian Romanick                        X_GLXCreateContext, renderType, vis->screen);
383cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
384cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
3854dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanickstatic void
386c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsbergglx_send_destroy_context(Display *dpy, XID xid)
387cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
388c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   CARD8 opcode = __glXSetupForCommand(dpy);
389c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   xGLXDestroyContextReq *req;
390c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
391c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   LockDisplay(dpy);
392c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   GetReq(GLXDestroyContext, req);
393c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->reqType = opcode;
394c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->glxCode = X_GLXDestroyContext;
395c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   req->context = xid;
396c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   UnlockDisplay(dpy);
397c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   SyncHandle();
398c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg}
399c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg
400cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
401cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Destroy the named context
402cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
4039e2bc5d4b0385e374e06c0b26db266067a723bf3Adam Jackson
4049e2bc5d4b0385e374e06c0b26db266067a723bf3Adam Jackson_X_EXPORT void
4059e2bc5d4b0385e374e06c0b26db266067a723bf3Adam JacksonglXDestroyContext(Display * dpy, GLXContext ctx)
406cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
407c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = (struct glx_context *) ctx;
408c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
4094dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   if (gc == NULL || gc->xid == None)
4100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
4120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXLock();
4134dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   if (!gc->imported)
4144dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick      glx_send_destroy_context(dpy, gc->xid);
4154dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick
4165e6a6a2719c695996490bde491dac267e52f78afBrian Paul   if (gc->currentDpy) {
4175e6a6a2719c695996490bde491dac267e52f78afBrian Paul      /* This context is bound to some thread.  According to the man page,
4185e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * we should not actually delete the context until it's unbound.
4195e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * Note that we set gc->xid = None above.  In MakeContextCurrent()
4205e6a6a2719c695996490bde491dac267e52f78afBrian Paul       * we check for that and delete the context there.
4215e6a6a2719c695996490bde491dac267e52f78afBrian Paul       */
422c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg      gc->xid = None;
4234dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   } else {
4244dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick      gc->vtable->destroy(gc);
4255e6a6a2719c695996490bde491dac267e52f78afBrian Paul   }
426c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg   __glXUnlock();
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);
592ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick   xcb_generic_error_t *err;
5930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_glx_is_direct_reply_t *reply = xcb_glx_is_direct_reply(c,
5940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                              xcb_glx_is_direct
5950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                                              (c, contextID),
596ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick                                                              &err);
5979c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf
5987c2f1160c23970929a2846d210357447d07ff5f0Ian Romanick   const Bool is_direct = (reply != NULL && reply->is_direct) ? True : False;
599ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick
600ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick   if (err != NULL) {
601ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick      __glXSendErrorForXcb(dpy, err);
602ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick      free(err);
603ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick   }
604ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick
6059c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf   free(reply);
6069c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf
6079c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf   return is_direct;
6089c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#else
6090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXIsDirect request */
6100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
6110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXIsDirect, req);
6120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
6130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXIsDirect;
6140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->context = contextID;
6150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReply(dpy, (xReply *) & reply, 0, False);
6160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
6170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
6180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
6190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return reply.isDirect;
6209c7aaa7afbda92587f28cc28c4c8315e7861d318RALOVICH, Kristóf#endif /* USE_XCB */
621cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
622cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
623c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick/**
624c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * \todo
625c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * Shouldn't this function \b always return \c GL_FALSE when
626c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * \c GLX_DIRECT_RENDERING is not defined?  Do we really need to bother with
627c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick * the GLX protocol here at all?
628c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick */
62938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Bool
630c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergglXIsDirect(Display * dpy, GLXContext gc_user)
631cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
632c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = (struct glx_context *) gc_user;
633c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
6340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!gc) {
6350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_FALSE;
6360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
637c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   else if (gc->isDirect) {
6380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GL_TRUE;
6390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
640a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#ifdef GLX_USE_APPLEGL  /* TODO: indirect on darwin */
641a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston      return GL_FALSE;
642a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#else
6430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return __glXIsDirect(dpy, gc->xid);
644a18702f067d060ca9d56e9fcd5d2cd1a5093177fJeremy Huddleston#endif
645cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
646cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
64738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
6480896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap)
649cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
650ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
651ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   int screen = vis->screen;
65266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *const psc = GetGLXScreenConfigs(dpy, screen);
6536ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   const struct glx_config *config;
654ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
655b7f0ed8444544b7fc927823a903db93ebf723cadJeremy Huddleston   config = glx_config_find_visual(psc->visuals, vis->visualid);
656ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
6576ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if(apple_glx_pixmap_create(dpy, vis->screen, pixmap, config))
658ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return None;
659ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
660ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return pixmap;
661ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
6620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXCreateGLXPixmapReq *req;
6634df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   struct glx_drawable *glxDraw;
6640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXPixmap xid;
6650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
666cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
6680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
6690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
6700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
671cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
6724df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   glxDraw = Xmalloc(sizeof(*glxDraw));
6734df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   if (!glxDraw)
6744df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      return None;
6754df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
6760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXCreateGLXPixmap request */
6770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
6780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXCreateGLXPixmap, req);
6790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
6800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXCreateGLXPixmap;
6810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->screen = vis->screen;
6820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->visual = vis->visualid;
6830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->pixmap = pixmap;
6840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxpixmap = xid = XAllocID(dpy);
6850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
6860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
687edb117879846155632aaeb66483a3085c7a78815Michel Dänzer
6884df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   if (InitGLXDrawable(dpy, glxDraw, pixmap, req->glxpixmap)) {
6894df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      free(glxDraw);
6904df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes      return None;
6914df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   }
6924df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
69380b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
6949053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer   do {
6959053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      /* FIXME: Maybe delay __DRIdrawable creation until the drawable
6969053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer       * is actually bound to a context... */
6979053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
698c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg      struct glx_display *const priv = __glXInitialize(dpy);
6999053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      __GLXDRIdrawable *pdraw;
70066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
7016ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      struct glx_config *config;
7029053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
70366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      psc = priv->screens[vis->screen];
7049053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      if (psc->driScreen == NULL)
7054833104718677caad0027d5e7539ca9bba389392Adam Jackson         return xid;
7064833104718677caad0027d5e7539ca9bba389392Adam Jackson
7076ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config = glx_config_find_visual(psc->visuals, vis->visualid);
708776a2a54473194e2f0926902276a1f880cded91fAdam Jackson      pdraw = psc->driScreen->createDrawable(psc, pixmap, xid, config);
7099053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      if (pdraw == NULL) {
7109053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         fprintf(stderr, "failed to create pixmap\n");
7114833104718677caad0027d5e7539ca9bba389392Adam Jackson         xid = None;
7129053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         break;
7139053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      }
7149053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer
715776a2a54473194e2f0926902276a1f880cded91fAdam Jackson      if (__glxHashInsert(priv->drawHash, xid, pdraw)) {
7169053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer         (*pdraw->destroyDrawable) (pdraw);
7174833104718677caad0027d5e7539ca9bba389392Adam Jackson         xid = None;
7184833104718677caad0027d5e7539ca9bba389392Adam Jackson         break;
7199053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer      }
7209053bb0d405db0b1a2a917317c7ec41e63b54f09Michel Dänzer   } while (0);
7214833104718677caad0027d5e7539ca9bba389392Adam Jackson
7224833104718677caad0027d5e7539ca9bba389392Adam Jackson   if (xid == None) {
7234833104718677caad0027d5e7539ca9bba389392Adam Jackson      xGLXDestroyGLXPixmapReq *dreq;
7244833104718677caad0027d5e7539ca9bba389392Adam Jackson      LockDisplay(dpy);
7254833104718677caad0027d5e7539ca9bba389392Adam Jackson      GetReq(GLXDestroyGLXPixmap, dreq);
7264833104718677caad0027d5e7539ca9bba389392Adam Jackson      dreq->reqType = opcode;
7274833104718677caad0027d5e7539ca9bba389392Adam Jackson      dreq->glxCode = X_GLXDestroyGLXPixmap;
7284833104718677caad0027d5e7539ca9bba389392Adam Jackson      dreq->glxpixmap = xid;
7294833104718677caad0027d5e7539ca9bba389392Adam Jackson      UnlockDisplay(dpy);
7304833104718677caad0027d5e7539ca9bba389392Adam Jackson      SyncHandle();
7314833104718677caad0027d5e7539ca9bba389392Adam Jackson   }
732edb117879846155632aaeb66483a3085c7a78815Michel Dänzer#endif
733edb117879846155632aaeb66483a3085c7a78815Michel Dänzer
7340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return xid;
735ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
736cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
737cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
738cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
739cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Destroy the named pixmap
740cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
74138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
7420896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXDestroyGLXPixmap(Display * dpy, GLXPixmap glxpixmap)
7430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
744ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
745ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if(apple_glx_pixmap_destroy(dpy, glxpixmap))
746ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      __glXSendError(dpy, GLXBadPixmap, glxpixmap, X_GLXDestroyPixmap, false);
747ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
7480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXDestroyGLXPixmapReq *req;
7490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
7500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
7510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
7520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
7530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
7540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
7550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
7560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXDestroyGLXPixmap request */
7570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
7580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXDestroyGLXPixmap, req);
7590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
7600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXDestroyGLXPixmap;
7610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxpixmap = glxpixmap;
7620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
7630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
7649dfce365c7f35ddea6d81b7f595ddcd6d35382a5Michel Dänzer
7654df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes   DestroyGLXDrawable(dpy, glxpixmap);
7664df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes
76780b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
7680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {
769c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg      struct glx_display *const priv = __glXInitialize(dpy);
770eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, glxpixmap);
7710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
7720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (pdraw != NULL) {
7730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (*pdraw->destroyDrawable) (pdraw);
774e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg         __glxHashDelete(priv->drawHash, glxpixmap);
7750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
7760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
7779dfce365c7f35ddea6d81b7f595ddcd6d35382a5Michel Dänzer#endif
778ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
77977c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg}
78077c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
78138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void
7820896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXSwapBuffers(Display * dpy, GLXDrawable drawable)
78377c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg{
784ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
785279e471750e3ee6a4841ebf16ef2d038e1c12077Jeremy Huddleston   struct glx_context * gc = __glXGetCurrentContext();
78680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston   if(gc && apple_glx_is_current_drawable(dpy, gc->driContext, drawable)) {
78780b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston      apple_glx_swap_buffers(gc->driContext);
788ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   } else {
789ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      __glXSendError(dpy, GLXBadCurrentWindow, 0, X_GLXSwapBuffers, false);
790ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
791ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
792c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc;
7930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContextTag tag;
7940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
795b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#ifdef USE_XCB
7960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_connection_t *c;
797b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#else
7980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXSwapBuffersReq *req;
799b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul#endif
800b7f802eca2c78397ea7b8472b3a7e90a997fc140Brian Paul
8014d01bea808592aec74be2d2a4bbb6488b9299cdaEric Anholt   gc = __glXGetCurrentContext();
8024d01bea808592aec74be2d2a4bbb6488b9299cdaEric Anholt
80380b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
804e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul   {
805e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
806cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
807e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul      if (pdraw != NULL) {
808e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul         if (gc && drawable == gc->currentDrawable) {
809e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul            glFlush();
810e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul         }
8114d01bea808592aec74be2d2a4bbb6488b9299cdaEric Anholt
812e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul         (*pdraw->psc->driScreen->swapBuffers)(pdraw, 0, 0, 0);
813e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul         return;
814e975e18bebb54b20f00c568e7870932402b79f8fBrian Paul      }
8150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
816cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
817cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
8190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode) {
8200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
8210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
822cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
824cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** The calling thread may or may not have a current context.  If it
825cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** does, send the context tag so the server can do a flush.
826cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
8270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((gc != NULL) && (dpy == gc->currentDpy) &&
8280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       ((drawable == gc->currentDrawable)
8290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        || (drawable == gc->currentReadable))) {
8300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = gc->currentContextTag;
8310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
8330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = 0;
8340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
83577c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
836ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#ifdef USE_XCB
8370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   c = XGetXCBConnection(dpy);
8380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_glx_swap_buffers(c, tag, drawable);
8390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xcb_flush(c);
840ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#else
8410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXSwapBuffers request */
8420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
8430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXSwapBuffers, req);
8440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
8450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXSwapBuffers;
8460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->drawable = drawable;
8470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = tag;
8480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
8490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
8500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XFlush(dpy);
851ff3fa92eaa67579b3bd3480bc685cfc55ae1eff2RALOVICH, Kristóf#endif /* USE_XCB */
852ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
853cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
854cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
855cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
856cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
857cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return configuration information for the given display, screen and
858cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** visual combination.
859cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
86038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
8610896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetConfig(Display * dpy, XVisualInfo * vis, int attribute,
8620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf             int *value_return)
8630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
864c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
86566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
8666ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
8670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int status;
8680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   status = GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc);
8700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (status == Success) {
8716ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config = glx_config_find_visual(psc->visuals, vis->visualid);
8720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Lookup attribute after first finding a match on the visual */
8746ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (config != NULL) {
8756ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 return glx_config_get(config, attribute, value_return);
8760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
8770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      status = GLX_BAD_VISUAL;
8790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
8800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
8810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
882cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** If we can't find the config for this visual, this visual is not
883cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** supported by the OpenGL implementation on the server.
884cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
8850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((status == GLX_BAD_VISUAL) && (attribute == GLX_USE_GL)) {
8860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *value_return = GL_FALSE;
8870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      status = Success;
8880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
889cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
8900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return status;
891cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
892cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
893cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/
894cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
895cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void
8966ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberginit_fbconfig_for_chooser(struct glx_config * config,
8970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                          GLboolean fbconfig_style_tags)
8980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
8996ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   memset(config, 0, sizeof(struct glx_config));
9000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualID = (XID) GLX_DONT_CARE;
9010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualType = GLX_DONT_CARE;
9020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* glXChooseFBConfig specifies different defaults for these two than
9040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * glXChooseVisual.
9050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
9060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (fbconfig_style_tags) {
9070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      config->rgbMode = GL_TRUE;
9080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      config->doubleBufferMode = GLX_DONT_CARE;
9090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
9100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->visualRating = GLX_DONT_CARE;
9120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentPixel = GLX_NONE;
9130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentRed = GLX_DONT_CARE;
9140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentGreen = GLX_DONT_CARE;
9150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentBlue = GLX_DONT_CARE;
9160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentAlpha = GLX_DONT_CARE;
9170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->transparentIndex = GLX_DONT_CARE;
9180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->drawableType = GLX_WINDOW_BIT;
9200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->renderType =
9210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT;
9220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->xRenderable = GLX_DONT_CARE;
9230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->fbconfigID = (GLXFBConfigID) (GLX_DONT_CARE);
9240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   config->swapMethod = GLX_DONT_CARE;
9260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf}
9270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_DONT_CARE( param )        \
9290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                  \
93071a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick    if ( ((int) a-> param != (int) GLX_DONT_CARE)   \
9310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         && (a-> param != b-> param) ) {        \
9320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
9330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
9340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
9350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_MINIMUM( param )                  \
9370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
93871a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick    if ( ((int) a-> param != (int) GLX_DONT_CARE)	\
9390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         && (a-> param > b-> param) ) {         \
9400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
9410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
9420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
9430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define MATCH_EXACT( param )                    \
9450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
9460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( a-> param != b-> param) {              \
9470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;                             \
9480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
9490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while ( 0 )
950cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
951edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg/* Test that all bits from a are contained in b */
952edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg#define MATCH_MASK(param)			\
953edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg  do {						\
954edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg    if ((a->param & ~b->param) != 0)		\
955edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg      return False;				\
956edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg  } while (0);
957edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg
958cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
959cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine if two GLXFBConfigs are compatible.
960cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
961cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param a  Application specified config to test.
962cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param b  Server specified config to test against \c a.
963cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
964cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic Bool
9656ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergfbconfigs_compatible(const struct glx_config * const a,
9666ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                     const struct glx_config * const b)
9670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
9680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(doubleBufferMode);
9690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(visualType);
9700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(visualRating);
9710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(xRenderable);
9720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(fbconfigID);
9730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(swapMethod);
9740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(rgbBits);
9760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(numAuxBuffers);
9770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(redBits);
9780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(greenBits);
9790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(blueBits);
9800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(alphaBits);
9810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(depthBits);
9820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(stencilBits);
9830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumRedBits);
9840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumGreenBits);
9850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumBlueBits);
9860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(accumAlphaBits);
9870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(sampleBuffers);
9880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferWidth);
9890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferHeight);
9900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(maxPbufferPixels);
9910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_MINIMUM(samples);
9920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_DONT_CARE(stereoMode);
9940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   MATCH_EXACT(level);
9950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
996edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg   MATCH_MASK(drawableType);
997edb5253dfa0751e451dca7c9a494be4609390545Kristian Høgsberg   MATCH_MASK(renderType);
9980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
9990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* There is a bug in a few of the XFree86 DDX drivers.  They contain
10000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * visuals with a "transparent type" of 0 when they really mean GLX_NONE.
10010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * Technically speaking, it is a bug in the DDX driver, but there is
10020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * enough of an installed base to work around the problem here.  In any
10030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * case, 0 is not a valid value of the transparent type, so we'll treat 0
10040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * from the app as GLX_DONT_CARE. We'll consider GLX_NONE from the app and
10050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * 0 from the server to be a match to maintain backward compatibility with
10060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * the (broken) drivers.
10070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
10080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
100971a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick   if (a->transparentPixel != (int) GLX_DONT_CARE && a->transparentPixel != 0) {
10100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (a->transparentPixel == GLX_NONE) {
10110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (b->transparentPixel != GLX_NONE && b->transparentPixel != 0)
10120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            return False;
10130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
10140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {
10150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_EXACT(transparentPixel);
10160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
10170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      switch (a->transparentPixel) {
10190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case GLX_TRANSPARENT_RGB:
10200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentRed);
10210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentGreen);
10220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentBlue);
10230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentAlpha);
10240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
10250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      case GLX_TRANSPARENT_INDEX:
10270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         MATCH_DONT_CARE(transparentIndex);
10280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
10290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      default:
10310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         break;
10320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
10330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
10340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return True;
1036cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1037cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1038cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1039cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* There's some trickly language in the GLX spec about how this is supposed
1040cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * to work.  Basically, if a given component size is either not specified
1041cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * or the requested size is zero, it is supposed to act like PERFER_SMALLER.
1042cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Well, that's really hard to do with the code as-is.  This behavior is
1043cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * closer to correct, but still not technically right.
1044cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
10450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_LARGER_OR_ZERO(comp)             \
10460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
10470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
10480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if ( ((*a)-> comp) == 0 ) {               \
10490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return -1;                              \
10500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
10510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else if ( ((*b)-> comp) == 0 ) {          \
10520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return 1;                               \
10530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
10540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {                                    \
10550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        return ((*b)-> comp) - ((*a)-> comp) ;  \
10560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }                                         \
10570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
10580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
10590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_LARGER(comp)                     \
10610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
10620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
10630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return ((*b)-> comp) - ((*a)-> comp) ;    \
10640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
10650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
10660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
10670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf#define PREFER_SMALLER(comp)                    \
10680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  do {                                          \
10690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    if ( ((*a)-> comp) != ((*b)-> comp) ) {     \
10700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return ((*a)-> comp) - ((*b)-> comp) ;    \
10710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    }                                           \
10720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf  } while( 0 )
1073cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1074cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
1075cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Compare two GLXFBConfigs.  This function is intended to be used as the
1076cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * compare function passed in to qsort.
10770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1078cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns If \c a is a "better" config, according to the specification of
1079cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          SGIX_fbconfig, a number less than zero is returned.  If \c b is
1080cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          better, then a number greater than zero is return.  If both are
1081cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          equal, zero is returned.
1082cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa qsort, glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
1083cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1084cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int
10856ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergfbconfig_compare(struct glx_config **a, struct glx_config **b)
1086cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
10870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* The order of these comparisons must NOT change.  It is defined by
10880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * the GLX 1.3 spec and ARB_multisample.
10890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
1090cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualSelectGroup);
1092cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* The sort order for the visualRating is GLX_NONE, GLX_SLOW, and
10940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * GLX_NON_CONFORMANT_CONFIG.  It just so happens that this is the
10950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * numerical sort order of the enums (0x8000, 0x8001, and 0x800D).
10960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
10970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualRating);
1098cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
10990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This isn't quite right.  It is supposed to compare the sum of the
11000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * components the user specifically set minimums for.
11010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(redBits);
11030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(greenBits);
11040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(blueBits);
11050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(alphaBits);
1106cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(rgbBits);
1108cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (((*a)->doubleBufferMode != (*b)->doubleBufferMode)) {
11100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Prefer single-buffer.
11110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       */
11120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (!(*a)->doubleBufferMode) ? -1 : 1;
11130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1114cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(numAuxBuffers);
1116cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(depthBits);
11180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(stencilBits);
1119cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This isn't quite right.  It is supposed to compare the sum of the
11210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * components the user specifically set minimums for.
11220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumRedBits);
11240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumGreenBits);
11250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumBlueBits);
11260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER_OR_ZERO(accumAlphaBits);
1127cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(visualType);
1129cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* None of the multisample specs say where this comparison should happen,
11310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * so I put it near the end.
11320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(sampleBuffers);
11340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_SMALLER(samples);
1135cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* None of the pbuffer or fbconfig specs say that this comparison needs
11370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * to happen at all, but it seems like it should.
11380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferWidth);
11400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferHeight);
11410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   PREFER_LARGER(maxPbufferPixels);
1142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
11430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return 0;
1144cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1147cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
1148cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Selects and sorts a subset of the supplied configs based on the attributes.
1149cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function forms to basis of \c glXChooseVisual, \c glXChooseFBConfig,
1150cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * and \c glXChooseFBConfigSGIX.
11510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1152cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param configs   Array of pointers to possible configs.  The elements of
1153cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  this array that do not meet the criteria will be set to
1154cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  NULL.  The remaining elements will be sorted according to
1155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                  the various visual / FBConfig selection rules.
1156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param num_configs  Number of elements in the \c configs array.
1157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param attribList   Attributes used select from \c configs.  This array is
1158cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     terminated by a \c None tag.  The array can either take
1159cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     the form expected by \c glXChooseVisual (where boolean
1160cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     tags do not have a value) or by \c glXChooseFBConfig
1161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                     (where every tag has a value).
1162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param fbconfig_style_tags  Selects whether \c attribList is in
1163cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                             \c glXChooseVisual style or
1164cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *                             \c glXChooseFBConfig style.
1165cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns The number of valid elements left in \c configs.
11660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
1167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXChooseVisual, glXChooseFBConfig, glXChooseFBConfigSGIX
1168cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
1169cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic int
11706ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergchoose_visual(struct glx_config ** configs, int num_configs,
11710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf              const int *attribList, GLboolean fbconfig_style_tags)
11720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
11736ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config test_config;
11740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int base;
11750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
11760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* This is a fairly direct implementation of the selection method
11780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * described by GLX_SGIX_fbconfig.  Start by culling out all the
11790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * configs that are not compatible with the selected parameter
11800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * list.
11810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
11820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   init_fbconfig_for_chooser(&test_config, fbconfig_style_tags);
11840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXInitializeVisualConfigFromTags(&test_config, 512,
11850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       (const INT32 *) attribList,
11860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       GL_TRUE, fbconfig_style_tags);
11870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   base = 0;
11890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   for (i = 0; i < num_configs; i++) {
11900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (fbconfigs_compatible(&test_config, configs[i])) {
11910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         configs[base] = configs[i];
11920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         base++;
11930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
11940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
11950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
11960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (base == 0) {
11970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
11980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
11990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (base < num_configs) {
12010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      (void) memset(&configs[base], 0, sizeof(void *) * (num_configs - base));
12020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
12030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* After the incompatible configs are removed, the resulting
12050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * list is sorted according to the rules set out in the various
12060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    * specifications.
12070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf    */
12080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12096ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   qsort(configs, base, sizeof(struct glx_config *),
12100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (int (*)(const void *, const void *)) fbconfig_compare);
12110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return base;
1212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1213cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1214cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1215cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1216cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1217cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1218cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Return the visual that best matches the template.  Return None if no
1219cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** visual matches the template.
1220cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
122138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT XVisualInfo *
12220896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXChooseVisual(Display * dpy, int screen, int *attribList)
1223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
12240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XVisualInfo *visualList = NULL;
1225c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
122666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
12276ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config test_config;
12286ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
12296ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *best_config = NULL;
1230cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1232cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Get a list of all visuals, return if list is empty
1233cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
12340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
12350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
12360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1237cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1240cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Build a template from the defaults and the attribute list
1241cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Free visual list and return if an unexpected token is encountered
1242cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
12430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   init_fbconfig_for_chooser(&test_config, GL_FALSE);
12440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __glXInitializeVisualConfigFromTags(&test_config, 512,
12450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       (const INT32 *) attribList,
12460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                       GL_TRUE, GL_FALSE);
1247cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1249cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Eliminate visuals that don't meet minimum requirements
1250cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Compute a score for those that do
1251cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Remember which visual, if any, got the highest score
125246b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** If no visual is acceptable, return None
125346b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** Otherwise, create an XVisualInfo list with just the selected X visual
125446b81b0cc883df0ef7d998be36ae6cbf80257cd2Michel Dänzer    ** and return this.
1255cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
12566ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   for (config = psc->visuals; config != NULL; config = config->next) {
12576ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (fbconfigs_compatible(&test_config, config)
12586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg          && ((best_config == NULL) ||
12596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg              (fbconfig_compare (&config, &best_config) < 0))) {
12600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XVisualInfo visualTemplate;
12610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XVisualInfo *newList;
12620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         int i;
12630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         visualTemplate.screen = screen;
12656ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         visualTemplate.visualid = config->visualID;
12660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         newList = XGetVisualInfo(dpy, VisualScreenMask | VisualIDMask,
12670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                  &visualTemplate, &i);
12680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
12690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         if (newList) {
12700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            Xfree(visualList);
12710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            visualList = newList;
12726ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg            best_config = config;
12730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
12740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
12750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
127677c7f90ed44748f0e54e894deff1cac63da54cd6Kristian Høgsberg
1277ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
1278ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   if(visualList && getenv("LIBGL_DUMP_VISUALID")) {
1279ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      printf("visualid 0x%lx\n", visualList[0].visualid);
1280ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   }
1281ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1282ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
12830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return visualList;
1284cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1286cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
128738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
12880896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryExtensionsString(Display * dpy, int screen)
1289cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
129066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1291c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
1292cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
12940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
12950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
12970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!psc->effectiveGLXexts) {
12980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!psc->serverGLXexts) {
12990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         psc->serverGLXexts =
13000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            __glXQueryServerString(dpy, priv->majorOpcode, screen,
13010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                   GLX_EXTENSIONS);
13020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1303cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      __glXCalculateUsableExtensions(psc,
130580b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
13060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     (psc->driScreen != NULL),
1307cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
13080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     GL_FALSE,
1309cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
13100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                                     priv->minorVersion);
13110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1312cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return psc->effectiveGLXexts;
1314cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1315cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
131638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
13170896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetClientString(Display * dpy, int name)
1318cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
131926b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick   (void) dpy;
132026b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
13210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (name) {
13220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VENDOR:
13230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGLXClientVendorName);
13240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VERSION:
13250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGLXClientVersion);
13260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_EXTENSIONS:
13270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return (__glXGetClientExtensions());
13280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
13290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
13300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1331cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1332cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
133338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT const char *
13340896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXQueryServerString(Display * dpy, int screen, int name)
1335cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
133666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1337c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
13380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   const char **str;
1339cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1340cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (GetGLXPrivScreenConfig(dpy, screen, &priv, &psc) != Success) {
13420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
13430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1344cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (name) {
13460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VENDOR:
13470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &priv->serverGLXvendor;
13480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
13490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VERSION:
13500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &priv->serverGLXversion;
13510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
13520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_EXTENSIONS:
13530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      str = &psc->serverGLXexts;
13540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
13550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
13560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
13570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1358cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (*str == NULL) {
13600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *str = __glXQueryServerString(dpy, priv->majorOpcode, screen, name);
13610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
13620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return *str;
1364cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1365cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
13660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófvoid
13670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXClientInfo(Display * dpy, int opcode)
1368cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
13690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   char *ext_str = __glXGetClientGLExtensionString();
13700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int size = strlen(ext_str) + 1;
137166db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf
137266db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#ifdef USE_XCB
137366db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf   xcb_connection_t *c = XGetXCBConnection(dpy);
137466db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf   xcb_glx_client_info(c,
13750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       GLX_MAJOR_VERSION, GLX_MINOR_VERSION, size, ext_str);
137666db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#else
13770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXClientInfoReq *req;
13780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXClientInfo request */
13800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
13810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReq(GLXClientInfo, req);
13820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
13830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXClientInfo;
13840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->major = GLX_MAJOR_VERSION;
13850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->minor = GLX_MINOR_VERSION;
13860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->length += (size + 3) >> 2;
13880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->numbytes = size;
13890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Data(dpy, ext_str, size);
13900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
13910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
13920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
139366db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf#endif /* USE_XCB */
139466db1b64e85a2225dff930d3bb9e1194bde75622RALOVICH, Kristóf
13950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Xfree(ext_str);
1396cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1397cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1398cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1399cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1400cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** EXT_import_context
1401cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
1402cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
140338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT Display *
14040896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetCurrentDisplay(void)
1405cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1406c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
14070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (NULL == gc)
14080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return NULL;
14090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc->currentDpy;
1410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
141238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
14130896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(Display *, glXGetCurrentDisplayEXT, (void), (),
14140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          glXGetCurrentDisplay)
1415cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1416ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
141738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
14186ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian HøgsbergglXImportContextEXT(Display *dpy, GLXContextID contextID)
14190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
1420c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = __glXInitialize(dpy);
14215a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   struct glx_screen *psc = NULL;
14220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXQueryContextReply reply;
14230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
1424c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx;
14255a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick
14265a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   /* This GLX implementation knows about 5 different properties, so
14275a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick    * allow the server to send us one of each.
14285a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick    */
14295a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   int propList[5 * 2], *pProp, nPropListBytes;
14305a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   int numProps;
14316ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   int i, renderType;
14326ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   XID share;
14336ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *mode;
14345a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   uint32_t fbconfigID = 0;
14355a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   uint32_t visualID = 0;
14365a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   uint32_t screen;
14375a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   Bool got_screen = False;
14386ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
1439ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick   /* The GLX_EXT_import_context spec says:
1440ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    *
1441ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    *     "If <contextID> does not refer to a valid context, then a BadContext
1442ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    *     error is generated; if <contextID> refers to direct rendering
1443ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    *     context then no error is generated but glXImportContextEXT returns
1444ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    *     NULL."
1445ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    *
1446ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    * If contextID is None, generate BadContext on the client-side.  Other
1447ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    * sorts of invalid contexts will be detected by the server in the
1448ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    * __glXIsDirect call.
1449ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick    */
1450ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick   if (contextID == None) {
1451ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick      __glXSendError(dpy, GLXBadContext, contextID, X_GLXIsDirect, false);
1452ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick      return NULL;
1453ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick   }
1454ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick
1455ed4a65c3cfdf88afba48860be34ce26f7c371869Ian Romanick   if (__glXIsDirect(dpy, contextID))
14566ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
14570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
14596ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (!opcode)
14600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
14610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /* Send the glXQueryContextInfoEXT request */
14630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
14640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14656ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (priv->majorVersion > 1 || priv->minorVersion >= 3) {
14660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXQueryContextReq *req;
14670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReq(GLXQueryContext, req);
14690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
14710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXQueryContext;
14726ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      req->context = contextID;
14730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
14740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
14750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXVendorPrivateReq *vpreq;
14760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      xGLXQueryContextInfoEXTReq *req;
14770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReqExtra(GLXVendorPrivate,
14796ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg		  sz_xGLXQueryContextInfoEXTReq - sz_xGLXVendorPrivateReq,
14806ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg		  vpreq);
14810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req = (xGLXQueryContextInfoEXTReq *) vpreq;
14820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
14830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXVendorPrivateWithReply;
14840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->vendorCode = X_GLXvop_QueryContextInfoEXT;
14856ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      req->context = contextID;
14860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
14870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   _XReply(dpy, (xReply *) & reply, 0, False);
14890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
14906ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (reply.n <= __GLX_MAX_CONTEXT_PROPS)
14916ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      nPropListBytes = reply.n * 2 * sizeof propList[0];
14926ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   else
14936ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      nPropListBytes = 0;
14946ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   _XRead(dpy, (char *) propList, nPropListBytes);
14950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
14960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
14976ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
14985a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   numProps = nPropListBytes / (2 * sizeof(propList[0]));
14996ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   share = None;
15006ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   mode = NULL;
15016ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   renderType = 0;
15026ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   pProp = propList;
15036ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
15045a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   for (i = 0, pProp = propList; i < numProps; i++, pProp += 2)
15056ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      switch (pProp[0]) {
15065a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      case GLX_SCREEN:
15075a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 screen = pProp[1];
15085a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 got_screen = True;
15095a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 break;
15106ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_SHARE_CONTEXT_EXT:
15116ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 share = pProp[1];
15126ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
15136ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_VISUAL_ID_EXT:
15145a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 visualID = pProp[1];
15156ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
15166ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_FBCONFIG_ID:
15175a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick	 fbconfigID = pProp[1];
15186ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
15196ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      case GLX_RENDER_TYPE:
15206ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 renderType = pProp[1];
15216ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg	 break;
15226ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      }
15236ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
15245a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   if (!got_screen)
15255a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      return NULL;
15265a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick
15275a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   psc = GetGLXScreenConfigs(dpy, screen);
15285a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   if (psc == NULL)
15295a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      return NULL;
15305a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick
15315a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   if (fbconfigID != 0) {
15325a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      mode = glx_config_find_fbconfig(psc->configs, fbconfigID);
15335a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   } else if (visualID != 0) {
15345a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick      mode = glx_config_find_visual(psc->visuals, visualID);
15355a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick   }
15365a849e864ea2db3b705ba301089ee2ec1fe78aa1Ian Romanick
15376ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (mode == NULL)
15386ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
15396ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
15406ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx = indirect_create_context(psc, mode, NULL, renderType);
15416ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   if (ctx == NULL)
15426ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      return NULL;
15436ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
15446ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->xid = contextID;
15456ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->imported = GL_TRUE;
15466ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg   ctx->share_xid = share;
15476ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg
1548c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   return (GLXContext) ctx;
1549cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1550cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1551ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1552ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
155338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
1554c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian HøgsbergglXQueryContext(Display * dpy, GLXContext ctx_user, int attribute, int *value)
1555cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1556c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx = (struct glx_context *) ctx_user;
1557c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
15580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   switch (attribute) {
1559ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      case GLX_SHARE_CONTEXT_EXT:
15606ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->share_xid;
15610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_VISUAL_ID_EXT:
15636ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      *value = ctx->config ? ctx->config->visualID : None;
15640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_SCREEN:
15666ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->screen;
15670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_FBCONFIG_ID:
15696ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      *value = ctx->config ? ctx->config->fbconfigID : None;
15700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   case GLX_RENDER_TYPE:
15726ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg      *value = ctx->renderType;
15730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      break;
15740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   default:
15750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_ATTRIBUTE;
15760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
15770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return Success;
1578cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1579cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
158038c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
15810896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(int, glXQueryContextInfoEXT,
15820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (Display * dpy, GLXContext ctx, int attribute, int *value),
15830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (dpy, ctx, attribute, value), glXQueryContext)
1584cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1585c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg_X_EXPORT GLXContextID glXGetContextIDEXT(const GLXContext ctx_user)
1586cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1587c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *ctx = (struct glx_context *) ctx_user;
1588c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
15893b9b42250ca9f0da6e979afc047d1c8524466076Ian Romanick   return (ctx == NULL) ? None : ctx->xid;
1590cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1591cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
15924dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick_X_EXPORT void
15934dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian RomanickglXFreeContextEXT(Display *dpy, GLXContext ctx)
15944dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick{
15954dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   struct glx_context *gc = (struct glx_context *) ctx;
15964dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick
15974dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   if (gc == NULL || gc->xid == None)
15984dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick      return;
15994dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick
16004dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   /* The GLX_EXT_import_context spec says:
16014dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick    *
16024dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick    *     "glXFreeContext does not free the server-side context information or
16034dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick    *     the XID associated with the server-side context."
16044dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick    *
16054dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick    * Don't send any protocol.  Just destroy the client-side tracking of the
16064dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick    * context.  Also, only release the context structure if it's not current.
16074dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick    */
16084dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   __glXLock();
16094dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   if (gc->currentDpy) {
16104dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick      gc->xid = None;
16114dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   } else {
16124dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick      gc->vtable->destroy(gc);
16134dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   }
16144dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick   __glXUnlock();
16154dbd13cb3f5aeff6ddc85fd091b4677369c19778Ian Romanick}
1616cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
161738c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfig *
16180896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXChooseFBConfig(Display * dpy, int screen,
16190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  const int *attribList, int *nitems)
1620cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
16216ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config **config_list;
16220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int list_size;
1623cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1624cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16256ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   config_list = (struct glx_config **)
16260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      glXGetFBConfigs(dpy, screen, &list_size);
1627cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((config_list != NULL) && (list_size > 0) && (attribList != NULL)) {
16290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      list_size = choose_visual(config_list, list_size, attribList, GL_TRUE);
16300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (list_size == 0) {
16310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         XFree(config_list);
16320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         config_list = NULL;
16330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
16340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1635cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *nitems = list_size;
16370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return (GLXFBConfig *) config_list;
1638cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1639cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1640cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
164138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
16426ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXCreateNewContext(Display * dpy, GLXFBConfig fbconfig,
16430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                    int renderType, GLXContext shareList, Bool allowDirect)
1644cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
16456ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
16467bcfb66000557a0ef32bdc6b31949a92f95a9ff6Ian Romanick
16476ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return CreateContext(dpy, config->fbconfigID, config, shareList,
16486ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			allowDirect, X_GLXCreateNewContext, renderType,
16496ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			config->screen);
1650cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1651cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1652cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
165338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXDrawable
16540896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetCurrentReadDrawable(void)
1655cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1656c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1657c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg
16580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc->currentReadable;
1659cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1660cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1661cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
166238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfig *
16630896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetFBConfigs(Display * dpy, int screen, int *nelements)
1664cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1665c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv = __glXInitialize(dpy);
16666ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config **config_list = NULL;
16676ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config;
16686ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   unsigned num_configs = 0;
16690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
1670cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *nelements = 0;
167266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   if (priv && (priv->screens != NULL)
16730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && (screen >= 0) && (screen <= ScreenCount(dpy))
167466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg       && (priv->screens[screen]->configs != NULL)
167566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg       && (priv->screens[screen]->configs->fbconfigID
167671a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick	   != (int) GLX_DONT_CARE)) {
1677cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
167866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      for (config = priv->screens[screen]->configs; config != NULL;
16796ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg           config = config->next) {
16806ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg         if (config->fbconfigID != (int) GLX_DONT_CARE) {
16810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            num_configs++;
16820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
16830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1684cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
16856ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      config_list = Xmalloc(num_configs * sizeof *config_list);
16866ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (config_list != NULL) {
16870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         *nelements = num_configs;
16880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         i = 0;
168966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg         for (config = priv->screens[screen]->configs; config != NULL;
16906ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg              config = config->next) {
16916ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg            if (config->fbconfigID != (int) GLX_DONT_CARE) {
16926ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg               config_list[i] = config;
16930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               i++;
16940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            }
16950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
16960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
16970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
16986ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg
16996ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return (GLXFBConfig *) config_list;
1700cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1701cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1702cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
170338c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT int
17046ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXGetFBConfigAttrib(Display * dpy, GLXFBConfig fbconfig,
17050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                     int attribute, int *value)
1706cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
17076ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = ValidateGLXFBConfig(dpy, fbconfig);
17086ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg
17096ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if (config == NULL)
17106ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      return GLXBadFBConfig;
1711cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
17126ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   return glx_config_get(config, attribute, value);
1713cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1714cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1715cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
171638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT XVisualInfo *
17176ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian HøgsbergglXGetVisualFromFBConfig(Display * dpy, GLXFBConfig fbconfig)
1718cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
17190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XVisualInfo visualTemplate;
17206ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
17210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int count;
1722cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
17230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
1724cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    ** Get a list of all visuals, return if list is empty
1725cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
17266ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   visualTemplate.visualid = config->visualID;
17270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return XGetVisualInfo(dpy, VisualIDMask, &visualTemplate, &count);
1728cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1729cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1730ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
1731cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1732cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGI_swap_control
1733cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
17340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
17350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapIntervalSGI(int interval)
1736cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1737cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   xGLXVendorPrivateReq *req;
1738c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
173966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
17400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   Display *dpy;
17410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *interval_ptr;
1742cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   CARD8 opcode;
1743cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
17440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gc == NULL) {
1745cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return GLX_BAD_CONTEXT;
1746cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
17470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
17480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (interval <= 0) {
1749cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return GLX_BAD_VALUE;
1750cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
1751cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1752efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
1753efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
175416f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
1755c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (gc->isDirect && psc->driScreen && psc->driScreen->setSwapInterval) {
1756eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg      __GLXDRIdrawable *pdraw =
1757eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	 GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1758efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc->driScreen->setSwapInterval(pdraw, interval);
1759efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      return 0;
1760efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
176116f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
1762efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1763cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   dpy = gc->currentDpy;
1764cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   opcode = __glXSetupForCommand(dpy);
1765cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   if (!opcode) {
1766cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return 0;
1767cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
1768cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1769cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* Send the glXSwapIntervalSGI request */
1770cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   LockDisplay(dpy);
17710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(GLXVendorPrivate, sizeof(CARD32), req);
1772cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->reqType = opcode;
1773cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->glxCode = X_GLXVendorPrivate;
1774cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->vendorCode = X_GLXvop_SwapIntervalSGI;
1775cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   req->contextTag = gc->currentContextTag;
1776cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1777a70d56485a2d0f15ee5b660e8931eb8657535e2dIan Romanick   interval_ptr = (CARD32 *) (req + 1);
1778cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   *interval_ptr = interval;
1779cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1780cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   UnlockDisplay(dpy);
1781cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   SyncHandle();
1782cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   XFlush(dpy);
1783cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1784cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
1785cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1786cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1787cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1788cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1789cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_MESA_swap_control
1790cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
17910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
17920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapIntervalMESA(unsigned int interval)
1793cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1794089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#ifdef GLX_DIRECT_RENDERING
1795c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1796cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1797c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (gc != NULL && gc->isDirect) {
179866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
1799efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1800efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
1801efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      if (psc->driScreen && psc->driScreen->setSwapInterval) {
1802eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg         __GLXDRIdrawable *pdraw =
1803eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	    GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1804089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg	 return psc->driScreen->setSwapInterval(pdraw, interval);
1805efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      }
1806efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
180716f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
1808efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1809cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
1810cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1811841a823d6ded26585aaecbc69a937b1ece8fccb2Brian Paul
18120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
18130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
18140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetSwapIntervalMESA(void)
1815cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1816089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg#ifdef GLX_DIRECT_RENDERING
1817c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
1818cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1819c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (gc != NULL && gc->isDirect) {
182066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc;
1821efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes
1822efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
1823efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      if (psc->driScreen && psc->driScreen->getSwapInterval) {
1824eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg         __GLXDRIdrawable *pdraw =
1825eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg	    GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
1826efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes	 return psc->driScreen->getSwapInterval(pdraw);
1827efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes      }
1828efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes   }
182967776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1830cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1831cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
1832cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1833cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1834cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1835cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1836cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGI_video_sync
1837cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
18380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
18390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetVideoSyncSGI(unsigned int *count)
1840cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1841daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int64_t ust, msc, sbc;
1842daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int ret;
1843c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
184466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
184567776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1846daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
184767776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1848daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
184916f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee   if (!gc)
1850daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return GLX_BAD_CONTEXT;
1851daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
185216f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
1853c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (!gc->isDirect)
185416f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return GLX_BAD_CONTEXT;
185516f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
185616f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
1857daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   psc = GetGLXScreenConfigs(gc->currentDpy, gc->screen);
185867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1859eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
186067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1861daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
1862cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* FIXME: Looking at the GLX_SGI_video_sync spec in the extension registry,
1863cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * FIXME: there should be a GLX encoding for this call.  I can find no
1864cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * FIXME: documentation for the GLX encoding.
1865cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
186667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1867daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->getDrawableMSC) {
1868daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->getDrawableMSC(psc, pdraw, &ust, &msc, &sbc);
1869daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      *count = (unsigned) msc;
1870daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (ret == True) ? 0 : GLX_BAD_CONTEXT;
1871daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
187267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1873daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
1874cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
1875cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1876cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int
18780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
1879cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1880c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
188166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
188267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1883daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
188467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1885daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int64_t ust, msc, sbc;
1886daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   int ret;
1887cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
18880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor <= 0 || remainder < 0)
18890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return GLX_BAD_VALUE;
1890cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
189116f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee   if (!gc)
1892daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return GLX_BAD_CONTEXT;
1893daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
189416f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
1895c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (!gc->isDirect)
189616f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return GLX_BAD_CONTEXT;
189716f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
189816f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
1899daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   psc = GetGLXScreenConfigs( gc->currentDpy, gc->screen);
190067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1901eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(gc->currentDpy, gc->currentDrawable);
190267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1903daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
190467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
1905daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->waitForMSC) {
1906daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForMSC(pdraw, 0, divisor, remainder, &ust, &msc,
1907daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes				       &sbc);
1908daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      *count = (unsigned) msc;
1909daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (ret == True) ? 0 : GLX_BAD_CONTEXT;
1910daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
191167776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
1912daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
1913cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return GLX_BAD_CONTEXT;
1914cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1915cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1916ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
1917cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1918cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
1919cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_fbconfig
1920cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Many of these functions are aliased to GLX 1.3 entry points in the
1921cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_functions table.
1922cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
1923cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
192438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT
19250896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófGLX_ALIAS(int, glXGetFBConfigAttribSGIX,
19260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (Display * dpy, GLXFBConfigSGIX config, int attribute, int *value),
19270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          (dpy, config, attribute, value), glXGetFBConfigAttrib)
1928cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
192938c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLX_ALIAS(GLXFBConfigSGIX *, glXChooseFBConfigSGIX,
1930ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (Display * dpy, int screen, int *attrib_list,
1931ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                  int *nelements), (dpy, screen, attrib_list, nelements),
1932ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 glXChooseFBConfig)
1933cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
193438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLX_ALIAS(XVisualInfo *, glXGetVisualFromFBConfigSGIX,
1935ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (Display * dpy, GLXFBConfigSGIX config),
1936ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                 (dpy, config), glXGetVisualFromFBConfig)
1937cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
193838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
1939ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian PaulglXCreateGLXPixmapWithConfigSGIX(Display * dpy,
19406ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                                 GLXFBConfigSGIX fbconfig,
1941ef9cd84521cbbc622c3c37af04b8d10934903ae8Brian Paul                                 Pixmap pixmap)
1942cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
1943ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
19440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXVendorPrivateWithReplyReq *vpreq;
19450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXCreateGLXPixmapWithConfigSGIXReq *req;
19460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXPixmap xid = None;
19470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
194866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1949ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
19506ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
1951cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
1952cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((dpy == NULL) || (config == NULL)) {
19540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
19550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1956ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL
19576ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   if(apple_glx_pixmap_create(dpy, config->screen, pixmap, config))
1958ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston      return None;
1959ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston   return pixmap;
1960ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else
1961cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19626ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   psc = GetGLXScreenConfigs(dpy, config->screen);
19630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((psc != NULL)
19640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)) {
19650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      opcode = __glXSetupForCommand(dpy);
19660896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (!opcode) {
19670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return None;
19680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
1969cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* Send the glXCreateGLXPixmapWithConfigSGIX request */
19710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      LockDisplay(dpy);
19720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      GetReqExtra(GLXVendorPrivateWithReply,
19730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  sz_xGLXCreateGLXPixmapWithConfigSGIXReq -
19740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                  sz_xGLXVendorPrivateWithReplyReq, vpreq);
19750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req = (xGLXCreateGLXPixmapWithConfigSGIXReq *) vpreq;
19760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->reqType = opcode;
19770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxCode = X_GLXVendorPrivateWithReply;
19780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->vendorCode = X_GLXvop_CreateGLXPixmapWithConfigSGIX;
19796ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      req->screen = config->screen;
19806ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      req->fbconfig = config->fbconfigID;
19810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->pixmap = pixmap;
19820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      req->glxpixmap = xid = XAllocID(dpy);
19830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      UnlockDisplay(dpy);
19840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      SyncHandle();
19850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
1986cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
19870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return xid;
1988ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
1989cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
1990cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
199138c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXContext
19920896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateContextWithConfigSGIX(Display * dpy,
19936ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg                               GLXFBConfigSGIX fbconfig, int renderType,
19940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                               GLXContext shareList, Bool allowDirect)
1995cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
19960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContext gc = NULL;
19976ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *config = (struct glx_config *) fbconfig;
199866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
1999cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2000cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((dpy == NULL) || (config == NULL)) {
20020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return None;
20030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2004cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20056ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   psc = GetGLXScreenConfigs(dpy, config->screen);
20060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((psc != NULL)
20070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)) {
20086ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      gc = CreateContext(dpy, config->fbconfigID, config, shareList,
20092243029eeec9e31b92079ff0e8fafdc0315053d6Ian Romanick                         allowDirect,
20107bcfb66000557a0ef32bdc6b31949a92f95a9ff6Ian Romanick			 X_GLXvop_CreateContextWithConfigSGIX, renderType,
20116ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg			 config->screen);
20120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2013cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return gc;
2015cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2016cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2017cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
201838c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXFBConfigSGIX
20190896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis)
2020cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2021c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display *priv;
202266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = NULL;
2023cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2024fc48de4fabcf3a42a1cd7d447790afefc7d27af8Stéphane Marchesin   if ((GetGLXPrivScreenConfig(dpy, vis->screen, &priv, &psc) == Success)
20250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && __glXExtensionBitIsEnabled(psc, SGIX_fbconfig_bit)
202671a6fb15ceb6619d39029ff897daf2da4858b17eIan Romanick       && (psc->configs->fbconfigID != (int) GLX_DONT_CARE)) {
20276ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      return (GLXFBConfigSGIX) glx_config_find_visual(psc->configs,
20286ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg						      vis->visualid);
20290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2030cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return NULL;
2032cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2033cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2034ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2035cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2036cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_swap_group
2037cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
20380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
20390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXJoinSwapGroupSGIX(Display * dpy, GLXDrawable drawable,
20400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       GLXDrawable member)
2041cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2042cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2043cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) drawable;
2044cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) member;
2045cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2046cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2047cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2048cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2049cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_SGIX_swap_barrier
2050cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
20510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
20520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXBindSwapBarrierSGIX(Display * dpy, GLXDrawable drawable, int barrier)
2053cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2054cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2055cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) drawable;
2056cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) barrier;
2057cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2058cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
20590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
20600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXQueryMaxSwapBarriersSGIX(Display * dpy, int screen, int *max)
2061cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2062cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2063cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) screen;
2064cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) max;
2065cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2066cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2067cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2068cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2069cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2070cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** GLX_OML_sync_control
2071cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
20720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
20730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetSyncValuesOML(Display * dpy, GLXDrawable drawable,
20740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                      int64_t * ust, int64_t * msc, int64_t * sbc)
2075cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2076c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_display * const priv = __glXInitialize(dpy);
2077eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   int ret;
207867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2079daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   __GLXDRIdrawable *pdraw;
208067776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
208166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
20820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2083daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (!priv)
2084daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return False;
20850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
208667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2087eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   pdraw = GetGLXDRIDrawable(dpy, drawable);
2088eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   psc = pdraw ? pdraw->psc : NULL;
2089eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   if (pdraw && psc->driScreen->getDrawableMSC) {
2090daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->getDrawableMSC(psc, pdraw, ust, msc, sbc);
2091daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2092daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
209367776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2094daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2095cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2096cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2097cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
209880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
20993d28a2690f3752990be50a25447747e237d7bee9Kristian Høgsberg_X_HIDDEN GLboolean
21007a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg__glxGetMscRate(__GLXDRIdrawable *glxDraw,
21017a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg		int32_t * numerator, int32_t * denominator)
2102286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg{
2103286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg#ifdef XF86VIDMODE
210466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc;
21050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   XF86VidModeModeLine mode_line;
21060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int dot_clock;
21070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int i;
210826b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
21090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   psc = glxDraw->psc;
21100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (XF86VidModeQueryVersion(psc->dpy, &i, &i) &&
21110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       XF86VidModeGetModeLine(psc->dpy, psc->scr, &dot_clock, &mode_line)) {
21120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      unsigned n = dot_clock * 1000;
21130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      unsigned d = mode_line.vtotal * mode_line.htotal;
21140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2115286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg# define V_INTERLACE 0x010
2116286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg# define V_DBLSCAN   0x020
2117286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg
21180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (mode_line.flags & V_INTERLACE)
21190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         n *= 2;
21200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else if (mode_line.flags & V_DBLSCAN)
21210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         d *= 2;
21220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
21230896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      /* The OML_sync_control spec requires that if the refresh rate is a
21240896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       * whole number, that the returned numerator be equal to the refresh
21250896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       * rate and the denominator be 1.
21260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       */
21270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
21280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (n % d == 0) {
21290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         n /= d;
21300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         d = 1;
21310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
21320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      else {
21330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         static const unsigned f[] = { 13, 11, 7, 5, 3, 2, 0 };
21340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
21350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         /* This is a poor man's way to reduce a fraction.  It's far from
21360896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          * perfect, but it will work well enough for this situation.
21370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf          */
21380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
21390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         for (i = 0; f[i] != 0; i++) {
21400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            while (n % f[i] == 0 && d % f[i] == 0) {
21410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               d /= f[i];
21420896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf               n /= f[i];
21430896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf            }
21440896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         }
21450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
21460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
21470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *numerator = n;
21480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      *denominator = d;
21490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
21500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return True;
21510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
21520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else
215357d3f71132a59315d47c42a110228a523f9ea23dKristian Høgsberg#endif
215426b2bee79d77b7a7b854d7300a10dce69e93d5cdIan Romanick
21550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   return False;
2156286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg}
2157286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg#endif
2158cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2159cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2160cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Determine the refresh rate of the specified drawable and display.
21610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dpy          Display whose refresh rate is to be determined.
2163cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param drawable     Drawable whose refresh rate is to be determined.
2164cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param numerator    Numerator of the refresh rate.
2165cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param demoninator  Denominator of the refresh rate.
2166cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \return  If the refresh rate for the specified display and drawable could
2167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *          be calculated, True is returned.  Otherwise False is returned.
21680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2169cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \note This function is implemented entirely client-side.  A lot of other
2170cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       functionality is required to export GLX_OML_sync_control, so on
2171cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       XFree86 this function can be called for direct-rendering contexts
2172cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *       when GLX_OML_sync_control appears in the client extension string.
2173cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
2174cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN GLboolean
21760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
21770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int32_t * numerator, int32_t * denominator)
2178cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2179cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if defined( GLX_DIRECT_RENDERING ) && defined( XF86VIDMODE )
2180eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *draw = GetGLXDRIDrawable(dpy, drawable);
2181cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (draw == NULL)
21830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return False;
2184cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21857a66e549583a3168f05acc7df1e872d218fd670dKristian Høgsberg   return __glxGetMscRate(draw, numerator, denominator);
2186cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
2187286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg   (void) dpy;
2188286ce2719395485ffafb38097fa2551b066acd96Kristian Høgsberg   (void) drawable;
2189cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) numerator;
2190cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) denominator;
2191cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2192cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2193cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2194cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2195cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
21960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic int64_t
21970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable,
21980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       int64_t target_msc, int64_t divisor, int64_t remainder)
2199cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2200c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
220167776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2202eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
220366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
220467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2205cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
220667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee   if (!gc) /* no GLX for this */
2207daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return -1;
2208daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
220916f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#ifdef GLX_DIRECT_RENDERING
2210c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg   if (!pdraw || !gc->isDirect)
221116f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee      return -1;
221216f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee#endif
221316f568a1830ea17da82683f97e016cdc0aae0c65Vinson Lee
2214cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
2215cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but it also says "It [glXSwapBuffersMscOML] will return a value
2216cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * of -1 if the function failed because of errors detected in the input
2217cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * parameters"
2218cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
22190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor < 0 || remainder < 0 || target_msc < 0)
2220cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return -1;
22210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor > 0 && remainder >= divisor)
2222cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return -1;
2223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22248f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes   if (target_msc == 0 && divisor == 0 && remainder == 0)
22258f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes      remainder = 1;
22268f4f2a0c3625de2bb2b8e955afc23b3ce8c95f93Jesse Barnes
2227daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes#ifdef GLX_DIRECT_RENDERING
2228daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (psc->driScreen && psc->driScreen->swapBuffers)
2229daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return (*psc->driScreen->swapBuffers)(pdraw, target_msc, divisor,
2230daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes					    remainder);
2231cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2232daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2233daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   return -1;
2234cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2235cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2236cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
22380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitForMscOML(Display * dpy, GLXDrawable drawable,
22390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t target_msc, int64_t divisor,
22400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t remainder, int64_t * ust,
22410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t * msc, int64_t * sbc)
2242cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
224367776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2244eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
224566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
22460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int ret;
2247ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#endif
2248cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2249daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2250cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says these should "generate a GLX_BAD_VALUE
2251cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but the return type in the spec is Bool.
2252cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
22530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor < 0 || remainder < 0 || target_msc < 0)
2254cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
22550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (divisor > 0 && remainder >= divisor)
2256cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
2257cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
225867776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2259daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   if (pdraw && psc->driScreen && psc->driScreen->waitForMSC) {
2260daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForMSC(pdraw, target_msc, divisor, remainder,
2261daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes				       ust, msc, sbc);
2262daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2263daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
226467776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
2265daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes
2266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2267cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2268cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2269cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
22700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
22710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXWaitForSbcOML(Display * dpy, GLXDrawable drawable,
22720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t target_sbc, int64_t * ust,
22730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                   int64_t * msc, int64_t * sbc)
2274cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
227567776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2276eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
227766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg   struct glx_screen *psc = pdraw ? pdraw->psc : NULL;
22780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   int ret;
2279ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#endif
2280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2281cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* The OML_sync_control spec says this should "generate a GLX_BAD_VALUE
2282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * error", but the return type in the spec is Bool.
2283cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
22840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (target_sbc < 0)
2285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return False;
228667776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee
228767776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#ifdef GLX_DIRECT_RENDERING
2288251bf298bfddd06c6d6cd4b03ba9aadfc02e2895kleinerm   if (pdraw && psc->driScreen && psc->driScreen->waitForSBC) {
2289daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      ret = psc->driScreen->waitForSBC(pdraw, target_sbc, ust, msc, sbc);
2290daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes      return ret;
2291daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes   }
229267776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee#endif
229367776f66c93abb44ee4d1432ba59458ce4fb28f7Vinson Lee
2294cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2295cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2297cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*@}*/
2298cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2301cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Mesa extension stubs.  These will help reduce portability problems.
2302cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
2303cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*@{*/
2304cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2305cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2306cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Release all buffers associated with the specified GLX drawable.
2307cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2308cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \todo
2309cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This function was intended for stand-alone Mesa.  The issue there is that
2310cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * the library doesn't get any notification when a window is closed.  In
2311cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * DRI there is a similar but slightly different issue.  When GLX 1.3 is
2312cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * supported, there are 3 different functions to destroy a drawable.  It
2313cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * should be possible to create GLX protocol (or have it determine which
2314cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * protocol to use based on the type of the drawable) to have one function
2315cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * do the work of 3.  For the direct-rendering case, this function could
2316cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * just call the driver's \c __DRIdrawableRec::destroyDrawable function.
2317cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * This would reduce the frequency with which \c __driGarbageCollectDrawables
2318cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * would need to be used.  This really should be done as part of the new DRI
2319cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * interface work.
2320cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2321cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa http://oss.sgi.com/projects/ogl-sample/registry/MESA/release_buffers.txt
2322cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     __driGarbageCollectDrawables
2323cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyGLXPixmap
2324cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyPbuffer glXDestroyPixmap glXDestroyWindow
2325cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *     glXDestroyGLXPbufferSGIX glXDestroyGLXVideoSourceSGIX
2326cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
23270896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic Bool
23280896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXReleaseBuffersMESA(Display * dpy, GLXDrawable d)
2329cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2330cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2331cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) d;
2332cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return False;
2333cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2334cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2335cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
233638c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT GLXPixmap
23370896268b97674d009d609476acfa1eed5dfea350RALOVICH, KristófglXCreateGLXPixmapMESA(Display * dpy, XVisualInfo * visual,
23380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       Pixmap pixmap, Colormap cmap)
2339cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2340cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) dpy;
2341cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) visual;
2342cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) pixmap;
2343cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   (void) cmap;
2344cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return 0;
2345cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
23460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
2347fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/*@}*/
2348cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2349fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick
2350fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/**
2351fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick * GLX_MESA_copy_sub_buffer
2352fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick */
2353f2ad1b60c0da11283b399008f491792790cea294Brian Paul#define X_GLXvop_CopySubBufferMESA 5154 /* temporary */
23540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void
23550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable,
23560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf                       int x, int y, int width, int height)
2357cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
23580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   xGLXVendorPrivateReq *req;
2359c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc;
23600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLXContextTag tag;
23610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD32 *drawable_ptr;
23620896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   INT32 *x_ptr, *y_ptr, *w_ptr, *h_ptr;
23630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   CARD8 opcode;
2364f2ad1b60c0da11283b399008f491792790cea294Brian Paul
23652235b1c72d79ec00a03c99219154e3f9103e692bKristian Høgsberg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2366eeaab2047cfce8a7445fd9f835e737682eb503acKristian Høgsberg   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
23670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (pdraw != NULL) {
236866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg      struct glx_screen *psc = pdraw->psc;
23690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      if (psc->driScreen->copySubBuffer != NULL) {
23700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         glFlush();
23710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         (*psc->driScreen->copySubBuffer) (pdraw, x, y, width, height);
23720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      }
23730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
23750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2376f2ad1b60c0da11283b399008f491792790cea294Brian Paul#endif
2377f2ad1b60c0da11283b399008f491792790cea294Brian Paul
23780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   opcode = __glXSetupForCommand(dpy);
23790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (!opcode)
23800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return;
2381cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
23820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   /*
2383f2ad1b60c0da11283b399008f491792790cea294Brian Paul    ** The calling thread may or may not have a current context.  If it
2384f2ad1b60c0da11283b399008f491792790cea294Brian Paul    ** does, send the context tag so the server can do a flush.
2385f2ad1b60c0da11283b399008f491792790cea294Brian Paul    */
23860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   gc = __glXGetCurrentContext();
23870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((gc != NULL) && (dpy == gc->currentDpy) &&
23880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       ((drawable == gc->currentDrawable) ||
23890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf        (drawable == gc->currentReadable))) {
23900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = gc->currentContextTag;
23910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
23920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
23930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      tag = 0;
23940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
23950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
23960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   LockDisplay(dpy);
23970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GetReqExtra(GLXVendorPrivate, sizeof(CARD32) + sizeof(INT32) * 4, req);
23980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->reqType = opcode;
23990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->glxCode = X_GLXVendorPrivate;
24000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->vendorCode = X_GLXvop_CopySubBufferMESA;
24010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   req->contextTag = tag;
24020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
24030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   drawable_ptr = (CARD32 *) (req + 1);
24040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   x_ptr = (INT32 *) (drawable_ptr + 1);
24050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   y_ptr = (INT32 *) (drawable_ptr + 2);
24060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   w_ptr = (INT32 *) (drawable_ptr + 3);
24070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   h_ptr = (INT32 *) (drawable_ptr + 4);
24080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
24090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *drawable_ptr = drawable;
24100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *x_ptr = x;
24110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *y_ptr = y;
24120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *w_ptr = width;
24130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   *h_ptr = height;
24140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
24150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   UnlockDisplay(dpy);
24160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   SyncHandle();
2417f2ad1b60c0da11283b399008f491792790cea294Brian Paul}
2418cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2419643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg/*@{*/
2420643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void
2421643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg__glXBindTexImageEXT(Display * dpy,
2422643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg                     GLXDrawable drawable, int buffer, const int *attrib_list)
2423643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{
2424c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
2425643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
24263ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg   if (gc == NULL || gc->vtable->bind_tex_image == NULL)
2427643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg      return;
2428643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2429643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   gc->vtable->bind_tex_image(dpy, drawable, buffer, attrib_list);
2430643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}
2431643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2432643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void
2433643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg__glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
2434643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg{
2435c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg   struct glx_context *gc = __glXGetCurrentContext();
2436643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
24373ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg   if (gc == NULL || gc->vtable->release_tex_image == NULL)
2438643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg      return;
2439643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2440643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg   gc->vtable->release_tex_image(dpy, drawable, buffer);
2441643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg}
2442643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg
2443fc5b57b71375ef6c117482be036b442c2cb8ab23Ian Romanick/*@}*/
2444cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2445ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif /* GLX_USE_APPLEGL */
2446ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston
2447cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2448cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c strdup is actually not a standard ANSI C or POSIX routine.
2449cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Irix will not define it if ANSI mode is in effect.
24500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2451cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa strdup
2452cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
24533d28a2690f3752990be50a25447747e237d7bee9Kristian Høgsberg_X_HIDDEN char *
2454cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson__glXstrdup(const char *str)
2455cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2456cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   char *copy;
2457cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   copy = (char *) Xmalloc(strlen(str) + 1);
2458cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   if (!copy)
2459cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      return NULL;
2460cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   strcpy(copy, str);
2461cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return copy;
2462cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2463cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2464cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/*
2465cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** glXGetProcAddress support
2466cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/
2467cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
24680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstruct name_address_pair
24690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
2470cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   const char *Name;
2471cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   GLvoid *Address;
2472cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson};
2473cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2474cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define GLX_FUNCTION(f) { # f, (GLvoid *) f }
2475cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define GLX_FUNCTION2(n,f) { # n, (GLvoid *) f }
2476cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2477cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic const struct name_address_pair GLX_functions[] = {
2478cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_0 ***/
24790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXChooseVisual),
24800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCopyContext),
24810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateContext),
24820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmap),
24830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyContext),
24840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyGLXPixmap),
24850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetConfig),
24860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentContext),
24870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentDrawable),
24880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXIsDirect),
24890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXMakeCurrent),
24900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryExtension),
24910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryVersion),
24920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSwapBuffers),
24930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXUseXFont),
24940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXWaitGL),
24950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXWaitX),
2496cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2497cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_1 ***/
24980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetClientString),
24990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryExtensionsString),
25000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryServerString),
2501cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2502cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_2 ***/
25030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentDisplay),
2504cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2505cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_VERSION_1_3 ***/
25060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXChooseFBConfig),
25070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateNewContext),
25080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreatePbuffer),
25090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreatePixmap),
25100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateWindow),
25110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyPbuffer),
25120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyPixmap),
25130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyWindow),
25140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetCurrentReadDrawable),
25150896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigAttrib),
25160896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigs),
25170896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetSelectedEvent),
25180896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetVisualFromFBConfig),
25190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXMakeContextCurrent),
25200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryContext),
25210896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryDrawable),
25220896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSelectEvent),
2523cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2524ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2525cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_swap_control ***/
25260896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapIntervalSGI, __glXSwapIntervalSGI),
2527cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2528cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_video_sync ***/
25290896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetVideoSyncSGI, __glXGetVideoSyncSGI),
25300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitVideoSyncSGI, __glXWaitVideoSyncSGI),
2531cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2532cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGI_make_current_read ***/
25330896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXMakeCurrentReadSGI, glXMakeContextCurrent),
25340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetCurrentReadDrawableSGI, glXGetCurrentReadDrawable),
2535cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2536cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_EXT_import_context ***/
25370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXFreeContextEXT),
25380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetContextIDEXT),
25390896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetCurrentDisplayEXT, glXGetCurrentDisplay),
25400896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXImportContextEXT),
25410896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXQueryContextInfoEXT, glXQueryContext),
2542ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2543cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2544cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_fbconfig ***/
25450896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetFBConfigAttribSGIX, glXGetFBConfigAttrib),
25460896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXChooseFBConfigSGIX, glXChooseFBConfig),
25470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmapWithConfigSGIX),
25480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateContextWithConfigSGIX),
25490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetVisualFromFBConfigSGIX, glXGetVisualFromFBConfig),
25500896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetFBConfigFromVisualSGIX),
2551cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2552ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2553cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_pbuffer ***/
25540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPbufferSGIX),
25550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXDestroyGLXPbufferSGIX),
25560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXQueryGLXPbufferSGIX),
25570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXSelectEventSGIX),
25580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetSelectedEventSGIX),
2559cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2560cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_swap_group ***/
25610896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXJoinSwapGroupSGIX, __glXJoinSwapGroupSGIX),
2562cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2563cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_SGIX_swap_barrier ***/
25640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXBindSwapBarrierSGIX, __glXBindSwapBarrierSGIX),
25650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXQueryMaxSwapBarriersSGIX, __glXQueryMaxSwapBarriersSGIX),
2566cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2567cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_copy_sub_buffer ***/
25680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXCopySubBufferMESA, __glXCopySubBufferMESA),
2569cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2570cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_pixmap_colormap ***/
25710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXCreateGLXPixmapMESA),
2572cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2573cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_release_buffers ***/
25740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXReleaseBuffersMESA, __glXReleaseBuffersMESA),
2575cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2576cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_MESA_swap_control ***/
25770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapIntervalMESA, __glXSwapIntervalMESA),
25780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetSwapIntervalMESA, __glXGetSwapIntervalMESA),
2579ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
2580cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2581cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_ARB_get_proc_address ***/
25820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetProcAddressARB),
2583cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2584cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX 1.4 ***/
25850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetProcAddress, glXGetProcAddressARB),
2586cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2587ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL
2588cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** GLX_OML_sync_control ***/
25890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitForSbcOML, __glXWaitForSbcOML),
25900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXWaitForMscOML, __glXWaitForMscOML),
25910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXSwapBuffersMscOML, __glXSwapBuffersMscOML),
25920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetMscRateOML, __glXGetMscRateOML),
25930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXGetSyncValuesOML, __glXGetSyncValuesOML),
2594cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
259542725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul   /*** GLX_EXT_texture_from_pixmap ***/
25960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXBindTexImageEXT, __glXBindTexImageEXT),
25970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION2(glXReleaseTexImageEXT, __glXReleaseTexImageEXT),
2598ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
259942725d6f545087d094b1479d1ebcbd45ec6ac15cBrian Paul
260080b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2601cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /*** DRI configuration ***/
26020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetScreenDriver),
26030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   GLX_FUNCTION(glXGetDriverConfig),
2604cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif
2605cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
260678aa71a3ce8a999d64f30ce4f6d3939eec198f16Ian Romanick   /*** GLX_ARB_create_context and GLX_ARB_create_context_profile ***/
260778aa71a3ce8a999d64f30ce4f6d3939eec198f16Ian Romanick   GLX_FUNCTION(glXCreateContextAttribsARB),
260878aa71a3ce8a999d64f30ce4f6d3939eec198f16Ian Romanick
26090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   {NULL, NULL}                 /* end of list */
2610cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson};
2611cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2612cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic const GLvoid *
2613cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonget_glx_proc_address(const char *funcName)
2614cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2615cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   GLuint i;
2616cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2617cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* try static functions */
2618cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   for (i = 0; GLX_functions[i].Name; i++) {
2619cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson      if (strcmp(GLX_functions[i].Name, funcName) == 0)
26200896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf         return GLX_functions[i].Address;
2621cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
2622cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2623cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return NULL;
2624cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2625cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2626cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2627cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the address of a named GL function.  This is the pre-GLX 1.4 name for
2628cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddress.
2629cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2630cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param procName  Name of a GL or GLX function.
2631cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns         A pointer to the named function
2632cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2633cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddress
2634cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
263538c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void (*glXGetProcAddressARB(const GLubyte * procName)) (void)
2636cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
26370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   typedef void (*gl_function) (void);
2638cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   gl_function f;
2639cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2640cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2641cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   /* Search the table of GLX and internal functions first.  If that
2642cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * fails and the supplied name could be a valid core GL name, try
2643cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * searching the core GL function table.  This check is done to prevent
2644cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * DRI based drivers from searching the core GL function table for
2645cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    * internal API functions.
2646cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson    */
2647cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   f = (gl_function) get_glx_proc_address((const char *) procName);
26480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if ((f == NULL) && (procName[0] == 'g') && (procName[1] == 'l')
26490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf       && (procName[2] != 'X')) {
2650027ce0c493a85c863df88b43f61aea34bcd4cd58Matt Turner#ifdef GLX_SHARED_GLAPI
2651e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu      f = (gl_function) __indirect_get_proc_address((const char *) procName);
2652027ce0c493a85c863df88b43f61aea34bcd4cd58Matt Turner#endif
2653e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu      if (!f)
2654e8c7d7598fb48237508f566204c71ba8f74d544fChia-I Wu         f = (gl_function) _glapi_get_proc_address((const char *) procName);
2655559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston      if (!f) {
2656559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston         struct glx_context *gc = __glXGetCurrentContext();
2657559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston
2658559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston         if (gc != NULL && gc->vtable->get_proc_address != NULL)
2659559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston            f = gc->vtable->get_proc_address((const char *) procName);
2660559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston      }
2661cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   }
2662cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return f;
2663cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2664cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2665cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2666cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the address of a named GL function.  This is the GLX 1.4 name for
2667cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddressARB.
2668cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2669cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param procName  Name of a GL or GLX function.
2670cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns         A pointer to the named function
2671cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2672cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddressARB
2673cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
267438c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg_X_EXPORT void (*glXGetProcAddress(const GLubyte * procName)) (void)
2675cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#if defined(__GNUC__) && !defined(GLX_ALIAS_UNSUPPORTED)
26760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   __attribute__ ((alias("glXGetProcAddressARB")));
2677cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else
2678cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{
2679cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson   return glXGetProcAddressARB(procName);
2680cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2681cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif /* __GNUC__ */
2682cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
2683cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson
268480b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
2685cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/**
2686cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Get the unadjusted system time (UST).  Currently, the UST is measured in
2687cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * microseconds since Epoc.  The actual resolution of the UST may vary from
2688cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * system to system, and the units may vary from release to release.
2689cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Drivers should not call this function directly.  They should instead use
2690cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \c glXGetProcAddress to obtain a pointer to the function.
2691cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2692cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param ust Location to store the 64-bit UST
2693cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \returns Zero on success or a negative errno value on failure.
26940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf *
2695cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa glXGetProcAddress, PFNGLXGETUSTPROC
2696cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson *
2697cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \since Internal API version 20030317.
2698cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */
26990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf_X_HIDDEN int
27000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf__glXGetUST(int64_t * ust)
27010896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{
27020896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   struct timeval tv;
27030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
27040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (ust == NULL) {
27050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return -EFAULT;
27060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
27070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf
27080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   if (gettimeofday(&tv, NULL) == 0) {
27090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      ust[0] = (tv.tv_sec * 1000000) + tv.tv_usec;
27100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return 0;
27110896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
27120896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   else {
27130896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf      return -errno;
27140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf   }
2715cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}
2716cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif /* GLX_DIRECT_RENDERING */
2717