glxext.c revision b09b3e5c8f4f5d71b986bf359b56e7b60424538d
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; 1367f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes xGLXBufferSwapComplete *awire = (xGLXBufferSwapComplete *)wire; 1377f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->event_type = awire->event_type; 1387f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->drawable = awire->drawable; 1397f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; 1407f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; 1417f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->sbc = ((CARD64)awire->sbc_hi << 32) | awire->sbc_lo; 1427f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return True; 1437f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1447f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes default: 1457f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes /* client doesn't support server event */ 1467f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1477f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1487f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1497f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return False; 1507f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes} 1517f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1527f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes/* We don't actually support this. It doesn't make sense for clients to 1537f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * send each other GLX events. 1547f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes */ 1557f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Status 1567f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes__glXEventToWire(Display *dpy, XEvent *event, xEvent *wire) 1577f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes{ 158c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *glx_dpy = __glXInitialize(dpy); 1597f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 160ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (glx_dpy == NULL) 161ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return False; 1627f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1637f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes switch (event->type) { 1647f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_DAMAGED: 1657f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1667f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_SAVED: 1677f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1687a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg case GLX_EXCHANGE_COMPLETE_INTEL: 1697f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 17042ea25cb4ecae09b5cc011a95d42ba7f0645dde3Ian Romanick case GLX_COPY_COMPLETE_INTEL: 1717f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1727a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg case GLX_FLIP_COMPLETE_INTEL: 1737f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1747f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes default: 1757f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes /* client doesn't support server event */ 1767f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1777f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1787f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1797f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return Success; 1807f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes} 1817f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 182cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/ 183cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 184cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Free the per screen configs data as well as the array of 185cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** __glXScreenConfigs. 186cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 187fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristófstatic void 1881f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian HøgsbergFreeScreenConfigs(struct glx_display * priv) 189cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 19066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen *psc; 191acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint i, screens; 192acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 193acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Free screen configuration information */ 194acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screens = ScreenCount(priv->dpy); 195f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg for (i = 0; i < screens; i++) { 19666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg psc = priv->screens[i]; 197bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_screen_cleanup(psc); 198cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 19980b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 200acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (psc->driScreen) { 201f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->driScreen->destroyScreen(psc); 202f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg } else { 203f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 204acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 205f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg#else 206f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 207cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 208acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 20966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg XFree((char *) priv->screens); 21066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens = NULL; 211cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2131f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergstatic void 2141f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergglx_display_free(struct glx_display *priv) 215cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 2161f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg struct glx_context *gc; 217ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 218ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg gc = __glXGetCurrentContext(); 2191f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (priv->dpy == gc->currentDpy) { 220c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg gc->vtable->destroy(gc); 221ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg __glXSetCurrentContextNull(); 222ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 223acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 224acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FreeScreenConfigs(priv); 225ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (priv->serverGLXvendor) 226acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv->serverGLXvendor); 227ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (priv->serverGLXversion) 228acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv->serverGLXversion); 229cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 230ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 231e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg __glxHashDestroy(priv->drawHash); 232e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg 233acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Free the direct rendering per display data */ 234acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->driswDisplay) 235acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->driswDisplay->destroyDisplay) (priv->driswDisplay); 236acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->driswDisplay = NULL; 237acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 238acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->driDisplay) 239acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->driDisplay->destroyDisplay) (priv->driDisplay); 240acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->driDisplay = NULL; 241acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 242acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->dri2Display) 243acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->dri2Display->destroyDisplay) (priv->dri2Display); 244acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->dri2Display = NULL; 245cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 246cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 247acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv); 2481f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg} 2491f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2501f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergstatic int 2511f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg__glXCloseDisplay(Display * dpy, XExtCodes * codes) 2521f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg{ 2531f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg struct glx_display *priv, **prev; 2541f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2551f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XLockMutex(_Xglobal_lock); 2561f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg prev = &glx_displays; 2571f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg for (priv = glx_displays; priv; prev = &priv->next, priv = priv->next) { 2581f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (priv->dpy == dpy) { 2591f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg (*prev) = priv->next; 2601f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg break; 2611f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 2621f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 2631f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XUnlockMutex(_Xglobal_lock); 2641f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2651f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg glx_display_free(priv); 266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 267ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return 1; 268ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg} 269cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 270cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 271cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Query the version of the GLX extension. This procedure works even if 272cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** the client extension is not completely set up. 273cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 274acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristófstatic Bool 275acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, KristófQueryVersion(Display * dpy, int opcode, int *major, int *minor) 276cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 277fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#ifdef USE_XCB 278fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 2790896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xcb_glx_query_version_reply_t *reply = xcb_glx_query_version_reply(c, 2800896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xcb_glx_query_version 2810896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (c, 2820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLX_MAJOR_VERSION, 2830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLX_MINOR_VERSION), 2840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL); 2850896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2860896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (reply->major_version != GLX_MAJOR_VERSION) { 287fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf free(reply); 288fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf return GL_FALSE; 289fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf } 290fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf *major = reply->major_version; 291fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf *minor = min(reply->minor_version, GLX_MINOR_VERSION); 292fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf free(reply); 293fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf return GL_TRUE; 294fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#else 295acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXQueryVersionReq *req; 296acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXQueryVersionReply reply; 297acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 298acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Send the glXQueryVersion request */ 299acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 300acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXQueryVersion, req); 301acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = opcode; 302acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXQueryVersion; 303acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->majorVersion = GLX_MAJOR_VERSION; 304acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->minorVersion = GLX_MINOR_VERSION; 305acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XReply(dpy, (xReply *) & reply, 0, False); 306acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 307acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 308acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 309acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (reply.majorVersion != GLX_MAJOR_VERSION) { 310acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 311acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** The server does not support the same major release as this 312acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** client. 313acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf */ 314acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 315acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 316acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf *major = reply.majorVersion; 317acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf *minor = min(reply.minorVersion, GLX_MINOR_VERSION); 318acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_TRUE; 319fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#endif /* USE_XCB */ 320cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 321cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 322ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 323ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * We don't want to enable this GLX_OML_swap_method in glxext.h, 324ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * because we can't support it. The X server writes it out though, 325ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * so we should handle it somehow, to avoid false warnings. 326ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 327ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonenum { 328ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston IGNORE_GLX_SWAP_METHOD_OML = 0x8060 329ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}; 330ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 331cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3326ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic GLint 3336ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergconvert_from_x_visual_type(int visualType) 3346ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg{ 3356ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg static const int glx_visual_types[] = { 3366ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_STATIC_GRAY, GLX_GRAY_SCALE, 3376ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 3386ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_TRUE_COLOR, GLX_DIRECT_COLOR 3396ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg }; 3406ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 3416ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg if (visualType < ARRAY_SIZE(glx_visual_types)) 3426ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return glx_visual_types[visualType]; 3436ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 3446ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return GLX_NONE; 3456ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg} 3466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 347ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 348ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * getVisualConfigs uses the !tagged_only path. 349ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * getFBConfigs uses the tagged_only path. 350ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 351acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 3526ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg__glXInitializeVisualConfigFromTags(struct glx_config * config, int count, 353acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const INT32 * bp, Bool tagged_only, 354acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Bool fbconfig_style_tags) 355cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 356acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf int i; 357cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 358acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!tagged_only) { 359acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Copy in the first set of properties */ 360acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualID = *bp++; 361cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3626ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg config->visualType = convert_from_x_visual_type(*bp++); 363cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 364acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbMode = *bp++; 365cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 366acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->redBits = *bp++; 367acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->greenBits = *bp++; 368acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->blueBits = *bp++; 369acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->alphaBits = *bp++; 370acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumRedBits = *bp++; 371acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumGreenBits = *bp++; 372acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumBlueBits = *bp++; 373acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumAlphaBits = *bp++; 374cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 375acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->doubleBufferMode = *bp++; 376acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stereoMode = *bp++; 377cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 378acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbBits = *bp++; 379acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->depthBits = *bp++; 380acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stencilBits = *bp++; 381acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->numAuxBuffers = *bp++; 382acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->level = *bp++; 383cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 384ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 385ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* AppleSGLX supports pixmap and pbuffers with all config. */ 386ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston config->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 387ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Unfortunately this can create an ABI compatibility problem. */ 388ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston count -= 18; 389ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 390acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf count -= __GLX_MIN_CONFIG_PROPS; 391ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 392acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 393cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 394acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 395cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Additional properties may be in a list at the end 396cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** of the reply. They are in pairs of property type 397cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** and property value. 398cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 399cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 400cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define FETCH_OR_SET(tag) \ 401cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson config-> tag = ( fbconfig_style_tags ) ? *bp++ : 1 402cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 403acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < count; i += 2) { 404ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston long int tag = *bp++; 405ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 406ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston switch (tag) { 407acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RGBA: 408acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(rgbMode); 409acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 410acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BUFFER_SIZE: 411acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbBits = *bp++; 412acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 413acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_LEVEL: 414acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->level = *bp++; 415acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 416acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DOUBLEBUFFER: 417acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(doubleBufferMode); 418acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 419acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_STEREO: 420acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(stereoMode); 421acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 422acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_AUX_BUFFERS: 423acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->numAuxBuffers = *bp++; 424acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 425acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RED_SIZE: 426acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->redBits = *bp++; 427acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 428acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_GREEN_SIZE: 429acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->greenBits = *bp++; 430acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 431acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BLUE_SIZE: 432acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->blueBits = *bp++; 433acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 434acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ALPHA_SIZE: 435acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->alphaBits = *bp++; 436acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 437acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DEPTH_SIZE: 438acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->depthBits = *bp++; 439acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 440acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_STENCIL_SIZE: 441acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stencilBits = *bp++; 442acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 443acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_RED_SIZE: 444acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumRedBits = *bp++; 445acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 446acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_GREEN_SIZE: 447acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumGreenBits = *bp++; 448acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 449acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_BLUE_SIZE: 450acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumBlueBits = *bp++; 451acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 452acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_ALPHA_SIZE: 453acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumAlphaBits = *bp++; 454acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 455acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_CAVEAT_EXT: 456acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualRating = *bp++; 457acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 458acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_X_VISUAL_TYPE: 459acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualType = *bp++; 460acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 461acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_TYPE: 462acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentPixel = *bp++; 463acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 464acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_INDEX_VALUE: 465acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentIndex = *bp++; 466acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 467acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_RED_VALUE: 468acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentRed = *bp++; 469acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 470acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_GREEN_VALUE: 471acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentGreen = *bp++; 472acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 473acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_BLUE_VALUE: 474acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentBlue = *bp++; 475acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 476acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_ALPHA_VALUE: 477acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentAlpha = *bp++; 478acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 479acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_ID: 480acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualID = *bp++; 481acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 482acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DRAWABLE_TYPE: 483acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->drawableType = *bp++; 484ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 485ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* AppleSGLX supports pixmap and pbuffers with all config. */ 486ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston config->drawableType |= GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 487ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 488acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 489acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RENDER_TYPE: 490acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->renderType = *bp++; 491acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 492acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_X_RENDERABLE: 493acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->xRenderable = *bp++; 494acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 495acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_FBCONFIG_ID: 496acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->fbconfigID = *bp++; 497acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 498acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_WIDTH: 499acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferWidth = *bp++; 500acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 501acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_HEIGHT: 502acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferHeight = *bp++; 503acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 504acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_PIXELS: 505acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferPixels = *bp++; 506acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 507ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL 508acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX: 509acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->optimalPbufferWidth = *bp++; 510acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 511acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX: 512acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->optimalPbufferHeight = *bp++; 513acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 514acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_SELECT_GROUP_SGIX: 515acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualSelectGroup = *bp++; 516acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 517acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SWAP_METHOD_OML: 518acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->swapMethod = *bp++; 519acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 520ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 521acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SAMPLE_BUFFERS_SGIS: 522acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->sampleBuffers = *bp++; 523acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 524acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SAMPLES_SGIS: 525acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->samples = *bp++; 526acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 527ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 528ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case IGNORE_GLX_SWAP_METHOD_OML: 529ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* We ignore this tag. See the comment above this function. */ 530ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ++bp; 531ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 532ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 533acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_RGB_EXT: 534acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureRgb = *bp++; 535acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 536acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_RGBA_EXT: 537acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureRgba = *bp++; 538acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 539acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_MIPMAP_TEXTURE_EXT: 540acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToMipmapTexture = *bp++; 541acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 542acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_TARGETS_EXT: 543acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureTargets = *bp++; 544acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 545acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_Y_INVERTED_EXT: 546acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->yInverted = *bp++; 547acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 548ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 549b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie case GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT: 550b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie config->framebuffer_srgb_capable = *bp++; 551b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie break; 552b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie 55326a9b7e4c737c89b47844303bb7413ceab0280a5Dave Airlie case GLX_USE_GL: 554fc72452b976e368caf133e108ecaddfea8b2b147Brian Paul if (fbconfig_style_tags) 555fc72452b976e368caf133e108ecaddfea8b2b147Brian Paul bp++; 55626a9b7e4c737c89b47844303bb7413ceab0280a5Dave Airlie break; 557acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case None: 558acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf i = count; 559acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 560acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf default: 561ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if(getenv("LIBGL_DIAGNOSTIC")) { 562ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston long int tagvalue = *bp++; 563ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston fprintf(stderr, "WARNING: unknown GLX tag from server: " 564ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston "tag 0x%lx value 0x%lx\n", tag, tagvalue); 565ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } else { 566ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Ignore the unrecognized tag's value */ 567ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston bp++; 568ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 5692c30a8d8f9aa405d3d30e75371b2d6643ecd8d32Brian Paul break; 570acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 571acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 572acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 573acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->renderType = 574acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT; 575cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 576cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5776ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic struct glx_config * 5788c2b4b33c583401e2efe02db859d5af31872921dRALOVICH, KristófcreateConfigsFromProperties(Display * dpy, int nvisuals, int nprops, 5798c2b4b33c583401e2efe02db859d5af31872921dRALOVICH, Kristóf int screen, GLboolean tagged_only) 5806c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 581acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf INT32 buf[__GLX_TOTAL_CONFIG], *props; 582acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf unsigned prop_size; 5836ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg struct glx_config *modes, *m; 584acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf int i; 585acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 586acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (nprops == 0) 587acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 588acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 589acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* FIXME: Is the __GLX_MIN_CONFIG_PROPS test correct for FBconfigs? */ 590acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 591acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Check number of properties */ 592acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (nprops < __GLX_MIN_CONFIG_PROPS || nprops > __GLX_MAX_CONFIG_PROPS) 593acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 594acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 595acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Allocate memory for our config structure */ 5966ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg modes = glx_config_create_list(nvisuals); 597acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!modes) 598acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 599acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 600acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf prop_size = nprops * __GLX_SIZE_INT32; 601acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (prop_size <= sizeof(buf)) 602acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf props = buf; 603acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else 604acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf props = Xmalloc(prop_size); 605acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 606acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Read each config structure and convert it into our format */ 607acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m = modes; 608acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < nvisuals; i++) { 609acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XRead(dpy, (char *) props, prop_size); 610ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 611ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Older X servers don't send this so we default it here. */ 612acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m->drawableType = GLX_WINDOW_BIT; 613ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 614ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 615ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * The XQuartz 2.3.2.1 X server doesn't set this properly, so 616ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * set the proper bits here. 617ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * AppleSGLX supports windows, pixmaps, and pbuffers with all config. 618ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 619ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston m->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 620ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 621ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXInitializeVisualConfigFromTags(m, nprops, props, 622acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf tagged_only, GL_TRUE); 623acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m->screen = screen; 624acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m = m->next; 625acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 626acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 627acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (props != buf) 628acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree(props); 629acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 630acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return modes; 6316c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 6326c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6336c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsbergstatic GLboolean 63466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian HøgsberggetVisualConfigs(struct glx_screen *psc, 635c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv, int screen) 6366c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 63762688f11355cfa865d420755aa159875b425cc9bRALOVICH, Kristóf xGLXGetVisualConfigsReq *req; 638acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetVisualConfigsReply reply; 639f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Display *dpy = priv->dpy; 640acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 641acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 642acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 643acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->visuals = NULL; 644acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXGetVisualConfigs, req); 645acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = priv->majorOpcode; 646acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXGetVisualConfigs; 647acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->screen = screen; 648acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 649acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!_XReply(dpy, (xReply *) & reply, 0, False)) 650acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 651acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 652acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->visuals = createConfigsFromProperties(dpy, 653acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numVisuals, 654acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numProps, 655acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screen, GL_FALSE); 6566c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6576c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg out: 658acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 659acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return psc->visuals != NULL; 6606c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 6616c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6626c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsbergstatic GLboolean 663c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg getFBConfigs(struct glx_screen *psc, struct glx_display *priv, int screen) 6646c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 665acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsReq *fb_req; 666acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsSGIXReq *sgi_req; 667acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXVendorPrivateWithReplyReq *vpreq; 668acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsReply reply; 669f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Display *dpy = priv->dpy; 670acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 6710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->serverGLXexts = 6720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS); 673acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 674acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 675acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 676acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->configs = NULL; 677acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (atof(priv->serverGLXversion) >= 1.3) { 678acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXGetFBConfigs, fb_req); 679acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->reqType = priv->majorOpcode; 680acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->glxCode = X_GLXGetFBConfigs; 681acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->screen = screen; 682acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 683acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else if (strstr(psc->serverGLXexts, "GLX_SGIX_fbconfig") != NULL) { 684acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReqExtra(GLXVendorPrivateWithReply, 685cbe9fc12a64c3ae89fd1b20e9e165aa4b76293a5Julien Cristau sz_xGLXGetFBConfigsSGIXReq - 686acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sz_xGLXVendorPrivateWithReplyReq, vpreq); 687acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req = (xGLXGetFBConfigsSGIXReq *) vpreq; 688acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->reqType = priv->majorOpcode; 689acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->glxCode = X_GLXVendorPrivateWithReply; 690acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->vendorCode = X_GLXvop_GetFBConfigsSGIX; 691acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->screen = screen; 692acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 693acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else 694acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 695acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 696acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!_XReply(dpy, (xReply *) & reply, 0, False)) 697acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 698acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 699acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->configs = createConfigsFromProperties(dpy, 700acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numFBConfigs, 701acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numAttribs * 2, 702acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screen, GL_TRUE); 7036c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 7046c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg out: 705acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 706acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return psc->configs != NULL; 7076c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 708cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 709f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg_X_HIDDEN Bool 71066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergglx_screen_init(struct glx_screen *psc, 711c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg int screen, struct glx_display * priv) 712f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg{ 713f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg /* Initialize per screen dynamic client GLX extensions */ 714f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->ext_list_first_time = GL_TRUE; 715f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->scr = screen; 716f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->dpy = priv->dpy; 717037755122e9011c768e5caa4d4cb83aba783d3e9Kristian Høgsberg psc->display = priv; 718f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 719f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg getVisualConfigs(psc, priv, screen); 720f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg getFBConfigs(psc, priv, screen); 721f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 722f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return GL_TRUE; 723f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg} 724f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 725bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet_X_HIDDEN void 726bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeetglx_screen_cleanup(struct glx_screen *psc) 727bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet{ 728bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->configs) { 729bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_config_destroy_list(psc->configs); 730bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->effectiveGLXexts) 731bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet Xfree(psc->effectiveGLXexts); 732bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet psc->configs = NULL; /* NOTE: just for paranoia */ 733bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet } 734bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->visuals) { 735bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_config_destroy_list(psc->visuals); 736bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet psc->visuals = NULL; /* NOTE: just for paranoia */ 737bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet } 738bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet Xfree((char *) psc->serverGLXexts); 739bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet} 740bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet 741cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 742cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Allocate the memory for the per screen configs for each screen. 743cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** If that works then fetch the per screen configs data. 744cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 745acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristófstatic Bool 746c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian HøgsbergAllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv) 747cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 74866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen *psc; 749acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint i, screens; 750cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 751acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 752cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** First allocate memory for the array of per screen configs. 753cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 754acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screens = ScreenCount(dpy); 75566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens = Xmalloc(screens * sizeof *priv->screens); 75666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg if (!priv->screens) 757acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 758acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 7590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf priv->serverGLXversion = 7600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION); 761acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->serverGLXversion == NULL) { 762acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FreeScreenConfigs(priv); 763acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 764acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 765acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 766acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < screens; i++, psc++) { 767b5dedd7c3b4425127d8b85b7e8df0ecda4009fd7Kristian Høgsberg psc = NULL; 76880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 769acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->dri2Display) 770f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->dri2Display->createScreen) (i, priv); 771f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL && priv->driDisplay) 772f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->driDisplay->createScreen) (i, priv); 773f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL && priv->driswDisplay) 774f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->driswDisplay->createScreen) (i, priv); 775b5dedd7c3b4425127d8b85b7e8df0ecda4009fd7Kristian Høgsberg#endif 7766849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg#if defined(GLX_USE_APPLEGL) 7776849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (psc == NULL && priv->appleglDisplay) 7786849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg psc = (*priv->appleglDisplay->createScreen) (i, priv); 7796849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg#endif 780f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL) 7816ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg psc = indirect_create_screen(i, priv); 78266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens[i] = psc; 783acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 784acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 785acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_TRUE; 786cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 787cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 788cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 789cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Initialize the client side extension code. 790cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 791c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg _X_HIDDEN struct glx_display * 792acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf__glXInitialize(Display * dpy) 793cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 7941f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg struct glx_display *dpyPriv, *d; 79580b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 796acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Bool glx_direct, glx_accel; 797a36bf890e8be3473f6a98f5ba4369e3acc0463adGeorge Sapountzis#endif 798ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg int i; 799cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 800ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XLockMutex(_Xglobal_lock); 801acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 802ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg for (dpyPriv = glx_displays; dpyPriv; dpyPriv = dpyPriv->next) { 803ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (dpyPriv->dpy == dpy) { 804ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 805ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return dpyPriv; 806ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 807acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 808acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 8091f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg /* Drop the lock while we create the display private. */ 8101f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XUnlockMutex(_Xglobal_lock); 8111f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 812ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv = Xcalloc(1, sizeof *dpyPriv); 813ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!dpyPriv) 814ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 815ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 816ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->codes = XInitExtension(dpy, __glXExtensionName); 817ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!dpyPriv->codes) { 818ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 819ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 820ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 821acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 822acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 823ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->dpy = dpy; 824ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->majorOpcode = dpyPriv->codes->major_opcode; 825ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->serverGLXvendor = 0x0; 826ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->serverGLXversion = 0x0; 827ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 828acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* See if the versions are compatible */ 829ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!QueryVersion(dpy, dpyPriv->majorOpcode, 830ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg &dpyPriv->majorVersion, &dpyPriv->minorVersion)) { 831ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 832ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 833ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 834acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 835acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 836ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg for (i = 0; i < __GLX_NUMBER_EVENTS; i++) { 837ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetWireToEvent(dpy, dpyPriv->codes->first_event + i, __glXWireToEvent); 838ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetEventToWire(dpy, dpyPriv->codes->first_event + i, __glXEventToWire); 839acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 840acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 841ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetCloseDisplay(dpy, dpyPriv->codes->extension, __glXCloseDisplay); 842ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetErrorString (dpy, dpyPriv->codes->extension,__glXErrorString); 843cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 84480b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 845acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf glx_direct = (getenv("LIBGL_ALWAYS_INDIRECT") == NULL); 846acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf glx_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL); 847a36bf890e8be3473f6a98f5ba4369e3acc0463adGeorge Sapountzis 848e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg dpyPriv->drawHash = __glxHashCreate(); 849e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg 850acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 851cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Initialize the direct rendering per display data and functions. 852cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Note: This _must_ be done before calling any other DRI routines 853cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** (e.g., those called in AllocAndFetchScreenConfigs). 854cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 855acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (glx_direct && glx_accel) { 856acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->dri2Display = dri2CreateDisplay(dpy); 857acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->driDisplay = driCreateDisplay(dpy); 858acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 859acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (glx_direct) 860acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->driswDisplay = driswCreateDisplay(dpy); 861cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 862ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 863ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 8646849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!applegl_create_display(dpyPriv)) { 865ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 866ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 867ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 868ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 869ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) { 870ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 871ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 872acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 873cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 874ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (dpyPriv->majorVersion == 1 && dpyPriv->minorVersion >= 1) 875acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXClientInfo(dpy, dpyPriv->majorOpcode); 876ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 8771f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg /* Grab the lock again and add the dispay private, unless somebody 8781f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg * beat us to initializing on this display in the meantime. */ 8791f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XLockMutex(_Xglobal_lock); 8801f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 8811f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg for (d = glx_displays; d; d = d->next) { 8821f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (d->dpy == dpy) { 8831f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XUnlockMutex(_Xglobal_lock); 8841f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg glx_display_free(dpyPriv); 8851f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg return d; 8861f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 8871f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 8881f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 889ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->next = glx_displays; 890ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg glx_displays = dpyPriv; 891ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 892ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 893acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 894acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return dpyPriv; 895cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 896cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 897cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 898cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Setup for sending a GLX command on dpy. Make sure the extension is 899cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** initialized. Try to avoid calling __glXInitialize as its kinda slow. 900cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 901acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN CARD8 902acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf__glXSetupForCommand(Display * dpy) 903cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 904c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *gc; 905c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv; 906acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 907acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* If this thread has a current context, flush its rendering commands */ 908acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf gc = __glXGetCurrentContext(); 909acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (gc->currentDpy) { 910acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Flush rendering buffer of the current context, if any */ 911acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (void) __glXFlushRenderBuffer(gc, gc->pc); 912acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 913acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (gc->currentDpy == dpy) { 914acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Use opcode from gc because its right */ 915acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return gc->majorOpcode; 916acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 917acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else { 918acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 919acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** Have to get info about argument dpy because it might be to 920acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** a different server 921acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf */ 922acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 923acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 924acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 925acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Forced to lookup extension via the slow initialize route */ 926acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv = __glXInitialize(dpy); 927acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!priv) { 928acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return 0; 929acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 930acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return priv->majorOpcode; 931cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 932cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 933990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick/** 934990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * Flush the drawing command transport buffer. 9350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 936990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \param ctx Context whose transport buffer is to be flushed. 937990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \param pc Pointer to first unused buffer location. 9380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 939990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \todo 940990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * Modify this function to use \c ctx->pc instead of the explicit 941990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \c pc parameter. 942990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick */ 943acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN GLubyte * 944c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXFlushRenderBuffer(struct glx_context * ctx, GLubyte * pc) 945cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 946acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Display *const dpy = ctx->currentDpy; 9472eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 948acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 9492eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 950acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXRenderReq *req; 9512eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif /* USE_XCB */ 952acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLint size = pc - ctx->buf; 953cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 954acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if ((dpy != NULL) && (size > 0)) { 9552eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 956acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_glx_render(c, ctx->currentContextTag, size, 957acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (const uint8_t *) ctx->buf); 9582eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 959acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Send the entire buffer as an X request */ 960acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 961acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXRender, req); 962acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = ctx->majorOpcode; 963acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXRender; 964acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->contextTag = ctx->currentContextTag; 965acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->length += (size + 3) >> 2; 966acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XSend(dpy, (char *) ctx->buf, size); 967acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 968acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 9692eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif 970acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 971cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 972acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Reset pointer and return it */ 973acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ctx->pc = ctx->buf; 974acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return ctx->pc; 975cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 976cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 977cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 978cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 979cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a portion of a GLXRenderLarge command to the server. The advantage of 980cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * this function over \c __glXSendLargeCommand is that callers can use the 981cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * data buffer in the GLX context and may be able to avoid allocating an 982cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * extra buffer. The disadvantage is the clients will have to do more 983cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * GLX protocol work (i.e., calculating \c totalRequests, etc.). 984cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 985cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa __glXSendLargeCommand 986cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 987cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param gc GLX context 988cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param requestNumber Which part of the whole command is this? The first 989cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * request is 1. 990cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param totalRequests How many requests will there be? 991cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param data Command data. 992cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dataLen Size, in bytes, of the command data. 993cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 994acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 995c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSendLargeChunk(struct glx_context * gc, GLint requestNumber, 996acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint totalRequests, const GLvoid * data, GLint dataLen) 997cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 998acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Display *dpy = gc->currentDpy; 9992eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 1000acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 1001acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_glx_render_large(c, gc->currentContextTag, requestNumber, 1002acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests, dataLen, data); 10032eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 1004acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXRenderLargeReq *req; 1005acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1006acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (requestNumber == 1) { 1007acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 1008acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1009acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1010acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXRenderLarge, req); 1011acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = gc->majorOpcode; 1012acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXRenderLarge; 1013acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->contextTag = gc->currentContextTag; 1014acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->length += (dataLen + 3) >> 2; 1015acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->requestNumber = requestNumber; 1016acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->requestTotal = totalRequests; 1017acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->dataBytes = dataLen; 1018acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Data(dpy, data, dataLen); 1019acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1020acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (requestNumber == totalRequests) { 1021acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 1022acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 1023acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 10242eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif /* USE_XCB */ 1025cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1026cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1027cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1028cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 1029cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a command that is too large for the GLXRender protocol request. 10300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 1031cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a large command, one that is too large for some reason to 1032cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * send using the GLXRender protocol request. One reason to send 1033cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * a large command is to avoid copying the data. 10340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 1035cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param ctx GLX context 1036cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param header Header data. 1037cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param headerLen Size, in bytes, of the header data. It is assumed that 1038cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * the header data will always be small enough to fit in 1039cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * a single X protocol packet. 1040cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param data Command data. 1041cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dataLen Size, in bytes, of the command data. 1042cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1043acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 1044c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSendLargeCommand(struct glx_context * ctx, 1045acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLvoid * header, GLint headerLen, 1046acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLvoid * data, GLint dataLen) 1047cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1048acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint maxSize; 1049acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint totalRequests, requestNumber; 1050cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1051acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1052cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Calculate the maximum amount of data can be stuffed into a single 1053cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** packet. sz_xGLXRenderReq is added because bufSize is the maximum 1054cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** packet size minus sz_xGLXRenderReq. 1055cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1056acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf maxSize = (ctx->bufSize + sz_xGLXRenderReq) - sz_xGLXRenderLargeReq; 1057acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests = 1 + (dataLen / maxSize); 1058acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (dataLen % maxSize) 1059acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests++; 1060cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1061acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1062cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Send all of the command, except the large array, as one request. 1063cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1064acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(headerLen <= maxSize); 1065acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, 1, totalRequests, header, headerLen); 1066cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1067acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1068cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Send enough requests until the whole array is sent. 1069cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1070acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (requestNumber = 2; requestNumber <= (totalRequests - 1); 1071acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf requestNumber++) { 1072acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, requestNumber, totalRequests, data, maxSize); 1073acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf data = (const GLvoid *) (((const GLubyte *) data) + maxSize); 1074acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dataLen -= maxSize; 1075acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(dataLen > 0); 1076acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1077acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1078acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(dataLen <= maxSize); 1079acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, requestNumber, totalRequests, data, dataLen); 1080cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1081cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1082cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/ 1083cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1084cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#ifdef DEBUG 1085acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 1086c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXDumpDrawBuffer(struct glx_context * ctx) 1087cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1088acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLubyte *p = ctx->buf; 1089acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLubyte *end = ctx->pc; 1090acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLushort opcode, length; 1091acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1092acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf while (p < end) { 1093acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Fetch opcode */ 1094acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf opcode = *((GLushort *) p); 1095acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length = *((GLushort *) (p + 2)); 1096acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("%2x: %5d: ", opcode, length); 1097acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length -= 4; 1098acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf p += 4; 1099acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf while (length > 0) { 1100acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("%08x ", *((unsigned *) p)); 1101acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf p += 4; 1102acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length -= 4; 1103acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1104acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("\n"); 1105acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1106cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1107cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 1108