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