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