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