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", 868d00f077c9672ed2f00a1c67b688c82c3fc7d480Adam Jackson "GLXBadProfileARB", 87cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}; 88cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 89ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 90ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic char *__glXErrorString(Display *dpy, int code, XExtCodes *codes, 91ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston char *buf, int n); 92ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 93ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 94acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristófstatic 95acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, KristófXEXT_GENERATE_ERROR_STRING(__glXErrorString, __glXExtensionName, 96acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __GLX_NUMBER_ERRORS, error_list) 97ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 987f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes/* 997f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * GLX events are a bit funky. We don't stuff the X event code into 1007f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * our user exposed (via XNextEvent) structure. Instead we use the GLX 1017f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * private event code namespace (and hope it doesn't conflict). Clients 1027f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * have to know that bit 15 in the event type field means they're getting 1037f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * a GLX event, and then handle the various sub-event types there, rather 1047f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * than simply checking the event code and handling it directly. 1057f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes */ 1067f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1077f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Bool 1087f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes__glXWireToEvent(Display *dpy, XEvent *event, xEvent *wire) 1097f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes{ 110c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *glx_dpy = __glXInitialize(dpy); 1117f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 112ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (glx_dpy == NULL) 113ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return False; 1147f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 115ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg switch ((wire->u.u.type & 0x7f) - glx_dpy->codes->first_event) { 1167f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_PbufferClobber: 1177f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes { 1187f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes GLXPbufferClobberEvent *aevent = (GLXPbufferClobberEvent *)event; 1197f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes xGLXPbufferClobberEvent *awire = (xGLXPbufferClobberEvent *)wire; 1207f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->event_type = awire->type; 1217f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->serial = awire->sequenceNumber; 1227f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->event_type = awire->event_type; 1237f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->draw_type = awire->draw_type; 1247f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->drawable = awire->drawable; 1257f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->buffer_mask = awire->buffer_mask; 1267f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->aux_buffer = awire->aux_buffer; 1277f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->x = awire->x; 1287f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->y = awire->y; 1297f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->width = awire->width; 1307f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->height = awire->height; 1317f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->count = awire->count; 1327f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return True; 1337f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1347f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_BufferSwapComplete: 1357f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes { 1367f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event; 1371e39fc784bc3d0d5ad01d9c147529ac0e10f1262Jesse Barnes xGLXBufferSwapComplete2 *awire = (xGLXBufferSwapComplete2 *)wire; 1384df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes struct glx_drawable *glxDraw = GetGLXDrawable(dpy, awire->drawable); 1397f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->event_type = awire->event_type; 1407f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->drawable = awire->drawable; 1417f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; 1427f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; 1434df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 1444df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes if (!glxDraw) 1454df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes return False; 1464df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 1474df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes if (awire->sbc < glxDraw->lastEventSbc) 1484df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes glxDraw->eventSbcWrap += 0x100000000; 1494df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes glxDraw->lastEventSbc = awire->sbc; 1504df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes aevent->sbc = awire->sbc + glxDraw->eventSbcWrap; 1517f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return True; 1527f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1537f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes default: 1547f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes /* client doesn't support server event */ 1557f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1567f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1577f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1587f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return False; 1597f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes} 1607f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1617f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes/* We don't actually support this. It doesn't make sense for clients to 1627f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes * send each other GLX events. 1637f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes */ 1647f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnesstatic Status 1657f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes__glXEventToWire(Display *dpy, XEvent *event, xEvent *wire) 1667f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes{ 167c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *glx_dpy = __glXInitialize(dpy); 1687f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 169ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (glx_dpy == NULL) 170ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return False; 1717f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1727f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes switch (event->type) { 1737f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_DAMAGED: 1747f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1757f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes case GLX_SAVED: 1767f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1777a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg case GLX_EXCHANGE_COMPLETE_INTEL: 1787f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 17942ea25cb4ecae09b5cc011a95d42ba7f0645dde3Ian Romanick case GLX_COPY_COMPLETE_INTEL: 1807f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1817a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg case GLX_FLIP_COMPLETE_INTEL: 1827f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1837f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes default: 1847f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes /* client doesn't support server event */ 1857f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes break; 1867f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes } 1877f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 1887f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes return Success; 1897f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes} 1907f170573ea486f2f2dd474c2590346f1a0110773Jesse Barnes 191cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/ 192cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 193cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Free the per screen configs data as well as the array of 194cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** __glXScreenConfigs. 195cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 196fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristófstatic void 1971f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian HøgsbergFreeScreenConfigs(struct glx_display * priv) 198cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 19966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen *psc; 200acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint i, screens; 201acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 202acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Free screen configuration information */ 203acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screens = ScreenCount(priv->dpy); 204f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg for (i = 0; i < screens; i++) { 20566fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg psc = priv->screens[i]; 206bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_screen_cleanup(psc); 207cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 20880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 209acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (psc->driScreen) { 210f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->driScreen->destroyScreen(psc); 211f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg } else { 212f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 213acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 214f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg#else 215f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Xfree(psc); 216cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 217acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 21866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg XFree((char *) priv->screens); 21966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens = NULL; 220cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 221cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2221f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergstatic void 2231f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergglx_display_free(struct glx_display *priv) 224cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 2251f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg struct glx_context *gc; 226ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 227ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg gc = __glXGetCurrentContext(); 2281f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (priv->dpy == gc->currentDpy) { 229c796bb0cc3fde409545bff320540ddf5c029e513Kristian Høgsberg gc->vtable->destroy(gc); 230ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg __glXSetCurrentContextNull(); 231ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 232acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 233acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FreeScreenConfigs(priv); 234ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (priv->serverGLXvendor) 235acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv->serverGLXvendor); 236ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (priv->serverGLXversion) 237acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv->serverGLXversion); 238cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2394df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes __glxHashDestroy(priv->glXDrawHash); 2404df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 241ae9487c29984addc96a6d617292370fbc3f8ff9aJon TURNEY#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 242e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg __glxHashDestroy(priv->drawHash); 243e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg 244acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Free the direct rendering per display data */ 245acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->driswDisplay) 246acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->driswDisplay->destroyDisplay) (priv->driswDisplay); 247acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->driswDisplay = NULL; 248acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 249acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->driDisplay) 250acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->driDisplay->destroyDisplay) (priv->driDisplay); 251acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->driDisplay = NULL; 252acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 253acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->dri2Display) 254acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (*priv->dri2Display->destroyDisplay) (priv->dri2Display); 255acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv->dri2Display = NULL; 256cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 257cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 258acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree((char *) priv); 2591f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg} 2601f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2611f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsbergstatic int 2621f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg__glXCloseDisplay(Display * dpy, XExtCodes * codes) 2631f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg{ 2640f20e2e18f902b4319851643e1775a18c2aacb3dHenri Verbeet struct glx_display *priv, **prev; 2651f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2661f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XLockMutex(_Xglobal_lock); 2671f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg prev = &glx_displays; 2681f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg for (priv = glx_displays; priv; prev = &priv->next, priv = priv->next) { 2691f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (priv->dpy == dpy) { 2700f20e2e18f902b4319851643e1775a18c2aacb3dHenri Verbeet *prev = priv->next; 2711f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg break; 2721f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 2731f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 2740f20e2e18f902b4319851643e1775a18c2aacb3dHenri Verbeet _XUnlockMutex(_Xglobal_lock); 2751f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 2761f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg glx_display_free(priv); 277cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 278ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return 1; 279ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg} 280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 281cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Query the version of the GLX extension. This procedure works even if 283cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** the client extension is not completely set up. 284cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 285acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristófstatic Bool 286acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, KristófQueryVersion(Display * dpy, int opcode, int *major, int *minor) 287cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 288fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#ifdef USE_XCB 289fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 2900896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xcb_glx_query_version_reply_t *reply = xcb_glx_query_version_reply(c, 2910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf xcb_glx_query_version 2920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf (c, 2930896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLX_MAJOR_VERSION, 2940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf GLX_MINOR_VERSION), 2950896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf NULL); 2960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2970256edd709d976198d5354fdd88143d8da9e51d5Stéphane Marchesin if (!reply) 2980256edd709d976198d5354fdd88143d8da9e51d5Stéphane Marchesin return GL_FALSE; 2990256edd709d976198d5354fdd88143d8da9e51d5Stéphane Marchesin 3000896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (reply->major_version != GLX_MAJOR_VERSION) { 301fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf free(reply); 302fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf return GL_FALSE; 303fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf } 304fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf *major = reply->major_version; 305fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf *minor = min(reply->minor_version, GLX_MINOR_VERSION); 306fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf free(reply); 307fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf return GL_TRUE; 308fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#else 309acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXQueryVersionReq *req; 310acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXQueryVersionReply reply; 311acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 312acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Send the glXQueryVersion request */ 313acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 314acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXQueryVersion, req); 315acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = opcode; 316acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXQueryVersion; 317acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->majorVersion = GLX_MAJOR_VERSION; 318acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->minorVersion = GLX_MINOR_VERSION; 319acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XReply(dpy, (xReply *) & reply, 0, False); 320acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 321acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 322acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 323acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (reply.majorVersion != GLX_MAJOR_VERSION) { 324acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 325acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** The server does not support the same major release as this 326acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** client. 327acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf */ 328acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 329acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 330acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf *major = reply.majorVersion; 331acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf *minor = min(reply.minorVersion, GLX_MINOR_VERSION); 332acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_TRUE; 333fd52001c5c292d3b625c164a6c3c357e1da443e0RALOVICH, Kristóf#endif /* USE_XCB */ 334cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 335cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 336ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 337ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * We don't want to enable this GLX_OML_swap_method in glxext.h, 338ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * because we can't support it. The X server writes it out though, 339ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * so we should handle it somehow, to avoid false warnings. 340ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 341ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonenum { 342ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston IGNORE_GLX_SWAP_METHOD_OML = 0x8060 343ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}; 344ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 345cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3466ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic GLint 3476ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergconvert_from_x_visual_type(int visualType) 3486ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg{ 3496ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg static const int glx_visual_types[] = { 3506ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_STATIC_GRAY, GLX_GRAY_SCALE, 3516ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 3526ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg GLX_TRUE_COLOR, GLX_DIRECT_COLOR 3536ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg }; 3546ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 3556ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg if (visualType < ARRAY_SIZE(glx_visual_types)) 3566ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return glx_visual_types[visualType]; 3576ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 3586ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg return GLX_NONE; 3596ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg} 3606ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg 361ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 362ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * getVisualConfigs uses the !tagged_only path. 363ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * getFBConfigs uses the tagged_only path. 364ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 365acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 3666ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg__glXInitializeVisualConfigFromTags(struct glx_config * config, int count, 367acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const INT32 * bp, Bool tagged_only, 368acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Bool fbconfig_style_tags) 369cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 370acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf int i; 371cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 372acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!tagged_only) { 373acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Copy in the first set of properties */ 374acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualID = *bp++; 375cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3766ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg config->visualType = convert_from_x_visual_type(*bp++); 377cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 378acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbMode = *bp++; 379cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 380acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->redBits = *bp++; 381acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->greenBits = *bp++; 382acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->blueBits = *bp++; 383acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->alphaBits = *bp++; 384acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumRedBits = *bp++; 385acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumGreenBits = *bp++; 386acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumBlueBits = *bp++; 387acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumAlphaBits = *bp++; 388cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 389acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->doubleBufferMode = *bp++; 390acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stereoMode = *bp++; 391cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 392acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbBits = *bp++; 393acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->depthBits = *bp++; 394acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stencilBits = *bp++; 395acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->numAuxBuffers = *bp++; 396acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->level = *bp++; 397cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 398ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 399ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* AppleSGLX supports pixmap and pbuffers with all config. */ 400ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston config->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 401ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Unfortunately this can create an ABI compatibility problem. */ 402ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston count -= 18; 403ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 404acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf count -= __GLX_MIN_CONFIG_PROPS; 405ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 406acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 407cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 4084b507f809c66a1b4245e63778943aeeed71f575cIan Romanick config->sRGBCapable = GL_FALSE; 4094b507f809c66a1b4245e63778943aeeed71f575cIan Romanick 410acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 411cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Additional properties may be in a list at the end 412cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** of the reply. They are in pairs of property type 413cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** and property value. 414cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 415cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 416cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define FETCH_OR_SET(tag) \ 417cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson config-> tag = ( fbconfig_style_tags ) ? *bp++ : 1 418cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 419acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < count; i += 2) { 420ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston long int tag = *bp++; 421ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 422ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston switch (tag) { 423acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RGBA: 424acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(rgbMode); 425acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 426acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BUFFER_SIZE: 427acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->rgbBits = *bp++; 428acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 429acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_LEVEL: 430acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->level = *bp++; 431acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 432acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DOUBLEBUFFER: 433acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(doubleBufferMode); 434acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 435acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_STEREO: 436acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FETCH_OR_SET(stereoMode); 437acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 438acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_AUX_BUFFERS: 439acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->numAuxBuffers = *bp++; 440acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 441acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RED_SIZE: 442acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->redBits = *bp++; 443acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 444acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_GREEN_SIZE: 445acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->greenBits = *bp++; 446acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 447acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BLUE_SIZE: 448acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->blueBits = *bp++; 449acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 450acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ALPHA_SIZE: 451acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->alphaBits = *bp++; 452acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 453acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DEPTH_SIZE: 454acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->depthBits = *bp++; 455acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 456acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_STENCIL_SIZE: 457acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->stencilBits = *bp++; 458acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 459acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_RED_SIZE: 460acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumRedBits = *bp++; 461acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 462acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_GREEN_SIZE: 463acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumGreenBits = *bp++; 464acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 465acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_BLUE_SIZE: 466acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumBlueBits = *bp++; 467acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 468acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_ACCUM_ALPHA_SIZE: 469acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->accumAlphaBits = *bp++; 470acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 471acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_CAVEAT_EXT: 472acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualRating = *bp++; 473acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 474acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_X_VISUAL_TYPE: 475acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualType = *bp++; 476acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 477acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_TYPE: 478acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentPixel = *bp++; 479acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 480acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_INDEX_VALUE: 481acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentIndex = *bp++; 482acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 483acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_RED_VALUE: 484acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentRed = *bp++; 485acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 486acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_GREEN_VALUE: 487acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentGreen = *bp++; 488acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 489acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_BLUE_VALUE: 490acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentBlue = *bp++; 491acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 492acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_TRANSPARENT_ALPHA_VALUE: 493acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->transparentAlpha = *bp++; 494acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 495acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_ID: 496acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualID = *bp++; 497acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 498acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_DRAWABLE_TYPE: 499acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->drawableType = *bp++; 500ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 501ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* AppleSGLX supports pixmap and pbuffers with all config. */ 502ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston config->drawableType |= GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 503ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 504acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 505acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_RENDER_TYPE: 506acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->renderType = *bp++; 507acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 508acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_X_RENDERABLE: 509acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->xRenderable = *bp++; 510acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 511acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_FBCONFIG_ID: 512acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->fbconfigID = *bp++; 513acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 514acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_WIDTH: 515acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferWidth = *bp++; 516acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 517acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_HEIGHT: 518acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferHeight = *bp++; 519acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 520acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_MAX_PBUFFER_PIXELS: 521acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->maxPbufferPixels = *bp++; 522acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 523ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL 524acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX: 525acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->optimalPbufferWidth = *bp++; 526acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 527acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX: 528acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->optimalPbufferHeight = *bp++; 529acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 530acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_VISUAL_SELECT_GROUP_SGIX: 531acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->visualSelectGroup = *bp++; 532acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 533acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SWAP_METHOD_OML: 534acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->swapMethod = *bp++; 535acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 536ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 537acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SAMPLE_BUFFERS_SGIS: 538acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->sampleBuffers = *bp++; 539acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 540acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_SAMPLES_SGIS: 541acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->samples = *bp++; 542acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 543ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 544ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case IGNORE_GLX_SWAP_METHOD_OML: 545ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* We ignore this tag. See the comment above this function. */ 546ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston ++bp; 547ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston break; 548ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 549acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_RGB_EXT: 550acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureRgb = *bp++; 551acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 552acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_RGBA_EXT: 553acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureRgba = *bp++; 554acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 555acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_MIPMAP_TEXTURE_EXT: 556acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToMipmapTexture = *bp++; 557acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 558acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_BIND_TO_TEXTURE_TARGETS_EXT: 559acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->bindToTextureTargets = *bp++; 560acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 561acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case GLX_Y_INVERTED_EXT: 562acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->yInverted = *bp++; 563acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 564ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 565b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie case GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT: 5666538b5824e298eaebede2d9686c7607c44ab446aDave Airlie config->sRGBCapable = *bp++; 567b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie break; 568b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie 56926a9b7e4c737c89b47844303bb7413ceab0280a5Dave Airlie case GLX_USE_GL: 570fc72452b976e368caf133e108ecaddfea8b2b147Brian Paul if (fbconfig_style_tags) 571fc72452b976e368caf133e108ecaddfea8b2b147Brian Paul bp++; 57226a9b7e4c737c89b47844303bb7413ceab0280a5Dave Airlie break; 573acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf case None: 574acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf i = count; 575acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf break; 576acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf default: 577ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if(getenv("LIBGL_DIAGNOSTIC")) { 578ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston long int tagvalue = *bp++; 579ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston fprintf(stderr, "WARNING: unknown GLX tag from server: " 580ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston "tag 0x%lx value 0x%lx\n", tag, tagvalue); 581ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } else { 582ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Ignore the unrecognized tag's value */ 583ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston bp++; 584ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 5852c30a8d8f9aa405d3d30e75371b2d6643ecd8d32Brian Paul break; 586acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 587acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 588acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 589acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf config->renderType = 590acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (config->rgbMode) ? GLX_RGBA_BIT : GLX_COLOR_INDEX_BIT; 591cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 592cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 5936ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergstatic struct glx_config * 5948c2b4b33c583401e2efe02db859d5af31872921dRALOVICH, KristófcreateConfigsFromProperties(Display * dpy, int nvisuals, int nprops, 5958c2b4b33c583401e2efe02db859d5af31872921dRALOVICH, Kristóf int screen, GLboolean tagged_only) 5966c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 597acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf INT32 buf[__GLX_TOTAL_CONFIG], *props; 598acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf unsigned prop_size; 5996ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg struct glx_config *modes, *m; 600acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf int i; 601acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 602acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (nprops == 0) 603acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 604acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 605acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* FIXME: Is the __GLX_MIN_CONFIG_PROPS test correct for FBconfigs? */ 606acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 607acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Check number of properties */ 608acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (nprops < __GLX_MIN_CONFIG_PROPS || nprops > __GLX_MAX_CONFIG_PROPS) 609acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 610acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 611acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Allocate memory for our config structure */ 6126ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg modes = glx_config_create_list(nvisuals); 613acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!modes) 614acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return NULL; 615acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 616acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf prop_size = nprops * __GLX_SIZE_INT32; 617acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (prop_size <= sizeof(buf)) 618acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf props = buf; 619acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else 620acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf props = Xmalloc(prop_size); 621acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 622acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Read each config structure and convert it into our format */ 623acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m = modes; 624acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < nvisuals; i++) { 625acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XRead(dpy, (char *) props, prop_size); 626ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 627ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* Older X servers don't send this so we default it here. */ 628acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m->drawableType = GLX_WINDOW_BIT; 629ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 630ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 631ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * The XQuartz 2.3.2.1 X server doesn't set this properly, so 632ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * set the proper bits here. 633ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * AppleSGLX supports windows, pixmaps, and pbuffers with all config. 634ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 635ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston m->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 636ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 637ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston __glXInitializeVisualConfigFromTags(m, nprops, props, 638acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf tagged_only, GL_TRUE); 639acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m->screen = screen; 640acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf m = m->next; 641acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 642acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 643acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (props != buf) 644acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Xfree(props); 645acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 646acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return modes; 6476c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 6486c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6496c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsbergstatic GLboolean 65066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian HøgsberggetVisualConfigs(struct glx_screen *psc, 651c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv, int screen) 6526c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 65362688f11355cfa865d420755aa159875b425cc9bRALOVICH, Kristóf xGLXGetVisualConfigsReq *req; 654acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetVisualConfigsReply reply; 655f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Display *dpy = priv->dpy; 656acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 657acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 658acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 659acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->visuals = NULL; 660acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXGetVisualConfigs, req); 661acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = priv->majorOpcode; 662acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXGetVisualConfigs; 663acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->screen = screen; 664acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 665acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!_XReply(dpy, (xReply *) & reply, 0, False)) 666acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 667acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 668acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->visuals = createConfigsFromProperties(dpy, 669acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numVisuals, 670acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numProps, 671acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screen, GL_FALSE); 6726c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6736c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg out: 674acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 675acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return psc->visuals != NULL; 6766c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 6776c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 6786c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsbergstatic GLboolean 679c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg getFBConfigs(struct glx_screen *psc, struct glx_display *priv, int screen) 6806c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg{ 681acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsReq *fb_req; 682acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsSGIXReq *sgi_req; 683acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXVendorPrivateWithReplyReq *vpreq; 684acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXGetFBConfigsReply reply; 685f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg Display *dpy = priv->dpy; 686acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 6870896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf psc->serverGLXexts = 6880896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS); 689acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 690acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 691acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 692acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->configs = NULL; 693acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (atof(priv->serverGLXversion) >= 1.3) { 694acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXGetFBConfigs, fb_req); 695acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->reqType = priv->majorOpcode; 696acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->glxCode = X_GLXGetFBConfigs; 697acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf fb_req->screen = screen; 698acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 699acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else if (strstr(psc->serverGLXexts, "GLX_SGIX_fbconfig") != NULL) { 700acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReqExtra(GLXVendorPrivateWithReply, 701cbe9fc12a64c3ae89fd1b20e9e165aa4b76293a5Julien Cristau sz_xGLXGetFBConfigsSGIXReq - 702acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sz_xGLXVendorPrivateWithReplyReq, vpreq); 703acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req = (xGLXGetFBConfigsSGIXReq *) vpreq; 704acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->reqType = priv->majorOpcode; 705acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->glxCode = X_GLXVendorPrivateWithReply; 706acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->vendorCode = X_GLXvop_GetFBConfigsSGIX; 707acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf sgi_req->screen = screen; 708acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 709acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else 710acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 711acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 712acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!_XReply(dpy, (xReply *) & reply, 0, False)) 713acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf goto out; 714acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 715acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf psc->configs = createConfigsFromProperties(dpy, 716acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numFBConfigs, 717acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf reply.numAttribs * 2, 718acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screen, GL_TRUE); 7196c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg 7206c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg out: 721acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 722acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return psc->configs != NULL; 7236c533ea2d1953152f7d95d6c984e0d287edb46c2Kristian Høgsberg} 724cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 725f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg_X_HIDDEN Bool 72666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsbergglx_screen_init(struct glx_screen *psc, 727c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg int screen, struct glx_display * priv) 728f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg{ 729f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg /* Initialize per screen dynamic client GLX extensions */ 730f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->ext_list_first_time = GL_TRUE; 731f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->scr = screen; 732f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc->dpy = priv->dpy; 733037755122e9011c768e5caa4d4cb83aba783d3e9Kristian Høgsberg psc->display = priv; 734f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 735f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg getVisualConfigs(psc, priv, screen); 736f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg getFBConfigs(psc, priv, screen); 737f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 738f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg return GL_TRUE; 739f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg} 740f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg 741bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet_X_HIDDEN void 742bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeetglx_screen_cleanup(struct glx_screen *psc) 743bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet{ 744bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->configs) { 745bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_config_destroy_list(psc->configs); 746bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->effectiveGLXexts) 747bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet Xfree(psc->effectiveGLXexts); 748bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet psc->configs = NULL; /* NOTE: just for paranoia */ 749bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet } 750bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet if (psc->visuals) { 751bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet glx_config_destroy_list(psc->visuals); 752bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet psc->visuals = NULL; /* NOTE: just for paranoia */ 753bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet } 754bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet Xfree((char *) psc->serverGLXexts); 755bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet} 756bfc889517ad0d490cce1817eecac146d66bcd923Henri Verbeet 757cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 758cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Allocate the memory for the per screen configs for each screen. 759cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** If that works then fetch the per screen configs data. 760cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 761acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristófstatic Bool 762c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian HøgsbergAllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv) 763cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 76466fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg struct glx_screen *psc; 765acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint i, screens; 766cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 767acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 768cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** First allocate memory for the array of per screen configs. 769cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 770acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf screens = ScreenCount(dpy); 77166fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens = Xmalloc(screens * sizeof *priv->screens); 77266fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg if (!priv->screens) 773acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 774acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 7750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf priv->serverGLXversion = 7760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf __glXQueryServerString(dpy, priv->majorOpcode, 0, GLX_VERSION); 777acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->serverGLXversion == NULL) { 778acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf FreeScreenConfigs(priv); 779acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_FALSE; 780acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 781acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 782acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (i = 0; i < screens; i++, psc++) { 783b5dedd7c3b4425127d8b85b7e8df0ecda4009fd7Kristian Høgsberg psc = NULL; 78480b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 785acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (priv->dri2Display) 786f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->dri2Display->createScreen) (i, priv); 787f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL && priv->driDisplay) 788f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->driDisplay->createScreen) (i, priv); 789f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL && priv->driswDisplay) 790f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg psc = (*priv->driswDisplay->createScreen) (i, priv); 791b5dedd7c3b4425127d8b85b7e8df0ecda4009fd7Kristian Høgsberg#endif 7926849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg#if defined(GLX_USE_APPLEGL) 7931885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston if (psc == NULL) 7941885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston psc = applegl_create_screen(i, priv); 7951885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston#else 796f972115d33e391499e049b83a1559959f2ca9f72Kristian Høgsberg if (psc == NULL) 7976ec39db726beead21d97bf64ddbe1f0b2d2d6ca1Kristian Høgsberg psc = indirect_create_screen(i, priv); 7981885cf27c9c4642a049c60a8236cb84735cb9ebaJeremy Huddleston#endif 79966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg priv->screens[i] = psc; 800acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 801acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 802acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return GL_TRUE; 803cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 804cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 805cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 806cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Initialize the client side extension code. 807cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 808c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg _X_HIDDEN struct glx_display * 809acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf__glXInitialize(Display * dpy) 810cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 8111f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg struct glx_display *dpyPriv, *d; 81280b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 813acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Bool glx_direct, glx_accel; 814a36bf890e8be3473f6a98f5ba4369e3acc0463adGeorge Sapountzis#endif 815ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg int i; 816cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 817ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XLockMutex(_Xglobal_lock); 818acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 819ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg for (dpyPriv = glx_displays; dpyPriv; dpyPriv = dpyPriv->next) { 820ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (dpyPriv->dpy == dpy) { 821ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 822ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return dpyPriv; 823ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 824acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 825acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 8261f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg /* Drop the lock while we create the display private. */ 8271f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XUnlockMutex(_Xglobal_lock); 8281f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 829ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv = Xcalloc(1, sizeof *dpyPriv); 830ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!dpyPriv) 831ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 832ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 833ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->codes = XInitExtension(dpy, __glXExtensionName); 834ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!dpyPriv->codes) { 835ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 836ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 837ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 838acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 839acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 840ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->dpy = dpy; 841ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->majorOpcode = dpyPriv->codes->major_opcode; 842ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->serverGLXvendor = 0x0; 843ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->serverGLXversion = 0x0; 844ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 845e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick /* See if the versions are compatible. This GLX implementation does not 846e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick * work with servers that only support GLX 1.0. 847e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick */ 848ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!QueryVersion(dpy, dpyPriv->majorOpcode, 849e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick &dpyPriv->majorVersion, &dpyPriv->minorVersion) 850e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick || (dpyPriv->majorVersion == 1 && dpyPriv->minorVersion < 1)) { 851ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 852ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 853ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 854acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 855acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 856ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg for (i = 0; i < __GLX_NUMBER_EVENTS; i++) { 857ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetWireToEvent(dpy, dpyPriv->codes->first_event + i, __glXWireToEvent); 858ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetEventToWire(dpy, dpyPriv->codes->first_event + i, __glXEventToWire); 859acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 860acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 861ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetCloseDisplay(dpy, dpyPriv->codes->extension, __glXCloseDisplay); 862ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg XESetErrorString (dpy, dpyPriv->codes->extension,__glXErrorString); 863cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 8644df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes dpyPriv->glXDrawHash = __glxHashCreate(); 8654df137691ee29bb812347fa2c5f19095243ede22Jesse Barnes 86680b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) 867acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf glx_direct = (getenv("LIBGL_ALWAYS_INDIRECT") == NULL); 868acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf glx_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL); 869a36bf890e8be3473f6a98f5ba4369e3acc0463adGeorge Sapountzis 870e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg dpyPriv->drawHash = __glxHashCreate(); 871e3e8196c025bd344a59b4671e473c395a6ea426bKristian Høgsberg 872acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 873cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Initialize the direct rendering per display data and functions. 874cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Note: This _must_ be done before calling any other DRI routines 875cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** (e.g., those called in AllocAndFetchScreenConfigs). 876cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 877acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (glx_direct && glx_accel) { 878acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->dri2Display = dri2CreateDisplay(dpy); 879acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->driDisplay = driCreateDisplay(dpy); 880acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 881acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (glx_direct) 882acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dpyPriv->driswDisplay = driswCreateDisplay(dpy); 883cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 884ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 885ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifdef GLX_USE_APPLEGL 8866849916170c0275c13510251a7b217c20f2b993eKristian Høgsberg if (!applegl_create_display(dpyPriv)) { 887ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 888ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 889ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg } 890ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 891ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) { 892ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg Xfree(dpyPriv); 893ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg return NULL; 894acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 895cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 896eacd61bfefc416166998b2344540dab1e4e77bebIan Romanick#ifdef USE_XCB 897eacd61bfefc416166998b2344540dab1e4e77bebIan Romanick __glX_send_client_info(dpyPriv); 898eacd61bfefc416166998b2344540dab1e4e77bebIan Romanick#else 899e4be406f09fcb3756cd0e8dd0539f62bafb1bccaIan Romanick __glXClientInfo(dpy, dpyPriv->majorOpcode); 900eacd61bfefc416166998b2344540dab1e4e77bebIan Romanick#endif 901ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 9021f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg /* Grab the lock again and add the dispay private, unless somebody 9031f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg * beat us to initializing on this display in the meantime. */ 9041f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XLockMutex(_Xglobal_lock); 9051f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 9061f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg for (d = glx_displays; d; d = d->next) { 9071f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg if (d->dpy == dpy) { 9081f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg _XUnlockMutex(_Xglobal_lock); 9091f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg glx_display_free(dpyPriv); 9101f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg return d; 9111f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 9121f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg } 9131f1928db001527c3dcf1d78d6a5d2ef8f519327bKristian Høgsberg 914ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg dpyPriv->next = glx_displays; 915ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg glx_displays = dpyPriv; 916ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg 917ab434f6b7641a64d30725a9ac24929240362d466Kristian Høgsberg _XUnlockMutex(_Xglobal_lock); 918acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 919acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return dpyPriv; 920cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 921cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 922cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 923cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** Setup for sending a GLX command on dpy. Make sure the extension is 924cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson** initialized. Try to avoid calling __glXInitialize as its kinda slow. 925cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson*/ 926acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN CARD8 927acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf__glXSetupForCommand(Display * dpy) 928cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 929c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_context *gc; 930c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg struct glx_display *priv; 931acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 932acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* If this thread has a current context, flush its rendering commands */ 933acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf gc = __glXGetCurrentContext(); 934acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (gc->currentDpy) { 935acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Flush rendering buffer of the current context, if any */ 936acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (void) __glXFlushRenderBuffer(gc, gc->pc); 937acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 938acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (gc->currentDpy == dpy) { 939acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Use opcode from gc because its right */ 940acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return gc->majorOpcode; 941acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 942acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf else { 943acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 944acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** Have to get info about argument dpy because it might be to 945acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ** a different server 946acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf */ 947acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 948acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 949acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 950acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Forced to lookup extension via the slow initialize route */ 951acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf priv = __glXInitialize(dpy); 952acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (!priv) { 953acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return 0; 954acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 955acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return priv->majorOpcode; 956cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 957cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 958990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick/** 959990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * Flush the drawing command transport buffer. 9600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 961990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \param ctx Context whose transport buffer is to be flushed. 962990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \param pc Pointer to first unused buffer location. 9630896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 964990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \todo 965990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * Modify this function to use \c ctx->pc instead of the explicit 966990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick * \c pc parameter. 967990dec7ea0ad9eca8340d39fd022baa151c05a03Ian Romanick */ 968acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN GLubyte * 969c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXFlushRenderBuffer(struct glx_context * ctx, GLubyte * pc) 970cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 971acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Display *const dpy = ctx->currentDpy; 9722eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 973acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 9742eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 975acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXRenderReq *req; 9762eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif /* USE_XCB */ 977acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLint size = pc - ctx->buf; 978cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 979acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if ((dpy != NULL) && (size > 0)) { 9802eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 981acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_glx_render(c, ctx->currentContextTag, size, 982acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf (const uint8_t *) ctx->buf); 9832eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 984acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Send the entire buffer as an X request */ 985acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 986acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXRender, req); 987acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = ctx->majorOpcode; 988acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXRender; 989acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->contextTag = ctx->currentContextTag; 990acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->length += (size + 3) >> 2; 991acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf _XSend(dpy, (char *) ctx->buf, size); 992acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 993acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 9942eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif 995acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 996cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 997acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Reset pointer and return it */ 998acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf ctx->pc = ctx->buf; 999acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf return ctx->pc; 1000cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1001cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1002cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1003cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 1004cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a portion of a GLXRenderLarge command to the server. The advantage of 1005cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * this function over \c __glXSendLargeCommand is that callers can use the 1006cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * data buffer in the GLX context and may be able to avoid allocating an 1007cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * extra buffer. The disadvantage is the clients will have to do more 1008cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * GLX protocol work (i.e., calculating \c totalRequests, etc.). 1009cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 1010cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \sa __glXSendLargeCommand 1011cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * 1012cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param gc GLX context 1013cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param requestNumber Which part of the whole command is this? The first 1014cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * request is 1. 1015cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param totalRequests How many requests will there be? 1016cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param data Command data. 1017cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dataLen Size, in bytes, of the command data. 1018cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1019acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 1020c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSendLargeChunk(struct glx_context * gc, GLint requestNumber, 1021acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint totalRequests, const GLvoid * data, GLint dataLen) 1022cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1023acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Display *dpy = gc->currentDpy; 10242eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#ifdef USE_XCB 1025acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_connection_t *c = XGetXCBConnection(dpy); 1026acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xcb_glx_render_large(c, gc->currentContextTag, requestNumber, 1027acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests, dataLen, data); 10282eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#else 1029acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf xGLXRenderLargeReq *req; 1030acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1031acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (requestNumber == 1) { 1032acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf LockDisplay(dpy); 1033acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1034acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1035acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GetReq(GLXRenderLarge, req); 1036acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->reqType = gc->majorOpcode; 1037acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->glxCode = X_GLXRenderLarge; 1038acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->contextTag = gc->currentContextTag; 1039acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->length += (dataLen + 3) >> 2; 1040acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->requestNumber = requestNumber; 1041acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->requestTotal = totalRequests; 1042acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf req->dataBytes = dataLen; 1043acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf Data(dpy, data, dataLen); 1044acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1045acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (requestNumber == totalRequests) { 1046acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf UnlockDisplay(dpy); 1047acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf SyncHandle(); 1048acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 10492eb147e7f5754a97cb1a5617db7d529754cfe002Brian Paul#endif /* USE_XCB */ 1050cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1051cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1052cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1053cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/** 1054cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a command that is too large for the GLXRender protocol request. 10550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 1056cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Send a large command, one that is too large for some reason to 1057cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * send using the GLXRender protocol request. One reason to send 1058cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * a large command is to avoid copying the data. 10590896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf * 1060cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param ctx GLX context 1061cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param header Header data. 1062cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param headerLen Size, in bytes, of the header data. It is assumed that 1063cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * the header data will always be small enough to fit in 1064cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * a single X protocol packet. 1065cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param data Command data. 1066cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * \param dataLen Size, in bytes, of the command data. 1067cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1068acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 1069c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXSendLargeCommand(struct glx_context * ctx, 1070acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLvoid * header, GLint headerLen, 1071acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf const GLvoid * data, GLint dataLen) 1072cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1073acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint maxSize; 1074acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLint totalRequests, requestNumber; 1075cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1076acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1077cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Calculate the maximum amount of data can be stuffed into a single 1078cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** packet. sz_xGLXRenderReq is added because bufSize is the maximum 1079cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** packet size minus sz_xGLXRenderReq. 1080cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1081acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf maxSize = (ctx->bufSize + sz_xGLXRenderReq) - sz_xGLXRenderLargeReq; 1082acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests = 1 + (dataLen / maxSize); 1083acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf if (dataLen % maxSize) 1084acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf totalRequests++; 1085cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1086acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1087cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Send all of the command, except the large array, as one request. 1088cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1089acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(headerLen <= maxSize); 1090acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, 1, totalRequests, header, headerLen); 1091cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1092acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* 1093cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ** Send enough requests until the whole array is sent. 1094cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 1095acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf for (requestNumber = 2; requestNumber <= (totalRequests - 1); 1096acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf requestNumber++) { 1097acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, requestNumber, totalRequests, data, maxSize); 1098acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf data = (const GLvoid *) (((const GLubyte *) data) + maxSize); 1099acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf dataLen -= maxSize; 1100acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(dataLen > 0); 1101acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1102acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1103acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf assert(dataLen <= maxSize); 1104acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf __glXSendLargeChunk(ctx, requestNumber, totalRequests, data, dataLen); 1105cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1106cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1107cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/************************************************************************/ 1108cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1109cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#ifdef DEBUG 1110acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf_X_HIDDEN void 1111c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg__glXDumpDrawBuffer(struct glx_context * ctx) 1112cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1113acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLubyte *p = ctx->buf; 1114acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLubyte *end = ctx->pc; 1115acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf GLushort opcode, length; 1116acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf 1117acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf while (p < end) { 1118acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf /* Fetch opcode */ 1119acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf opcode = *((GLushort *) p); 1120acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length = *((GLushort *) (p + 2)); 1121acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("%2x: %5d: ", opcode, length); 1122acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length -= 4; 1123acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf p += 4; 1124acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf while (length > 0) { 1125acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("%08x ", *((unsigned *) p)); 1126acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf p += 4; 1127acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf length -= 4; 1128acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1129acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf printf("\n"); 1130acb7e52430db423431e0d852597e5096de44c1c5RALOVICH, Kristóf } 1131cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 1132cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#endif 1133