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