glxext.c revision 0256edd709d976198d5354fdd88143d8da9e51d5
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 glxext.c 33cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * GLX protocol interface boot-strap code. 34cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 35cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Direct rendering support added by Precision Insight, Inc. 36cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 37cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \author Kevin E. Martin <kevin@precisioninsight.com> 38acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf */ 39cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 40a25e1aa0aab6bd278eefa7c0748b491c9c6ae62cBrian Paul#include <assert.h> 410d84c68313cba241b8020f12211f2abdfd53a955Ian Romanick#include "glxclient.h" 4282dfd4b71f932f46e116743b204d0077a0875ab8Brian Paul#include <X11/extensions/Xext.h> 4382dfd4b71f932f46e116743b204d0077a0875ab8Brian Paul#include <X11/extensions/extutil.h> 44ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 45ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_glx.h" 46ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "apple_visual.h" 47ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 48cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "glxextensions.h" 49cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 502eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 510a0cd3a8ae32fcdfd058969ae288449bbc87ca60Brian Paul#include <X11/Xlib-xcb.h> 5207bacc226379dba36b245672af6d680a7d18e58fJeremy Kolb#include <xcb/xcb.h> 5307bacc226379dba36b245672af6d680a7d18e58fJeremy Kolb#include <xcb/glx.h> 542eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif 552eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul 56cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 57cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#ifdef DEBUG 58c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergvoid __glXDumpDrawBuffer(struct glx_context * ctx); 59cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 60cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 61cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 62cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** You can set this cell to 1 to force the gl drawing stuff to be 63cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** one command per packet 64cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 653d28a2690f3752990be50a25447747e237d7bee9Kristian Høgsberg_X_HIDDEN int __glXDebug = 0; 66cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 67cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* Extension required boiler plate */ 68cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 69ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsbergstatic const char __glXExtensionName[] = GLX_EXTENSION_NAME; 70c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg static struct glx_display *glx_displays; 71cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 72cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic /* const */ char *error_list[] = { 73acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadContext", 74acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadContextState", 75acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadDrawable", 76acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadPixmap", 77acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadContextTag", 78acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadCurrentWindow", 79acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadRenderRequest", 80acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadLargeRequest", 81acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXUnsupportedPrivateRequest", 82acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadFBConfig", 83acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadPbuffer", 84acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadCurrentDrawable", 85acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf "GLXBadWindow", 86cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}; 87cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 88ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 89ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic char *__glXErrorString(Display *dpy, int code, XExtCodes *codes, 90ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston char *buf, int n); 91ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 92ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 93acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristófstatic 94acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, KristófXEXT_GENERATE_ERROR_STRING(__glXErrorString, __glXExtensionName, 95acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __GLX_NUMBER_ERRORS, error_list) 96ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 977f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes/* 987f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * GLX events are a bit funky. We don't stuff the X event code into 997f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * our user exposed (via XNextEvent) structure. Instead we use the GLX 1007f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * private event code namespace (and hope it doesn't conflict). Clients 1017f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * have to know that bit 15 in the event type field means they're getting 1027f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * a GLX event, and then handle the various sub-event types there, rather 1037f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * than simply checking the event code and handling it directly. 1047f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes */ 1057f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1067f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Bool 1077f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes__glXWireToEvent(Display *dpy, XEvent *event, xEvent *wire) 1087f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes{ 109c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *glx_dpy = __glXInitialize(dpy); 1107f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 111ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (glx_dpy == NULL) 112ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return False; 1137f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 114ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg switch ((wire->u.u.type & 0x7f) - glx_dpy->codes->first_event) { 1157f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_PbufferClobber: 1167f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes { 1177f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes GLXPbufferClobberEvent *aevent = (GLXPbufferClobberEvent *)event; 1187f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes xGLXPbufferClobberEvent *awire = (xGLXPbufferClobberEvent *)wire; 1197f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->event_type = awire->type; 1207f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->serial = awire->sequenceNumber; 1217f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->event_type = awire->event_type; 1227f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->draw_type = awire->draw_type; 1237f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->drawable = awire->drawable; 1247f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->buffer_mask = awire->buffer_mask; 1257f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->aux_buffer = awire->aux_buffer; 1267f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->x = awire->x; 1277f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->y = awire->y; 1287f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->width = awire->width; 1297f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->height = awire->height; 1307f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->count = awire->count; 1317f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return True; 1327f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1337f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_BufferSwapComplete: 1347f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes { 1357f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event; 1361e39fc784bc3d0d5ad01d9c147529ac0e10f1262Jesse Barnes xGLXBufferSwapComplete2 *awire = (xGLXBufferSwapComplete2 *)wire; 1374df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes struct glx_drawable *glxDraw = GetGLXDrawable(dpy, awire->drawable); 1387f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->event_type = awire->event_type; 1397f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->drawable = awire->drawable; 1407f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; 1417f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; 1424df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 1434df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes if (!glxDraw) 1444df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes return False; 1454df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 1464df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes if (awire->sbc < glxDraw->lastEventSbc) 1474df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes glxDraw->eventSbcWrap += 0x100000000; 1484df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes glxDraw->lastEventSbc = awire->sbc; 1494df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes aevent->sbc = awire->sbc + glxDraw->eventSbcWrap; 1507f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return True; 1517f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1527f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes default: 1537f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes /* client doesn't support server event */ 1547f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1557f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1567f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1577f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return False; 1587f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes} 1597f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1607f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes/* We don't actually support this. It doesn't make sense for clients to 1617f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * send each other GLX events. 1627f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes */ 1637f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Status 1647f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes__glXEventToWire(Display *dpy, XEvent *event, xEvent *wire) 1657f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes{ 166c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *glx_dpy = __glXInitialize(dpy); 1677f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 168ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (glx_dpy == NULL) 169ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return False; 1707f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1717f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes switch (event->type) { 1727f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_DAMAGED: 1737f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1747f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_SAVED: 1757f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1767a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg case GLX_EXCHANGE_COMPLETE_INTEL: 1777f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 17842ea25cb4ecae09b5cc011a95d42ba7f0645dde3Ian Romanick case GLX_COPY_COMPLETE_INTEL: 1797f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1807a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg case GLX_FLIP_COMPLETE_INTEL: 1817f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1827f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes default: 1837f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes /* client doesn't support server event */ 1847f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1857f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1867f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1877f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return Success; 1887f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes} 1897f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 190cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/ 191cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 192cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Free the per screen configs data as well as the array of 193cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** __glXScreenConfigs. 194cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 195fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristófstatic void 1961f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian HøgsbergFreeScreenConfigs(struct glx_display * priv) 197cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 19866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen *psc; 199acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint i, screens; 200acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 201acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Free screen configuration information */ 202acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screens = ScreenCount(priv->dpy); 203f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg for (i = 0; i < screens; i++) { 20466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg psc = priv->screens[i]; 205bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_screen_cleanup(psc); 206cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 20780b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 208acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (psc->driScreen) { 209f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->driScreen->destroyScreen(psc); 210f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg } else { 211f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 212acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 213f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg#else 214f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 215cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 216acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 21766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg XFree((char *) priv->screens); 21866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens = NULL; 219cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 220cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2211f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergstatic void 2221f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergglx_display_free(struct glx_display *priv) 223cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 2241f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg struct glx_context *gc; 225ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 226ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg gc = __glXGetCurrentContext(); 2271f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (priv->dpy == gc->currentDpy) { 228c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg gc->vtable->destroy(gc); 229ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg __glXSetCurrentContextNull(); 230ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 231acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 232acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FreeScreenConfigs(priv); 233ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (priv->serverGLXvendor) 234acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv->serverGLXvendor); 235ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (priv->serverGLXversion) 236acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv->serverGLXversion); 237cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2384df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes __glxHashDestroy(priv->glXDrawHash); 2394df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 240ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 241e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg __glxHashDestroy(priv->drawHash); 242e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg 243acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Free the direct rendering per display data */ 244acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->driswDisplay) 245acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->driswDisplay->destroyDisplay) (priv->driswDisplay); 246acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->driswDisplay = NULL; 247acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 248acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->driDisplay) 249acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->driDisplay->destroyDisplay) (priv->driDisplay); 250acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->driDisplay = NULL; 251acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 252acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->dri2Display) 253acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->dri2Display->destroyDisplay) (priv->dri2Display); 254acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->dri2Display = NULL; 255cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 256cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 257acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv); 2581f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg} 2591f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2601f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergstatic int 2611f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg__glXCloseDisplay(Display * dpy, XExtCodes * codes) 2621f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg{ 2630f20e2e18f902b4319851643e1775a18c2aacb3dHenri Verbeet struct glx_display *priv, **prev; 2641f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2651f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XLockMutex(_Xglobal_lock); 2661f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg prev = &glx_displays; 2671f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg for (priv = glx_displays; priv; prev = &priv->next, priv = priv->next) { 2681f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (priv->dpy == dpy) { 2690f20e2e18f902b4319851643e1775a18c2aacb3dHenri Verbeet *prev = priv->next; 2701f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg break; 2711f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 2721f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 2730f20e2e18f902b4319851643e1775a18c2aacb3dHenri Verbeet _XUnlockMutex(_Xglobal_lock); 2741f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2751f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg glx_display_free(priv); 276cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 277ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return 1; 278ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg} 279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 281cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Query the version of the GLX extension. This procedure works even if 282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** the client extension is not completely set up. 283cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 284acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristófstatic Bool 285acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, KristófQueryVersion(Display * dpy, int opcode, int *major, int *minor) 286cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 287fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#ifdef USE_XCB 288fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 2890896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xcb_glx_query_version_reply_t *reply = xcb_glx_query_version_reply(c, 2900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xcb_glx_query_version 2910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (c, 2920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLX_MAJOR_VERSION, 2930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLX_MINOR_VERSION), 2940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL); 2950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2960256edd709d976198d5354fdd88143d8da9e51d5Stéphane Marchesin if (!reply) 2970256edd709d976198d5354fdd88143d8da9e51d5Stéphane Marchesin return GL_FALSE; 2980256edd709d976198d5354fdd88143d8da9e51d5Stéphane Marchesin 2990896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (reply->major_version != GLX_MAJOR_VERSION) { 300fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf free(reply); 301fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf return GL_FALSE; 302fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf } 303fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf *major = reply->major_version; 304fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf *minor = min(reply->minor_version, GLX_MINOR_VERSION); 305fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf free(reply); 306fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf return GL_TRUE; 307fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#else 308acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXQueryVersionReq *req; 309acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXQueryVersionReply reply; 310acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 311acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Send the glXQueryVersion request */ 312acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 313acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXQueryVersion, req); 314acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = opcode; 315acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXQueryVersion; 316acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->majorVersion = GLX_MAJOR_VERSION; 317acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->minorVersion = GLX_MINOR_VERSION; 318acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XReply(dpy, (xReply *) & reply, 0, False); 319acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 320acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 321acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 322acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (reply.majorVersion != GLX_MAJOR_VERSION) { 323acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 324acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** The server does not support the same major release as this 325acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** client. 326acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf */ 327acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 328acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 329acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf *major = reply.majorVersion; 330acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf *minor = min(reply.minorVersion, GLX_MINOR_VERSION); 331acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_TRUE; 332fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#endif /* USE_XCB */ 333cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 334cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 335ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 336ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * We don't want to enable this GLX_OML_swap_method in glxext.h, 337ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * because we can't support it. The X server writes it out though, 338ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * so we should handle it somehow, to avoid false warnings. 339ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 340ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonenum { 341ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston IGNORE_GLX_SWAP_METHOD_OML = 0x8060 342ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}; 343ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 344cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3456ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic GLint 3466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergconvert_from_x_visual_type(int visualType) 3476ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg{ 3486ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg static const int glx_visual_types[] = { 3496ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_STATIC_GRAY, GLX_GRAY_SCALE, 3506ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 3516ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_TRUE_COLOR, GLX_DIRECT_COLOR 3526ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg }; 3536ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 3546ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg if (visualType < ARRAY_SIZE(glx_visual_types)) 3556ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return glx_visual_types[visualType]; 3566ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 3576ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return GLX_NONE; 3586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg} 3596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 360ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 361ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * getVisualConfigs uses the !tagged_only path. 362ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * getFBConfigs uses the tagged_only path. 363ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 364acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 3656ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg__glXInitializeVisualConfigFromTags(struct glx_config * config, int count, 366acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const INT32 * bp, Bool tagged_only, 367acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Bool fbconfig_style_tags) 368cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 369acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf int i; 370cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 371acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!tagged_only) { 372acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Copy in the first set of properties */ 373acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualID = *bp++; 374cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3756ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg config->visualType = convert_from_x_visual_type(*bp++); 376cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 377acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbMode = *bp++; 378cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 379acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->redBits = *bp++; 380acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->greenBits = *bp++; 381acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->blueBits = *bp++; 382acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->alphaBits = *bp++; 383acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumRedBits = *bp++; 384acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumGreenBits = *bp++; 385acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumBlueBits = *bp++; 386acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumAlphaBits = *bp++; 387cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 388acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->doubleBufferMode = *bp++; 389acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stereoMode = *bp++; 390cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 391acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbBits = *bp++; 392acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->depthBits = *bp++; 393acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stencilBits = *bp++; 394acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->numAuxBuffers = *bp++; 395acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->level = *bp++; 396cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 397ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 398ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* AppleSGLX supports pixmap and pbuffers with all config. */ 399ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston config->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 400ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Unfortunately this can create an ABI compatibility problem. */ 401ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston count -= 18; 402ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 403acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf count -= __GLX_MIN_CONFIG_PROPS; 404ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 405acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 406cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 407acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 408cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Additional properties may be in a list at the end 409cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** of the reply. They are in pairs of property type 410cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** and property value. 411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 412cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 413cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define FETCH_OR_SET(tag) \ 414cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson config-> tag = ( fbconfig_style_tags ) ? *bp++ : 1 415cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 416acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < count; i += 2) { 417ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston long int tag = *bp++; 418ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 419ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston switch (tag) { 420acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RGBA: 421acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(rgbMode); 422acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 423acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BUFFER_SIZE: 424acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbBits = *bp++; 425acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 426acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_LEVEL: 427acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->level = *bp++; 428acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 429acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DOUBLEBUFFER: 430acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(doubleBufferMode); 431acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 432acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_STEREO: 433acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(stereoMode); 434acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 435acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_AUX_BUFFERS: 436acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->numAuxBuffers = *bp++; 437acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 438acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RED_SIZE: 439acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->redBits = *bp++; 440acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 441acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_GREEN_SIZE: 442acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->greenBits = *bp++; 443acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 444acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BLUE_SIZE: 445acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->blueBits = *bp++; 446acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 447acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ALPHA_SIZE: 448acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->alphaBits = *bp++; 449acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 450acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DEPTH_SIZE: 451acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->depthBits = *bp++; 452acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 453acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_STENCIL_SIZE: 454acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stencilBits = *bp++; 455acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 456acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_RED_SIZE: 457acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumRedBits = *bp++; 458acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 459acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_GREEN_SIZE: 460acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumGreenBits = *bp++; 461acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 462acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_BLUE_SIZE: 463acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumBlueBits = *bp++; 464acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 465acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_ALPHA_SIZE: 466acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumAlphaBits = *bp++; 467acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 468acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_CAVEAT_EXT: 469acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualRating = *bp++; 470acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 471acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_X_VISUAL_TYPE: 472acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualType = *bp++; 473acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 474acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_TYPE: 475acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentPixel = *bp++; 476acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 477acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_INDEX_VALUE: 478acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentIndex = *bp++; 479acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 480acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_RED_VALUE: 481acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentRed = *bp++; 482acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 483acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_GREEN_VALUE: 484acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentGreen = *bp++; 485acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 486acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_BLUE_VALUE: 487acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentBlue = *bp++; 488acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 489acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_ALPHA_VALUE: 490acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentAlpha = *bp++; 491acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 492acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_ID: 493acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualID = *bp++; 494acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 495acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DRAWABLE_TYPE: 496acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->drawableType = *bp++; 497ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 498ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* AppleSGLX supports pixmap and pbuffers with all config. */ 499ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston config->drawableType |= GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 500ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 501acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 502acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RENDER_TYPE: 503acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->renderType = *bp++; 504acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 505acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_X_RENDERABLE: 506acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->xRenderable = *bp++; 507acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 508acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_FBCONFIG_ID: 509acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->fbconfigID = *bp++; 510acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 511acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_WIDTH: 512acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferWidth = *bp++; 513acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 514acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_HEIGHT: 515acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferHeight = *bp++; 516acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 517acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_PIXELS: 518acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferPixels = *bp++; 519acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 520ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL 521acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX: 522acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->optimalPbufferWidth = *bp++; 523acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 524acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX: 525acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->optimalPbufferHeight = *bp++; 526acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 527acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_SELECT_GROUP_SGIX: 528acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualSelectGroup = *bp++; 529acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 530acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SWAP_METHOD_OML: 531acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->swapMethod = *bp++; 532acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 533ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 534acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SAMPLE_BUFFERS_SGIS: 535acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->sampleBuffers = *bp++; 536acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 537acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SAMPLES_SGIS: 538acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->samples = *bp++; 539acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 540ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 541ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case IGNORE_GLX_SWAP_METHOD_OML: 542ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* We ignore this tag. See the comment above this function. */ 543ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ++bp; 544ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 545ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 546acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_RGB_EXT: 547acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureRgb = *bp++; 548acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 549acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_RGBA_EXT: 550acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureRgba = *bp++; 551acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 552acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_MIPMAP_TEXTURE_EXT: 553acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToMipmapTexture = *bp++; 554acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 555acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_TARGETS_EXT: 556acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureTargets = *bp++; 557acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 558acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_Y_INVERTED_EXT: 559acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->yInverted = *bp++; 560acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 561ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 562b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie case GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT: 5636538b5824e298eaebede2d9686c7607c44ab446aDave Airlie config->sRGBCapable = *bp++; 564b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie break; 565b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie 56626a9b7e4c737c89b47844303bb7413ceab0280a5Dave Airlie case GLX_USE_GL: 567fc72452b976e368caf133e108ecaddfea8b2b147Brian Paul if (fbconfig_style_tags) 568fc72452b976e368caf133e108ecaddfea8b2b147Brian Paul bp++; 56926a9b7e4c737c89b47844303bb7413ceab0280a5Dave Airlie break; 570acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case None: 571acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf i = count; 572acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 573acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf default: 574ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if(getenv("LIBGL_DIAGNOSTIC")) { 575ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston long int tagvalue = *bp++; 576ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston fprintf(stderr, "WARNING: unknown GLX tag from server: " 577ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston "tag 0x%lx value 0x%lx\n", tag, tagvalue); 578ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } else { 579ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Ignore the unrecognized tag's value */ 580ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston bp++; 581ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 5822c30a8d8f9aa405d3d30e75371b2d6643ecd8d32Brian Paul break; 583acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 584acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 585acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 586acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->renderType = 587acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT; 588cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 589cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5906ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic struct glx_config * 5918c2b4b33c583401e2efe02db859d5af31872921dRALOVICH, KristófcreateConfigsFromProperties(Display * dpy, int nvisuals, int nprops, 5928c2b4b33c583401e2efe02db859d5af31872921dRALOVICH, Kristóf int screen, GLboolean tagged_only) 5936c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 594acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf INT32 buf[__GLX_TOTAL_CONFIG], *props; 595acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf unsigned prop_size; 5966ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg struct glx_config *modes, *m; 597acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf int i; 598acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 599acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (nprops == 0) 600acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 601acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 602acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* FIXME: Is the __GLX_MIN_CONFIG_PROPS test correct for FBconfigs? */ 603acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 604acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Check number of properties */ 605acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (nprops < __GLX_MIN_CONFIG_PROPS || nprops > __GLX_MAX_CONFIG_PROPS) 606acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 607acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 608acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Allocate memory for our config structure */ 6096ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg modes = glx_config_create_list(nvisuals); 610acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!modes) 611acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 612acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 613acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf prop_size = nprops * __GLX_SIZE_INT32; 614acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (prop_size <= sizeof(buf)) 615acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf props = buf; 616acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else 617acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf props = Xmalloc(prop_size); 618acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 619acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Read each config structure and convert it into our format */ 620acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m = modes; 621acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < nvisuals; i++) { 622acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XRead(dpy, (char *) props, prop_size); 623ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 624ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Older X servers don't send this so we default it here. */ 625acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m->drawableType = GLX_WINDOW_BIT; 626ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 627ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 628ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * The XQuartz 2.3.2.1 X server doesn't set this properly, so 629ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * set the proper bits here. 630ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * AppleSGLX supports windows, pixmaps, and pbuffers with all config. 631ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 632ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston m->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 633ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 634ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXInitializeVisualConfigFromTags(m, nprops, props, 635acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf tagged_only, GL_TRUE); 636acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m->screen = screen; 637acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m = m->next; 638acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 639acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 640acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (props != buf) 641acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree(props); 642acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 643acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return modes; 6446c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 6456c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6466c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsbergstatic GLboolean 64766fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian HøgsberggetVisualConfigs(struct glx_screen *psc, 648c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv, int screen) 6496c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 65062688f11355cfa865d420755aa159875b425cc9bRALOVICH, Kristóf xGLXGetVisualConfigsReq *req; 651acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetVisualConfigsReply reply; 652f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Display *dpy = priv->dpy; 653acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 654acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 655acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 656acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->visuals = NULL; 657acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXGetVisualConfigs, req); 658acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = priv->majorOpcode; 659acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXGetVisualConfigs; 660acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->screen = screen; 661acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 662acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!_XReply(dpy, (xReply *) & reply, 0, False)) 663acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 664acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 665acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->visuals = createConfigsFromProperties(dpy, 666acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numVisuals, 667acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numProps, 668acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screen, GL_FALSE); 6696c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6706c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg out: 671acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 672acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return psc->visuals != NULL; 6736c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 6746c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6756c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsbergstatic GLboolean 676c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg getFBConfigs(struct glx_screen *psc, struct glx_display *priv, int screen) 6776c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 678acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsReq *fb_req; 679acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsSGIXReq *sgi_req; 680acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXVendorPrivateWithReplyReq *vpreq; 681acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsReply reply; 682f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Display *dpy = priv->dpy; 683acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 6840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->serverGLXexts = 6850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS); 686acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 687acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 688acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 689acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->configs = NULL; 690acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (atof(priv->serverGLXversion) >= 1.3) { 691acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXGetFBConfigs, fb_req); 692acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->reqType = priv->majorOpcode; 693acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->glxCode = X_GLXGetFBConfigs; 694acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->screen = screen; 695acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 696acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else if (strstr(psc->serverGLXexts, "GLX_SGIX_fbconfig") != NULL) { 697acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReqExtra(GLXVendorPrivateWithReply, 698cbe9fc12a64c3ae89fd1b20e9e165aa4b76293a5Julien Cristau sz_xGLXGetFBConfigsSGIXReq - 699acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sz_xGLXVendorPrivateWithReplyReq, vpreq); 700acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req = (xGLXGetFBConfigsSGIXReq *) vpreq; 701acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->reqType = priv->majorOpcode; 702acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->glxCode = X_GLXVendorPrivateWithReply; 703acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->vendorCode = X_GLXvop_GetFBConfigsSGIX; 704acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->screen = screen; 705acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 706acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else 707acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 708acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 709acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!_XReply(dpy, (xReply *) & reply, 0, False)) 710acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 711acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 712acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->configs = createConfigsFromProperties(dpy, 713acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numFBConfigs, 714acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numAttribs * 2, 715acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screen, GL_TRUE); 7166c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 7176c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg out: 718acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 719acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return psc->configs != NULL; 7206c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 721cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 722f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg_X_HIDDEN Bool 72366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergglx_screen_init(struct glx_screen *psc, 724c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg int screen, struct glx_display * priv) 725f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg{ 726f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg /* Initialize per screen dynamic client GLX extensions */ 727f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->ext_list_first_time = GL_TRUE; 728f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->scr = screen; 729f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->dpy = priv->dpy; 730037755122e9011c768e5caa4d4cb83aba783d3e9Kristian Høgsberg psc->display = priv; 731f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 732f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg getVisualConfigs(psc, priv, screen); 733f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg getFBConfigs(psc, priv, screen); 734f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 735f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return GL_TRUE; 736f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg} 737f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 738bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet_X_HIDDEN void 739bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeetglx_screen_cleanup(struct glx_screen *psc) 740bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet{ 741bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->configs) { 742bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_config_destroy_list(psc->configs); 743bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->effectiveGLXexts) 744bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet Xfree(psc->effectiveGLXexts); 745bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet psc->configs = NULL; /* NOTE: just for paranoia */ 746bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet } 747bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->visuals) { 748bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_config_destroy_list(psc->visuals); 749bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet psc->visuals = NULL; /* NOTE: just for paranoia */ 750bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet } 751bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet Xfree((char *) psc->serverGLXexts); 752bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet} 753bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet 754cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 755cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Allocate the memory for the per screen configs for each screen. 756cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** If that works then fetch the per screen configs data. 757cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 758acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristófstatic Bool 759c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian HøgsbergAllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv) 760cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 76166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen *psc; 762acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint i, screens; 763cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 764acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 765cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** First allocate memory for the array of per screen configs. 766cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 767acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screens = ScreenCount(dpy); 76866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens = Xmalloc(screens * sizeof *priv->screens); 76966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg if (!priv->screens) 770acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 771acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 7720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf priv->serverGLXversion = 7730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION); 774acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->serverGLXversion == NULL) { 775acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FreeScreenConfigs(priv); 776acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 777acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 778acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 779acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < screens; i++, psc++) { 780b5dedd7c3b4425127d8b85b7e8df0ecda4009fd7Kristian Høgsberg psc = NULL; 78180b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 782acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->dri2Display) 783f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->dri2Display->createScreen) (i, priv); 784f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL && priv->driDisplay) 785f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->driDisplay->createScreen) (i, priv); 786f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL && priv->driswDisplay) 787f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->driswDisplay->createScreen) (i, priv); 788b5dedd7c3b4425127d8b85b7e8df0ecda4009fd7Kristian Høgsberg#endif 7896849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg#if defined(GLX_USE_APPLEGL) 7901885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston if (psc == NULL) 7911885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston psc = applegl_create_screen(i, priv); 7921885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston#else 793f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL) 7946ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg psc = indirect_create_screen(i, priv); 7951885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston#endif 79666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens[i] = psc; 797acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 798acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 799acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_TRUE; 800cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 801cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 802cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 803cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Initialize the client side extension code. 804cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 805c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg _X_HIDDEN struct glx_display * 806acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf__glXInitialize(Display * dpy) 807cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 8081f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg struct glx_display *dpyPriv, *d; 80980b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 810acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Bool glx_direct, glx_accel; 811a36bf890e8be3473f6a98f5ba4369e3acc0463adGeorge Sapountzis#endif 812ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg int i; 813cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 814ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XLockMutex(_Xglobal_lock); 815acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 816ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg for (dpyPriv = glx_displays; dpyPriv; dpyPriv = dpyPriv->next) { 817ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (dpyPriv->dpy == dpy) { 818ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 819ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return dpyPriv; 820ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 821acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 822acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 8231f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg /* Drop the lock while we create the display private. */ 8241f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XUnlockMutex(_Xglobal_lock); 8251f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 826ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv = Xcalloc(1, sizeof *dpyPriv); 827ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!dpyPriv) 828ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 829ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 830ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->codes = XInitExtension(dpy, __glXExtensionName); 831ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!dpyPriv->codes) { 832ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 833ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 834ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 835acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 836acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 837ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->dpy = dpy; 838ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->majorOpcode = dpyPriv->codes->major_opcode; 839ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->serverGLXvendor = 0x0; 840ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->serverGLXversion = 0x0; 841ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 842e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick /* See if the versions are compatible. This GLX implementation does not 843e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick * work with servers that only support GLX 1.0. 844e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick */ 845ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!QueryVersion(dpy, dpyPriv->majorOpcode, 846e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick &dpyPriv->majorVersion, &dpyPriv->minorVersion) 847e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick || (dpyPriv->majorVersion == 1 && dpyPriv->minorVersion < 1)) { 848ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 849ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 850ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 851acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 852acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 853ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg for (i = 0; i < __GLX_NUMBER_EVENTS; i++) { 854ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetWireToEvent(dpy, dpyPriv->codes->first_event + i, __glXWireToEvent); 855ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetEventToWire(dpy, dpyPriv->codes->first_event + i, __glXEventToWire); 856acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 857acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 858ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetCloseDisplay(dpy, dpyPriv->codes->extension, __glXCloseDisplay); 859ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetErrorString (dpy, dpyPriv->codes->extension,__glXErrorString); 860cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 8614df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes dpyPriv->glXDrawHash = __glxHashCreate(); 8624df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 86380b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 864acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf glx_direct = (getenv("LIBGL_ALWAYS_INDIRECT") == NULL); 865acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf glx_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL); 866a36bf890e8be3473f6a98f5ba4369e3acc0463adGeorge Sapountzis 867e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg dpyPriv->drawHash = __glxHashCreate(); 868e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg 869acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 870cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Initialize the direct rendering per display data and functions. 871cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Note: This _must_ be done before calling any other DRI routines 872cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** (e.g., those called in AllocAndFetchScreenConfigs). 873cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 874acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (glx_direct && glx_accel) { 875acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->dri2Display = dri2CreateDisplay(dpy); 876acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->driDisplay = driCreateDisplay(dpy); 877acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 878acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (glx_direct) 879acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->driswDisplay = driswCreateDisplay(dpy); 880cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 881ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 882ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 8836849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!applegl_create_display(dpyPriv)) { 884ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 885ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 886ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 887ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 888ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) { 889ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 890ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 891acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 892cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 893eacd61bfefc416166998b2344540dab1e4e77bebIan Romanick#ifdef USE_XCB 894eacd61bfefc416166998b2344540dab1e4e77bebIan Romanick __glX_send_client_info(dpyPriv); 895eacd61bfefc416166998b2344540dab1e4e77bebIan Romanick#else 896e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick __glXClientInfo(dpy, dpyPriv->majorOpcode); 897eacd61bfefc416166998b2344540dab1e4e77bebIan Romanick#endif 898ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 8991f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg /* Grab the lock again and add the dispay private, unless somebody 9001f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg * beat us to initializing on this display in the meantime. */ 9011f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XLockMutex(_Xglobal_lock); 9021f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 9031f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg for (d = glx_displays; d; d = d->next) { 9041f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (d->dpy == dpy) { 9051f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XUnlockMutex(_Xglobal_lock); 9061f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg glx_display_free(dpyPriv); 9071f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg return d; 9081f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 9091f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 9101f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 911ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->next = glx_displays; 912ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg glx_displays = dpyPriv; 913ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 914ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 915acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 916acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return dpyPriv; 917cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 918cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 919cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 920cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Setup for sending a GLX command on dpy. Make sure the extension is 921cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** initialized. Try to avoid calling __glXInitialize as its kinda slow. 922cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 923acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN CARD8 924acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf__glXSetupForCommand(Display * dpy) 925cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 926c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *gc; 927c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv; 928acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 929acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* If this thread has a current context, flush its rendering commands */ 930acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf gc = __glXGetCurrentContext(); 931acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (gc->currentDpy) { 932acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Flush rendering buffer of the current context, if any */ 933acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (void) __glXFlushRenderBuffer(gc, gc->pc); 934acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 935acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (gc->currentDpy == dpy) { 936acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Use opcode from gc because its right */ 937acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return gc->majorOpcode; 938acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 939acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else { 940acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 941acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** Have to get info about argument dpy because it might be to 942acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** a different server 943acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf */ 944acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 945acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 946acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 947acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Forced to lookup extension via the slow initialize route */ 948acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv = __glXInitialize(dpy); 949acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!priv) { 950acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return 0; 951acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 952acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return priv->majorOpcode; 953cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 954cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 955990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick/** 956990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * Flush the drawing command transport buffer. 9570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 958990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \param ctx Context whose transport buffer is to be flushed. 959990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \param pc Pointer to first unused buffer location. 9600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 961990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \todo 962990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * Modify this function to use \c ctx->pc instead of the explicit 963990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \c pc parameter. 964990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick */ 965acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN GLubyte * 966c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXFlushRenderBuffer(struct glx_context * ctx, GLubyte * pc) 967cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 968acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Display *const dpy = ctx->currentDpy; 9692eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 970acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 9712eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 972acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXRenderReq *req; 9732eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif /* USE_XCB */ 974acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLint size = pc - ctx->buf; 975cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 976acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if ((dpy != NULL) && (size > 0)) { 9772eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 978acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_glx_render(c, ctx->currentContextTag, size, 979acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (const uint8_t *) ctx->buf); 9802eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 981acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Send the entire buffer as an X request */ 982acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 983acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXRender, req); 984acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = ctx->majorOpcode; 985acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXRender; 986acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->contextTag = ctx->currentContextTag; 987acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->length += (size + 3) >> 2; 988acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XSend(dpy, (char *) ctx->buf, size); 989acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 990acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 9912eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif 992acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 993cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 994acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Reset pointer and return it */ 995acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ctx->pc = ctx->buf; 996acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return ctx->pc; 997cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 998cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 999cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1000cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 1001cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a portion of a GLXRenderLarge command to the server. The advantage of 1002cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * this function over \c __glXSendLargeCommand is that callers can use the 1003cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * data buffer in the GLX context and may be able to avoid allocating an 1004cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * extra buffer. The disadvantage is the clients will have to do more 1005cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * GLX protocol work (i.e., calculating \c totalRequests, etc.). 1006cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 1007cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa __glXSendLargeCommand 1008cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 1009cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param gc GLX context 1010cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param requestNumber Which part of the whole command is this? The first 1011cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * request is 1. 1012cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param totalRequests How many requests will there be? 1013cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param data Command data. 1014cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dataLen Size, in bytes, of the command data. 1015cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1016acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 1017c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSendLargeChunk(struct glx_context * gc, GLint requestNumber, 1018acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint totalRequests, const GLvoid * data, GLint dataLen) 1019cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1020acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Display *dpy = gc->currentDpy; 10212eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 1022acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 1023acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_glx_render_large(c, gc->currentContextTag, requestNumber, 1024acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests, dataLen, data); 10252eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 1026acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXRenderLargeReq *req; 1027acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1028acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (requestNumber == 1) { 1029acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 1030acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1031acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1032acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXRenderLarge, req); 1033acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = gc->majorOpcode; 1034acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXRenderLarge; 1035acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->contextTag = gc->currentContextTag; 1036acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->length += (dataLen + 3) >> 2; 1037acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->requestNumber = requestNumber; 1038acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->requestTotal = totalRequests; 1039acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->dataBytes = dataLen; 1040acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Data(dpy, data, dataLen); 1041acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1042acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (requestNumber == totalRequests) { 1043acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 1044acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 1045acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 10462eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif /* USE_XCB */ 1047cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1048cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1049cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1050cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 1051cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a command that is too large for the GLXRender protocol request. 10520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 1053cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a large command, one that is too large for some reason to 1054cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * send using the GLXRender protocol request. One reason to send 1055cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * a large command is to avoid copying the data. 10560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 1057cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param ctx GLX context 1058cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param header Header data. 1059cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param headerLen Size, in bytes, of the header data. It is assumed that 1060cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * the header data will always be small enough to fit in 1061cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * a single X protocol packet. 1062cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param data Command data. 1063cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dataLen Size, in bytes, of the command data. 1064cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1065acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 1066c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSendLargeCommand(struct glx_context * ctx, 1067acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLvoid * header, GLint headerLen, 1068acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLvoid * data, GLint dataLen) 1069cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1070acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint maxSize; 1071acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint totalRequests, requestNumber; 1072cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1073acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1074cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Calculate the maximum amount of data can be stuffed into a single 1075cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** packet. sz_xGLXRenderReq is added because bufSize is the maximum 1076cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** packet size minus sz_xGLXRenderReq. 1077cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1078acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf maxSize = (ctx->bufSize + sz_xGLXRenderReq) - sz_xGLXRenderLargeReq; 1079acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests = 1 + (dataLen / maxSize); 1080acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (dataLen % maxSize) 1081acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests++; 1082cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1083acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1084cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Send all of the command, except the large array, as one request. 1085cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1086acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(headerLen <= maxSize); 1087acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, 1, totalRequests, header, headerLen); 1088cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1089acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1090cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Send enough requests until the whole array is sent. 1091cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1092acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (requestNumber = 2; requestNumber <= (totalRequests - 1); 1093acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf requestNumber++) { 1094acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, requestNumber, totalRequests, data, maxSize); 1095acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf data = (const GLvoid *) (((const GLubyte *) data) + maxSize); 1096acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dataLen -= maxSize; 1097acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(dataLen > 0); 1098acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1099acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1100acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(dataLen <= maxSize); 1101acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, requestNumber, totalRequests, data, dataLen); 1102cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1103cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1104cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/ 1105cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1106cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#ifdef DEBUG 1107acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 1108c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXDumpDrawBuffer(struct glx_context * ctx) 1109cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1110acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLubyte *p = ctx->buf; 1111acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLubyte *end = ctx->pc; 1112acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLushort opcode, length; 1113acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1114acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf while (p < end) { 1115acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Fetch opcode */ 1116acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf opcode = *((GLushort *) p); 1117acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length = *((GLushort *) (p + 2)); 1118acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("%2x: %5d: ", opcode, length); 1119acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length -= 4; 1120acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf p += 4; 1121acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf while (length > 0) { 1122acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("%08x ", *((unsigned *) p)); 1123acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf p += 4; 1124acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length -= 4; 1125acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1126acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("\n"); 1127acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1128cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1129cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 1130