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