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