1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.5
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009  VMware, Inc.   All Rights Reserved.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is an emulation of the GLX API which allows Mesa/GLX-based programs
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to run on X servers which do not have the real GLX extension.
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Thanks to the contributors:
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initial version:  Philip Brown (phil@bolthole.com)
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Better glXGetConfig() support: Armin Liebchen (liebchen@asylum.cs.utah.edu)
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Further visual-handling refinements: Wolfram Gloger
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    (wmglo@Dent.MED.Uni-Muenchen.DE).
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Notes:
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Don't be fooled, stereo isn't supported yet.
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxheader.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxapi.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/config.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h"
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/version.h"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xfonts.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xmesaP.h"
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __VMS
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define sprintf sprintf
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This indicates the client-side GLX API and GLX encoder version. */
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CLIENT_MAJOR_VERSION 1
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CLIENT_MINOR_VERSION 4  /* but don't have 1.3's pbuffers, etc yet */
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This indicates the server-side GLX decoder version.
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX 1.4 indicates OpenGL 1.3 support
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SERVER_MAJOR_VERSION 1
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SERVER_MINOR_VERSION 4
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This is appended onto the glXGetClient/ServerString version strings. */
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MESA_GLX_VERSION "Mesa " MESA_VERSION_STRING
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Who implemented this GLX? */
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VENDOR "Brian Paul"
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXTENSIONS \
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_MESA_set_3dfx_mode " \
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_MESA_copy_sub_buffer " \
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_MESA_pixmap_colormap " \
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_MESA_release_buffers " \
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_ARB_get_proc_address " \
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_EXT_texture_from_pixmap " \
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_EXT_visual_info " \
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_EXT_visual_rating " \
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*"GLX_SGI_video_sync "*/ \
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_SGIX_fbconfig " \
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "GLX_SGIX_pbuffer "
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Our fake GLX context will contain a "real" GLX context and an XMesa context.
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that a pointer to a __GLXcontext is a pointer to a fake_glx_context,
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and vice versa.
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We really just need this structure in order to make the libGL functions
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glXGetCurrentContext(), glXGetCurrentDrawable() and glXGetCurrentDisplay()
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * work correctly.
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct fake_glx_context {
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __GLXcontext glxContext;   /* this MUST be first! */
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaContext xmesaContext;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***                       GLX Visual Code                          ***/
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DONT_CARE -1
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaVisual *VisualTable = NULL;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int NumVisuals = 0;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This struct and some code fragments borrowed
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from Mark Kilgard's GLUT library.
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef struct _OverlayInfo {
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /* Avoid 64-bit portability problems by being careful to use
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     longs due to the way XGetWindowProperty is specified. Note
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     that these parameters are passed as CARD32s over X
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     protocol. */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  unsigned long overlay_visual;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  long transparent_type;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  long value;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  long layer;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} OverlayInfo;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Macro to handle c_class vs class field name in XVisualInfo struct */
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(__cplusplus) || defined(c_plusplus)
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CLASS c_class
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CLASS class
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if the given XVisualInfo is usable for Mesa rendering.
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgis_usable_visual( XVisualInfo *vinfo )
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (vinfo->CLASS) {
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case StaticGray:
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GrayScale:
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* Any StaticGray/GrayScale visual works in RGB or CI mode */
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_TRUE;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case StaticColor:
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PseudoColor:
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Color-index rendering is not supported. */
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_FALSE;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TrueColor:
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case DirectColor:
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Any depth of TrueColor or DirectColor works in RGB mode */
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_TRUE;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* This should never happen */
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_FALSE;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get an array OverlayInfo records for specified screen.
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dpy  the display
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param screen  screen number
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param numOverlays  returns numver of OverlayInfo records
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return  pointer to OverlayInfo array, free with XFree()
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic OverlayInfo *
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGetOverlayInfo(Display *dpy, int screen, int *numOverlays)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Atom overlayVisualsAtom;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Atom actualType;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Status status;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned char *ovInfo;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned long sizeData, bytesLeft;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int actualFormat;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * The SERVER_OVERLAY_VISUALS property on the root window contains
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * a list of overlay visuals.  Get that list now.
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (overlayVisualsAtom == None) {
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   status = XGetWindowProperty(dpy, RootWindow(dpy, screen),
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               overlayVisualsAtom, 0L, (long) 10000, False,
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               overlayVisualsAtom, &actualType, &actualFormat,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               &sizeData, &bytesLeft,
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               &ovInfo);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (status != Success || actualType != overlayVisualsAtom ||
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       actualFormat != 32 || sizeData < 4) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* something went wrong */
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XFree((void *) ovInfo);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *numOverlays = 0;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *numOverlays = sizeData / 4;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (OverlayInfo *) ovInfo;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the level (overlay, normal, underlay) of a given XVisualInfo.
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input:  dpy - the X display
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         vinfo - the XVisualInfo to test
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return:  level of the visual:
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *             0 = normal planes
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *            >0 = overlay planes
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *            <0 = underlay planes
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglevel_of_visual( Display *dpy, XVisualInfo *vinfo )
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   OverlayInfo *overlay_info;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numOverlaysPerScreen, i;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   overlay_info = GetOverlayInfo(dpy, vinfo->screen, &numOverlaysPerScreen);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!overlay_info) {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* search the overlay visual list for the visual ID of interest */
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < numOverlaysPerScreen; i++) {
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const OverlayInfo *ov = overlay_info + i;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ov->overlay_visual == vinfo->visualid) {
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* found the visual */
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (/*ov->transparent_type==1 &&*/ ov->layer!=0) {
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            int level = ov->layer;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            XFree((void *) overlay_info);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return level;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            XFree((void *) overlay_info);
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return 0;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The visual ID was not found in the overlay list. */
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XFree((void *) overlay_info);
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given an XVisualInfo and RGB, Double, and Depth buffer flags, save the
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * configuration in our list of GLX visuals.
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaVisual
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsave_glx_visual( Display *dpy, XVisualInfo *vinfo,
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 GLboolean alphaFlag, GLboolean dbFlag,
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 GLboolean stereoFlag,
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 GLint depth_size, GLint stencil_size,
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 GLint accumRedSize, GLint accumGreenSize,
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 GLint accumBlueSize, GLint accumAlphaSize,
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 GLint level, GLint numAuxBuffers )
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean ximageFlag = GL_TRUE;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean comparePointers;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dbFlag) {
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Check if the MESA_BACK_BUFFER env var is set */
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      char *backbuffer = _mesa_getenv("MESA_BACK_BUFFER");
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (backbuffer) {
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (backbuffer[0]=='p' || backbuffer[0]=='P') {
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ximageFlag = GL_FALSE;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (backbuffer[0]=='x' || backbuffer[0]=='X') {
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ximageFlag = GL_TRUE;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_warning(NULL, "Mesa: invalid value for MESA_BACK_BUFFER environment variable, using an XImage.");
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stereoFlag) {
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* stereo not supported */
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Comparing IDs uses less memory but sometimes fails. */
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX revisit this after 3.0 is finished. */
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_getenv("MESA_GLX_VISUAL_HACK"))
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      comparePointers = GL_TRUE;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      comparePointers = GL_FALSE;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Force the visual to have an alpha channel */
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_getenv("MESA_GLX_FORCE_ALPHA"))
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      alphaFlag = GL_TRUE;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* First check if a matching visual is already in the list */
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i=0; i<NumVisuals; i++) {
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaVisual v = VisualTable[i];
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (v->display == dpy
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && v->mesa_visual.level == level
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && v->mesa_visual.numAuxBuffers == numAuxBuffers
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && v->ximage_flag == ximageFlag
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && v->mesa_visual.doubleBufferMode == dbFlag
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && v->mesa_visual.stereoMode == stereoFlag
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && (v->mesa_visual.alphaBits > 0) == alphaFlag
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && (v->mesa_visual.depthBits >= depth_size || depth_size == 0)
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && (v->mesa_visual.stencilBits >= stencil_size || stencil_size == 0)
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && (v->mesa_visual.accumRedBits >= accumRedSize || accumRedSize == 0)
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && (v->mesa_visual.accumGreenBits >= accumGreenSize || accumGreenSize == 0)
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && (v->mesa_visual.accumBlueBits >= accumBlueSize || accumBlueSize == 0)
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && (v->mesa_visual.accumAlphaBits >= accumAlphaSize || accumAlphaSize == 0)) {
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* now either compare XVisualInfo pointers or visual IDs */
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if ((!comparePointers && v->visinfo->visualid == vinfo->visualid)
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             || (comparePointers && v->vishandle == vinfo)) {
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return v;
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Create a new visual and add it to the list. */
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmvis = XMesaCreateVisual( dpy, vinfo, GL_TRUE, alphaFlag, dbFlag,
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              stereoFlag, ximageFlag,
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              depth_size, stencil_size,
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              accumRedSize, accumBlueSize,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              accumBlueSize, accumAlphaSize, 0, level,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLX_NONE_EXT );
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmvis) {
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Save a copy of the pointer now so we can find this visual again
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * if we need to search for it in find_glx_visual().
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmvis->vishandle = vinfo;
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Allocate more space for additional visual */
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VisualTable = (XMesaVisual *) _mesa_realloc( VisualTable,
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   sizeof(XMesaVisual) * NumVisuals,
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   sizeof(XMesaVisual) * (NumVisuals + 1));
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* add xmvis to the list */
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VisualTable[NumVisuals] = xmvis;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      NumVisuals++;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* XXX minor hack, because XMesaCreateVisual doesn't support an
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * aux buffers parameter.
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmvis->mesa_visual.numAuxBuffers = numAuxBuffers;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return xmvis;
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the default number of bits for the Z buffer.
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If defined, use the MESA_GLX_DEPTH_BITS env var value.
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Otherwise, use the DEFAULT_SOFTWARE_DEPTH_BITS constant.
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX probably do the same thing for stencil, accum, etc.
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdefault_depth_bits(void)
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int zBits;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *zEnv = _mesa_getenv("MESA_GLX_DEPTH_BITS");
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (zEnv)
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zBits = atoi(zEnv);
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zBits = DEFAULT_SOFTWARE_DEPTH_BITS;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return zBits;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdefault_alpha_bits(void)
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int aBits;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *aEnv = _mesa_getenv("MESA_GLX_ALPHA_BITS");
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (aEnv)
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aBits = atoi(aEnv);
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      aBits = 0;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return aBits;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdefault_accum_bits(void)
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 16;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a GLX visual from a regular XVisualInfo.
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is called when Fake GLX is given an XVisualInfo which wasn't
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * returned by glXChooseVisual.  Since this is the first time we're
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * considering this visual we'll take a guess at reasonable values
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for depth buffer size, stencil size, accum size, etc.
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the best we can do with a client-side emulation of GLX.
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaVisual
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_glx_visual( Display *dpy, XVisualInfo *visinfo )
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int vislevel;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint zBits = default_depth_bits();
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint accBits = default_accum_bits();
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean alphaFlag = default_alpha_bits() > 0;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vislevel = level_of_visual( dpy, visinfo );
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vislevel) {
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Color-index rendering to overlays is not supported. */
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (is_usable_visual( visinfo )) {
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Configure this visual as RGB, double-buffered, depth-buffered. */
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This is surely wrong for some people's needs but what else */
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* can be done?  They should use glXChooseVisual(). */
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return save_glx_visual( dpy, visinfo,
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      alphaFlag, /* alpha */
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GL_TRUE,   /* double */
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GL_FALSE,  /* stereo */
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      zBits,
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      8,       /* stencil bits */
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      accBits, /* r */
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      accBits, /* g */
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      accBits, /* b */
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      accBits, /* a */
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      0,         /* level */
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      0          /* numAux */
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      );
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_warning(NULL, "Mesa: error in glXCreateContext: bad visual\n");
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Find the GLX visual associated with an XVisualInfo.
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaVisual
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfind_glx_visual( Display *dpy, XVisualInfo *vinfo )
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* try to match visual id */
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i=0;i<NumVisuals;i++) {
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (VisualTable[i]->display==dpy
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && VisualTable[i]->visinfo->visualid == vinfo->visualid) {
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return VisualTable[i];
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* if that fails, try to match pointers */
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i=0;i<NumVisuals;i++) {
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (VisualTable[i]->display==dpy && VisualTable[i]->vishandle==vinfo) {
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return VisualTable[i];
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the transparent pixel value for a GLX visual.
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input:  glxvis - the glx_visual
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return:  a pixel value or -1 if no transparent pixel
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtransparent_pixel( XMesaVisual glxvis )
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Display *dpy = glxvis->display;
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XVisualInfo *vinfo = glxvis->visinfo;
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   OverlayInfo *overlay_info;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numOverlaysPerScreen, i;
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   overlay_info = GetOverlayInfo(dpy, vinfo->screen, &numOverlaysPerScreen);
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!overlay_info) {
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return -1;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < numOverlaysPerScreen; i++) {
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const OverlayInfo *ov = overlay_info + i;
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ov->overlay_visual == vinfo->visualid) {
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* found it! */
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ov->transparent_type == 0) {
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* type 0 indicates no transparency */
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            XFree((void *) overlay_info);
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return -1;
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* ov->value is the transparent pixel */
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            XFree((void *) overlay_info);
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return ov->value;
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* The visual ID was not found in the overlay list. */
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XFree((void *) overlay_info);
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return -1;
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try to get an X visual which matches the given arguments.
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XVisualInfo *
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_visual( Display *dpy, int scr, unsigned int depth, int xclass )
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XVisualInfo temp, *vis;
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   long mask;
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int n;
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int default_depth;
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int default_class;
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mask = VisualScreenMask | VisualDepthMask | VisualClassMask;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   temp.screen = scr;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   temp.depth = depth;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   temp.CLASS = xclass;
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default_depth = DefaultDepth(dpy,scr);
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default_class = DefaultVisual(dpy,scr)->CLASS;
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (depth==default_depth && xclass==default_class) {
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* try to get root window's visual */
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      temp.visualid = DefaultVisual(dpy,scr)->visualid;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mask |= VisualIDMask;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vis = XGetVisualInfo( dpy, mask, &temp, &n );
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* In case bits/pixel > 24, make sure color channels are still <=8 bits.
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * An SGI Infinite Reality system, for example, can have 30bpp pixels:
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * 10 bits per color channel.  Mesa's limited to a max of 8 bits/channel.
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vis && depth > 24 && (xclass==TrueColor || xclass==DirectColor)) {
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (_mesa_bitcount((GLuint) vis->red_mask  ) <= 8 &&
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          _mesa_bitcount((GLuint) vis->green_mask) <= 8 &&
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          _mesa_bitcount((GLuint) vis->blue_mask ) <= 8) {
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return vis;
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         XFree((void *) vis);
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return vis;
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Retrieve the value of the given environment variable and find
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the X visual which matches it.
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input:  dpy - the display
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         screen - the screen number
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         varname - the name of the environment variable
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return:  an XVisualInfo pointer to NULL if error.
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XVisualInfo *
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_env_visual(Display *dpy, int scr, const char *varname)
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char value[100], type[100];
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int depth, xclass = -1;
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XVisualInfo *vis;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_mesa_getenv( varname )) {
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   strncpy( value, _mesa_getenv(varname), 100 );
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   value[99] = 0;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sscanf( value, "%s %d", type, &depth );
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (strcmp(type,"TrueColor")==0)          xclass = TrueColor;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (strcmp(type,"DirectColor")==0)   xclass = DirectColor;
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (strcmp(type,"GrayScale")==0)     xclass = GrayScale;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (strcmp(type,"StaticGray")==0)    xclass = StaticGray;
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xclass>-1 && depth>0) {
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vis = get_visual( dpy, scr, depth, xclass );
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (vis) {
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return vis;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_warning(NULL, "GLX unable to find visual class=%s, depth=%d.",
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 type, depth);
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Select an X visual which satisfies the RGBA/CI flag and minimum depth.
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input:  dpy, screen - X display and screen number
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         min_depth - minimum visual depth
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         preferred_class - preferred GLX visual class or DONT_CARE
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return:  pointer to an XVisualInfo or NULL.
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XVisualInfo *
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchoose_x_visual(Display *dpy, int screen, int min_depth, int preferred_class)
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XVisualInfo *vis;
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int xclass, visclass = 0;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int depth;
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* First see if the MESA_RGB_VISUAL env var is defined */
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vis = get_env_visual( dpy, screen, "MESA_RGB_VISUAL" );
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vis) {
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return vis;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Otherwise, search for a suitable visual */
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (preferred_class==DONT_CARE) {
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (xclass=0;xclass<4;xclass++) {
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 switch (xclass) {
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case 0:  visclass = TrueColor;    break;
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case 1:  visclass = DirectColor;  break;
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case 2:  visclass = GrayScale;    break;
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case 3:  visclass = StaticGray;   break;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (min_depth==0) {
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* start with shallowest */
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for (depth=0;depth<=32;depth++) {
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vis = get_visual( dpy, screen, depth, visclass );
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       if (vis) {
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  return vis;
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       }
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* start with deepest */
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for (depth=32;depth>=min_depth;depth--) {
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vis = get_visual( dpy, screen, depth, visclass );
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       if (vis) {
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  return vis;
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       }
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* search for a specific visual class */
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (preferred_class) {
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRUE_COLOR_EXT:    visclass = TrueColor;    break;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_DIRECT_COLOR_EXT:  visclass = DirectColor;  break;
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_GRAY_SCALE_EXT:    visclass = GrayScale;    break;
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_STATIC_GRAY_EXT:   visclass = StaticGray;   break;
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_PSEUDO_COLOR_EXT:
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_STATIC_COLOR_EXT:
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:   return NULL;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (min_depth==0) {
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* start with shallowest */
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (depth=0;depth<=32;depth++) {
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    vis = get_visual( dpy, screen, depth, visclass );
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (vis) {
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       return vis;
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* start with deepest */
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (depth=32;depth>=min_depth;depth--) {
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    vis = get_visual( dpy, screen, depth, visclass );
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (vis) {
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       return vis;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* didn't find a visual */
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Find the deepest X over/underlay visual of at least min_depth.
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input:  dpy, screen - X display and screen number
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         level - the over/underlay level
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         trans_type - transparent pixel type: GLX_NONE_EXT,
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                      GLX_TRANSPARENT_RGB_EXT, GLX_TRANSPARENT_INDEX_EXT,
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                      or DONT_CARE
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         trans_value - transparent pixel value or DONT_CARE
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         min_depth - minimum visual depth
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *         preferred_class - preferred GLX visual class or DONT_CARE
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return:  pointer to an XVisualInfo or NULL.
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XVisualInfo *
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchoose_x_overlay_visual( Display *dpy, int scr,
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         int level, int trans_type, int trans_value,
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         int min_depth, int preferred_class )
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   OverlayInfo *overlay_info;
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numOverlaysPerScreen;
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XVisualInfo *deepvis;
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int deepest;
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*DEBUG int tt, tv; */
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (preferred_class) {
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRUE_COLOR_EXT:    preferred_class = TrueColor;    break;
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_DIRECT_COLOR_EXT:  preferred_class = DirectColor;  break;
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_PSEUDO_COLOR_EXT:  preferred_class = PseudoColor;  break;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_STATIC_COLOR_EXT:  preferred_class = StaticColor;  break;
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_GRAY_SCALE_EXT:    preferred_class = GrayScale;    break;
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_STATIC_GRAY_EXT:   preferred_class = StaticGray;   break;
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:                    preferred_class = DONT_CARE;
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   overlay_info = GetOverlayInfo(dpy, scr, &numOverlaysPerScreen);
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!overlay_info) {
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Search for the deepest overlay which satisifies all criteria. */
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   deepest = min_depth;
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   deepvis = NULL;
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < numOverlaysPerScreen; i++) {
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const OverlayInfo *ov = overlay_info + i;
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XVisualInfo *vislist, vistemplate;
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int count;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ov->layer!=level) {
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* failed overlay level criteria */
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!(trans_type==DONT_CARE
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            || (trans_type==GLX_TRANSPARENT_INDEX_EXT
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                && ov->transparent_type>0)
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            || (trans_type==GLX_NONE_EXT && ov->transparent_type==0))) {
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* failed transparent pixel type criteria */
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (trans_value!=DONT_CARE && trans_value!=ov->value) {
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* failed transparent pixel value criteria */
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* get XVisualInfo and check the depth */
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vistemplate.visualid = ov->overlay_visual;
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vistemplate.screen = scr;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vislist = XGetVisualInfo( dpy, VisualIDMask | VisualScreenMask,
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                &vistemplate, &count );
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (count!=1) {
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* something went wrong */
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (preferred_class!=DONT_CARE && preferred_class!=vislist->CLASS) {
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* wrong visual class */
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Color-index rendering is not supported.  Make sure we have True/DirectColor */
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (vislist->CLASS != TrueColor && vislist->CLASS != DirectColor)
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (deepvis==NULL || vislist->depth > deepest) {
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* YES!  found a satisfactory visual */
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (deepvis) {
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            XFree( deepvis );
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         deepest = vislist->depth;
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         deepvis = vislist;
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* DEBUG  tt = ov->transparent_type;*/
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* DEBUG  tv = ov->value; */
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*DEBUG
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (deepvis) {
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("chose 0x%x:  layer=%d depth=%d trans_type=%d trans_value=%d\n",
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             deepvis->visualid, level, deepvis->depth, tt, tv );
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return deepvis;
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***             Display-related functions                          ***/
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free all XMesaVisuals which are associated with the given display.
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdestroy_visuals_on_display(Display *dpy)
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < NumVisuals; i++) {
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (VisualTable[i]->display == dpy) {
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* remove this visual */
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int j;
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         free(VisualTable[i]);
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (j = i; j < NumVisuals - 1; j++)
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            VisualTable[j] = VisualTable[j + 1];
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         NumVisuals--;
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called from XCloseDisplay() to let us free our display-related data.
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclose_display_callback(Display *dpy, XExtCodes *codes)
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   destroy_visuals_on_display(dpy);
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmesa_destroy_buffers_on_display(dpy);
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Look for the named extension on given display and return a pointer
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the _XExtension data, or NULL if extension not found.
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _XExtension *
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglookup_extension(Display *dpy, const char *extName)
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _XExtension *ext;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (ext = dpy->ext_procs; ext; ext = ext->next) {
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ext->name && strcmp(ext->name, extName) == 0) {
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return ext;
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whenever we're given a new Display pointer, call this function to
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * register our close_display_callback function.
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgregister_with_display(Display *dpy)
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *extName = "MesaGLX";
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _XExtension *ext;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ext = lookup_extension(dpy, extName);
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ext) {
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XExtCodes *c = XAddExtension(dpy);
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ext = dpy->ext_procs;  /* new extension is at head of list */
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(c->extension == ext->codes.extension);
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (void) c; /* silence warning */
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ext->name = _mesa_strdup(extName);
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ext->close_display = close_display_callback;
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***                  Begin Fake GLX API Functions                  ***/
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper used by glXChooseVisual and glXChooseFBConfig.
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The fbConfig parameter must be GL_FALSE for the former and GL_TRUE for
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the later.
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In either case, the attribute list is terminated with the value 'None'.
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaVisual
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchoose_visual( Display *dpy, int screen, const int *list, GLboolean fbConfig )
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean rgbModeDefault = fbConfig;
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int *parselist;
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XVisualInfo *vis;
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int min_ci = 0;
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int min_red=0, min_green=0, min_blue=0;
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean rgb_flag = rgbModeDefault;
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean alpha_flag = GL_FALSE;
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean double_flag = GL_FALSE;
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean stereo_flag = GL_FALSE;
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint depth_size = 0;
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint stencil_size = 0;
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint accumRedSize = 0;
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint accumGreenSize = 0;
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint accumBlueSize = 0;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint accumAlphaSize = 0;
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int level = 0;
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int visual_type = DONT_CARE;
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int trans_type = DONT_CARE;
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int trans_value = DONT_CARE;
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint caveat = DONT_CARE;
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis = NULL;
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int desiredVisualID = -1;
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int numAux = 0;
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   parselist = list;
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (*parselist) {
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (fbConfig &&
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          parselist[1] == GLX_DONT_CARE &&
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          parselist[0] != GLX_LEVEL) {
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* For glXChooseFBConfig(), skip attributes whose value is
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * GLX_DONT_CARE (-1), unless it's GLX_LEVEL (which can legitimately be
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * a negative value).
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * From page 17 (23 of the pdf) of the GLX 1.4 spec:
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * GLX DONT CARE may be specified for all attributes except GLX LEVEL.
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         parselist += 2;
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (*parselist) {
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_USE_GL:
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (fbConfig) {
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               /* invalid token */
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL;
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               /* skip */
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               parselist++;
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_BUFFER_SIZE:
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    min_ci = *parselist++;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_LEVEL:
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            level = *parselist++;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_RGBA:
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (fbConfig) {
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               /* invalid token */
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL;
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               rgb_flag = GL_TRUE;
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               parselist++;
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_DOUBLEBUFFER:
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (fbConfig) {
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               double_flag = *parselist++;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               double_flag = GL_TRUE;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_STEREO:
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (fbConfig) {
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               stereo_flag = *parselist++;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               stereo_flag = GL_TRUE;
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_AUX_BUFFERS:
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            numAux = *parselist++;
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (numAux > MAX_AUX_BUFFERS)
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL;
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_RED_SIZE:
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    min_red = *parselist++;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_GREEN_SIZE:
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    min_green = *parselist++;
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_BLUE_SIZE:
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    min_blue = *parselist++;
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_ALPHA_SIZE:
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            {
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLint size = *parselist++;
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               alpha_flag = size ? GL_TRUE : GL_FALSE;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_DEPTH_SIZE:
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    depth_size = *parselist++;
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_STENCIL_SIZE:
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    stencil_size = *parselist++;
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_ACCUM_RED_SIZE:
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            {
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLint size = *parselist++;
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               accumRedSize = MAX2( accumRedSize, size );
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_ACCUM_GREEN_SIZE:
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            {
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLint size = *parselist++;
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               accumGreenSize = MAX2( accumGreenSize, size );
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_ACCUM_BLUE_SIZE:
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            {
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLint size = *parselist++;
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               accumBlueSize = MAX2( accumBlueSize, size );
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case GLX_ACCUM_ALPHA_SIZE:
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            {
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               GLint size = *parselist++;
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               accumAlphaSize = MAX2( accumAlphaSize, size );
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /*
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * GLX_EXT_visual_info extension
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_X_VISUAL_TYPE_EXT:
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            visual_type = *parselist++;
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TRANSPARENT_TYPE_EXT:
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            trans_type = *parselist++;
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TRANSPARENT_INDEX_VALUE_EXT:
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            trans_value = *parselist++;
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TRANSPARENT_RED_VALUE_EXT:
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TRANSPARENT_GREEN_VALUE_EXT:
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TRANSPARENT_BLUE_VALUE_EXT:
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TRANSPARENT_ALPHA_VALUE_EXT:
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* ignore */
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /*
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * GLX_EXT_visual_info extension
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_VISUAL_CAVEAT_EXT:
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            caveat = *parselist++; /* ignored for now */
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /*
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * GLX_ARB_multisample
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_SAMPLE_BUFFERS_ARB:
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_SAMPLES_ARB:
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    parselist++;
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (*parselist++ != 0)
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       /* ms not supported */
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       return NULL;
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /*
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          * FBConfig attribs.
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          */
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_RENDER_TYPE:
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!fbConfig)
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL;
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (*parselist & GLX_RGBA_BIT) {
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               rgb_flag = GL_TRUE;
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else if (*parselist & GLX_COLOR_INDEX_BIT) {
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               rgb_flag = GL_FALSE;
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else if (*parselist == 0) {
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               rgb_flag = GL_TRUE;
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_DRAWABLE_TYPE:
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!fbConfig)
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (*parselist & ~(GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT)) {
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL; /* bad bit */
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_FBCONFIG_ID:
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_VISUAL_ID:
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!fbConfig)
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            desiredVisualID = *parselist++;
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_X_RENDERABLE:
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_MAX_PBUFFER_WIDTH:
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_MAX_PBUFFER_HEIGHT:
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_MAX_PBUFFER_PIXELS:
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!fbConfig)
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL;
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist += 2;
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* ignore */
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_EXT_texture_from_pixmap
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_BIND_TO_TEXTURE_RGB_EXT:
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++; /*skip*/
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_BIND_TO_TEXTURE_RGBA_EXT:
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++; /*skip*/
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_BIND_TO_MIPMAP_TEXTURE_EXT:
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++; /*skip*/
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_BIND_TO_TEXTURE_TARGETS_EXT:
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++;
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (*parselist & ~(GLX_TEXTURE_1D_BIT_EXT |
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLX_TEXTURE_2D_BIT_EXT |
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLX_TEXTURE_RECTANGLE_BIT_EXT)) {
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               /* invalid bit */
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return NULL;
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_Y_INVERTED_EXT:
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            parselist++; /*skip*/
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case None:
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* end of list */
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 default:
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* undefined attribute */
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            _mesa_warning(NULL, "unexpected attrib 0x%x in choose_visual()",
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          *parselist);
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return NULL;
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!rgb_flag)
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) caveat;
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) min_ci;
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Since we're only simulating the GLX extension this function will never
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * find any real GL visuals.  Instead, all we can do is try to find an RGB
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * or CI visual of appropriate depth.  Other requested attributes such as
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * double buffering, depth buffer, etc. will be associated with the X
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * visual and stored in the VisualTable[].
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (desiredVisualID != -1) {
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* try to get a specific visual, by visualID */
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XVisualInfo temp;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int n;
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      temp.visualid = desiredVisualID;
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      temp.screen = screen;
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vis = XGetVisualInfo(dpy, VisualIDMask | VisualScreenMask, &temp, &n);
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (vis) {
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* give the visual some useful GLX attributes */
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         double_flag = GL_TRUE;
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (vis->depth <= 8)
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return NULL;
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         depth_size = default_depth_bits();
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         stencil_size = 8;
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* XXX accum??? */
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* RGB visual */
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int min_rgb = min_red + min_green + min_blue;
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (min_rgb>1 && min_rgb<8) {
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* a special case to be sure we can get a monochrome visual */
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 min_rgb = 1;
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (level==0) {
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vis = choose_x_visual(dpy, screen, min_rgb, visual_type);
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vis = choose_x_overlay_visual(dpy, screen, level,
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       trans_type, trans_value, min_rgb, visual_type);
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vis) {
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Note: we're not exactly obeying the glXChooseVisual rules here.
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * When GLX_DEPTH_SIZE = 1 is specified we're supposed to choose the
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * largest depth buffer size, which is 32bits/value.  Instead, we
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * return 16 to maintain performance with earlier versions of Mesa.
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (depth_size > 24)
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         depth_size = 32;
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (depth_size > 16)
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         depth_size = 24;
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (depth_size > 0) {
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         depth_size = default_depth_bits();
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!alpha_flag) {
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         alpha_flag = default_alpha_bits() > 0;
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we only support one size of stencil and accum buffers. */
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (stencil_size > 0)
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         stencil_size = 8;
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (accumRedSize > 0 || accumGreenSize > 0 || accumBlueSize > 0 ||
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          accumAlphaSize > 0) {
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         accumRedSize =
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         accumGreenSize =
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         accumBlueSize = default_accum_bits();
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         accumAlphaSize = alpha_flag ? accumRedSize : 0;
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmvis = save_glx_visual( dpy, vis, alpha_flag, double_flag,
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               stereo_flag, depth_size, stencil_size,
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               accumRedSize, accumGreenSize,
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               accumBlueSize, accumAlphaSize, level, numAux );
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return xmvis;
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XVisualInfo *
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXChooseVisual( Display *dpy, int screen, int *list )
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis;
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* register ourselves as an extension on this display */
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   register_with_display(dpy);
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmvis = choose_visual(dpy, screen, list, GL_FALSE);
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmvis) {
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return xmvis->vishandle;
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* create a new vishandle - the cached one may be stale */
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmvis->vishandle = (XVisualInfo *) malloc(sizeof(XVisualInfo));
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (xmvis->vishandle) {
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo));
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return xmvis->vishandle;
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Init basic fields of a new fake_glx_context.
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginit_glx_context(struct fake_glx_context *glxCtx, Display *dpy)
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Always return True.  See if anyone's confused... */
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean direct = GL_TRUE;
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx->xmesaContext->direct = direct;
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx->glxContext.isDirect = direct;
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx->glxContext.currentDpy = dpy;
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXContext
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateContext( Display *dpy, XVisualInfo *visinfo,
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLXContext share_list, Bool direct )
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis;
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *glxCtx;
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dpy || !visinfo)
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx = CALLOC_STRUCT(fake_glx_context);
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!glxCtx)
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* deallocate unused windows/buffers */
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaGarbageCollect(dpy);
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmvis = find_glx_visual( dpy, visinfo );
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xmvis) {
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This visual wasn't found with glXChooseVisual() */
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmvis = create_glx_visual( dpy, visinfo );
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!xmvis) {
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* unusable visual */
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         free(glxCtx);
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx->xmesaContext = XMesaCreateContext(xmvis,
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   shareCtx ? shareCtx->xmesaContext : NULL);
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!glxCtx->xmesaContext) {
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(glxCtx);
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_glx_context(glxCtx, dpy);
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (GLXContext) glxCtx;
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* XXX these may have to be removed due to thread-safety issues. */
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXContext MakeCurrent_PrevContext = 0;
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXDrawable MakeCurrent_PrevDrawable = 0;
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXDrawable MakeCurrent_PrevReadable = 0;
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaBuffer MakeCurrent_PrevDrawBuffer = 0;
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaBuffer MakeCurrent_PrevReadBuffer = 0;
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GLX 1.3 and later */
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLXDrawable read, GLXContext ctx )
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx && draw && read) {
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaBuffer drawBuffer, readBuffer;
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaContext xmctx = glxCtx->xmesaContext;
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'draw' */
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx == MakeCurrent_PrevContext
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && draw == MakeCurrent_PrevDrawable) {
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         drawBuffer = MakeCurrent_PrevDrawBuffer;
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         drawBuffer = XMesaFindBuffer( dpy, draw );
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!drawBuffer) {
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* drawable must be a new window! */
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         drawBuffer = XMesaCreateWindowBuffer( xmctx->xm_visual, draw );
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!drawBuffer) {
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* Out of memory, or context/drawable depth mismatch */
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return False;
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'read' */
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx == MakeCurrent_PrevContext
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && read == MakeCurrent_PrevReadable) {
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         readBuffer = MakeCurrent_PrevReadBuffer;
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         readBuffer = XMesaFindBuffer( dpy, read );
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!readBuffer) {
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* drawable must be a new window! */
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         readBuffer = XMesaCreateWindowBuffer( xmctx->xm_visual, read );
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!readBuffer) {
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* Out of memory, or context/drawable depth mismatch */
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return False;
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevContext = ctx;
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevDrawable = draw;
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevReadable = read;
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevDrawBuffer = drawBuffer;
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevReadBuffer = readBuffer;
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Now make current! */
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (XMesaMakeCurrent2(xmctx, drawBuffer, readBuffer)) {
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ((__GLXcontext *) ctx)->currentDpy = dpy;
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ((__GLXcontext *) ctx)->currentDrawable = draw;
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ((__GLXcontext *) ctx)->currentReadable = read;
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return True;
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return False;
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (!ctx && !draw && !read) {
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* release current context w/out assigning new one. */
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaMakeCurrent( NULL, NULL );
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevContext = 0;
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevDrawable = 0;
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevReadable = 0;
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevDrawBuffer = 0;
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      MakeCurrent_PrevReadBuffer = 0;
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return True;
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The args must either all be non-zero or all zero.
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * This is an error.
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return False;
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return Fake_glXMakeContextCurrent( dpy, drawable, drawable, ctx );
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXPixmap
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual v;
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b;
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   v = find_glx_visual( dpy, visinfo );
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!v) {
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      v = create_glx_visual( dpy, visinfo );
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!v) {
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* unusable visual */
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!b) {
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return b->frontxrb->pixmap;
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_MESA_pixmap_colormap ***/
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXPixmap
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             Pixmap pixmap, Colormap cmap )
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual v;
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b;
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   v = find_glx_visual( dpy, visinfo );
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!v) {
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      v = create_glx_visual( dpy, visinfo );
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!v) {
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* unusable visual */
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   b = XMesaCreatePixmapBuffer( v, pixmap, cmap );
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!b) {
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return b->frontxrb->pixmap;
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b = XMesaFindBuffer(dpy, pixmap);
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (b) {
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaDestroyBuffer(b);
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (_mesa_getenv("MESA_DEBUG")) {
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_warning(NULL, "Mesa: glXDestroyGLXPixmap: invalid pixmap\n");
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned long mask )
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *fakeSrc = (struct fake_glx_context *) src;
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *fakeDst = (struct fake_glx_context *) dst;
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaContext xm_src = fakeSrc->xmesaContext;
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaContext xm_dst = fakeDst->xmesaContext;
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MakeCurrent_PrevContext == src) {
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_Flush();
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_copy_context( &(xm_src->mesa), &(xm_dst->mesa), (GLuint) mask );
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryExtension( Display *dpy, int *errorBase, int *eventBase )
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int op, ev, err;
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Mesa's GLX isn't really an X extension but we try to act like one. */
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!XQueryExtension(dpy, GLX_EXTENSION_NAME, &op, &ev, &err))
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ev = err = 0;
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (errorBase)
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *errorBase = err;
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (eventBase)
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *eventBase = ev;
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return True; /* we're faking GLX so always return success */
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void _kw_ungrab_all( Display *dpy );
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid _kw_ungrab_all( Display *dpy )
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XUngrabPointer( dpy, CurrentTime );
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XUngrabKeyboard( dpy, CurrentTime );
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXDestroyContext( Display *dpy, GLXContext ctx )
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   MakeCurrent_PrevContext = 0;
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   MakeCurrent_PrevDrawable = 0;
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   MakeCurrent_PrevReadable = 0;
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   MakeCurrent_PrevDrawBuffer = 0;
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   MakeCurrent_PrevReadBuffer = 0;
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaDestroyContext( glxCtx->xmesaContext );
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaGarbageCollect(dpy);
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(glxCtx);
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXIsDirect( Display *dpy, GLXContext ctx )
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return glxCtx->xmesaContext->direct;
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXSwapBuffers( Display *dpy, GLXDrawable drawable )
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffer) {
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaSwapBuffers(buffer);
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (_mesa_getenv("MESA_DEBUG")) {
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_warning(NULL, "glXSwapBuffers: invalid drawable 0x%x\n",
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    (int) drawable);
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_MESA_copy_sub_buffer ***/
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           int x, int y, int width, int height )
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffer) {
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaCopySubBuffer(buffer, x, y, width, height);
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (_mesa_getenv("MESA_DEBUG")) {
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_warning(NULL, "Mesa: glXCopySubBufferMESA: invalid drawable\n");
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryVersion( Display *dpy, int *maj, int *min )
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Return GLX version, not Mesa version */
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(CLIENT_MAJOR_VERSION == SERVER_MAJOR_VERSION);
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *maj = CLIENT_MAJOR_VERSION;
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *min = MIN2( CLIENT_MINOR_VERSION, SERVER_MINOR_VERSION );
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return True;
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Query the GLX attributes of the given XVisualInfo.
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig )
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(xmvis);
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(attrib) {
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_USE_GL:
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (fbconfig)
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = (int) True;
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BUFFER_SIZE:
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = xmvis->visinfo->depth;
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_LEVEL:
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = xmvis->mesa_visual.level;
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_RGBA:
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (fbconfig)
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (xmvis->mesa_visual.rgbMode) {
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    *value = True;
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    *value = False;
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_DOUBLEBUFFER:
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = (int) xmvis->mesa_visual.doubleBufferMode;
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_STEREO:
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = (int) xmvis->mesa_visual.stereoMode;
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_AUX_BUFFERS:
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = xmvis->mesa_visual.numAuxBuffers;
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_RED_SIZE:
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->mesa_visual.redBits;
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_GREEN_SIZE:
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->mesa_visual.greenBits;
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BLUE_SIZE:
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->mesa_visual.blueBits;
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ALPHA_SIZE:
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->mesa_visual.alphaBits;
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_DEPTH_SIZE:
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->mesa_visual.depthBits;
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_STENCIL_SIZE:
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = xmvis->mesa_visual.stencilBits;
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ACCUM_RED_SIZE:
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = xmvis->mesa_visual.accumRedBits;
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ACCUM_GREEN_SIZE:
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = xmvis->mesa_visual.accumGreenBits;
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ACCUM_BLUE_SIZE:
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 *value = xmvis->mesa_visual.accumBlueBits;
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_ACCUM_ALPHA_SIZE:
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->mesa_visual.accumAlphaBits;
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return 0;
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * GLX_EXT_visual_info extension
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_X_VISUAL_TYPE_EXT:
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (xmvis->visinfo->CLASS) {
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case StaticGray:   *value = GLX_STATIC_GRAY_EXT;   return 0;
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case GrayScale:    *value = GLX_GRAY_SCALE_EXT;    return 0;
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case StaticColor:  *value = GLX_STATIC_GRAY_EXT;   return 0;
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case PseudoColor:  *value = GLX_PSEUDO_COLOR_EXT;  return 0;
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case TrueColor:    *value = GLX_TRUE_COLOR_EXT;    return 0;
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case DirectColor:  *value = GLX_DIRECT_COLOR_EXT;  return 0;
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_TYPE_EXT:
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (xmvis->mesa_visual.level==0) {
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* normal planes */
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *value = GLX_NONE_EXT;
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (xmvis->mesa_visual.level>0) {
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* overlay */
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (xmvis->mesa_visual.rgbMode) {
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               *value = GLX_TRANSPARENT_RGB_EXT;
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            else {
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               *value = GLX_TRANSPARENT_INDEX_EXT;
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (xmvis->mesa_visual.level<0) {
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* underlay */
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *value = GLX_NONE_EXT;
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_INDEX_VALUE_EXT:
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         {
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            int pixel = transparent_pixel( xmvis );
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (pixel>=0) {
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               *value = pixel;
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* else undefined */
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_RED_VALUE_EXT:
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* undefined */
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_GREEN_VALUE_EXT:
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* undefined */
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_BLUE_VALUE_EXT:
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* undefined */
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TRANSPARENT_ALPHA_VALUE_EXT:
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* undefined */
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * GLX_EXT_visual_info extension
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VISUAL_CAVEAT_EXT:
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* test for zero, just in case */
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (xmvis->mesa_visual.visualRating > 0)
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *value = xmvis->mesa_visual.visualRating;
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *value = GLX_NONE_EXT;
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * GLX_ARB_multisample
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_SAMPLE_BUFFERS_ARB:
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = 0;
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_SAMPLES_ARB:
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = 0;
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * For FBConfigs:
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_SCREEN_EXT:
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->visinfo->screen;
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_DRAWABLE_TYPE: /*SGIX too */
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_RENDER_TYPE_SGIX:
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (xmvis->mesa_visual.rgbMode)
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *value = GLX_RGBA_BIT;
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *value = GLX_COLOR_INDEX_BIT;
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_X_RENDERABLE_SGIX:
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = True; /* XXX really? */
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_FBCONFIG_ID_SGIX:
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->visinfo->visualid;
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_MAX_PBUFFER_WIDTH:
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* XXX or MAX_WIDTH? */
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = DisplayWidth(xmvis->display, xmvis->visinfo->screen);
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_MAX_PBUFFER_HEIGHT:
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = DisplayHeight(xmvis->display, xmvis->visinfo->screen);
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_MAX_PBUFFER_PIXELS:
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = DisplayWidth(xmvis->display, xmvis->visinfo->screen) *
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  DisplayHeight(xmvis->display, xmvis->visinfo->screen);
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VISUAL_ID:
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!fbconfig)
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return GLX_BAD_ATTRIBUTE;
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->visinfo->visualid;
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_EXT_texture_from_pixmap
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BIND_TO_TEXTURE_RGB_EXT:
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = True; /*XXX*/
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BIND_TO_TEXTURE_RGBA_EXT:
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* XXX review */
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmvis->mesa_visual.alphaBits > 0 ? True : False;
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BIND_TO_MIPMAP_TEXTURE_EXT:
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = True; /*XXX*/
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_BIND_TO_TEXTURE_TARGETS_EXT:
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = (GLX_TEXTURE_1D_BIT_EXT |
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   GLX_TEXTURE_2D_BIT_EXT |
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   GLX_TEXTURE_RECTANGLE_BIT_EXT); /*XXX*/
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_Y_INVERTED_EXT:
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = True; /*XXX*/
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GLX_BAD_ATTRIBUTE;
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return Success;
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   int attrib, int *value )
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis;
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int k;
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dpy || !visinfo)
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GLX_BAD_ATTRIBUTE;
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmvis = find_glx_visual( dpy, visinfo );
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xmvis) {
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* this visual wasn't obtained with glXChooseVisual */
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmvis = create_glx_visual( dpy, visinfo );
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!xmvis) {
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* this visual can't be used for GL rendering */
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (attrib==GLX_USE_GL) {
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    *value = (int) False;
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return 0;
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return GLX_BAD_VISUAL;
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   k = get_config(xmvis, attrib, value, GL_FALSE);
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return k;
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXWaitGL( void )
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaContext xmesa = XMesaGetCurrentContext();
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaFlush( xmesa );
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXWaitX( void )
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaContext xmesa = XMesaGetCurrentContext();
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaFlush( xmesa );
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_extensions( void )
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EXTENSIONS + 23; /* skip "GLX_MESA_set_3dfx_mode" */
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GLX 1.1 and later */
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryExtensionsString( Display *dpy, int screen )
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return get_extensions();
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GLX 1.1 and later */
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryServerString( Display *dpy, int screen, int name )
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static char version[1000];
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sprintf(version, "%d.%d %s",
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION, MESA_GLX_VERSION);
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (name) {
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_EXTENSIONS:
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return get_extensions();
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VENDOR:
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return VENDOR;
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VERSION:
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return version;
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GLX 1.1 and later */
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetClientString( Display *dpy, int name )
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static char version[1000];
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sprintf(version, "%d.%d %s", CLIENT_MAJOR_VERSION,
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   CLIENT_MINOR_VERSION, MESA_GLX_VERSION);
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (name) {
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_EXTENSIONS:
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return get_extensions();
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VENDOR:
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return VENDOR;
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_VERSION:
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return version;
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX 1.3 and later
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           int attribute, int *value )
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual v = (XMesaVisual) config;
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) config;
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dpy || !config || !value)
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return -1;
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return get_config(v, attribute, value, GL_TRUE);
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXFBConfig *
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetFBConfigs( Display *dpy, int screen, int *nelements )
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XVisualInfo *visuals, visTemplate;
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const long visMask = VisualScreenMask;
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Get list of all X visuals */
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   visTemplate.screen = screen;
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   visuals = XGetVisualInfo(dpy, visMask, &visTemplate, nelements);
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*nelements > 0) {
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaVisual *results;
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      results = (XMesaVisual *) malloc(*nelements * sizeof(XMesaVisual));
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!results) {
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *nelements = 0;
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < *nelements; i++) {
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         results[i] = create_glx_visual(dpy, visuals + i);
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (GLXFBConfig *) results;
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXFBConfig *
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXChooseFBConfig( Display *dpy, int screen,
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const int *attribList, int *nitems )
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis;
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* register ourselves as an extension on this display */
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   register_with_display(dpy);
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!attribList || !attribList[0]) {
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* return list of all configs (per GLX_SGIX_fbconfig spec) */
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return Fake_glXGetFBConfigs(dpy, screen, nitems);
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmvis = choose_visual(dpy, screen, attribList, GL_TRUE);
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmvis) {
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLXFBConfig *config = (GLXFBConfig *) malloc(sizeof(XMesaVisual));
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!config) {
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *nitems = 0;
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *nitems = 1;
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      config[0] = (GLXFBConfig) xmvis;
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (GLXFBConfig *) config;
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *nitems = 0;
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XVisualInfo *
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dpy && config) {
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaVisual xmvis = (XMesaVisual) config;
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return xmvis->vishandle;
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* create a new vishandle - the cached one may be stale */
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmvis->vishandle = (XVisualInfo *) malloc(sizeof(XVisualInfo));
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (xmvis->vishandle) {
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo));
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return xmvis->vishandle;
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXWindow
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const int *attribList )
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis = (XMesaVisual) config;
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf;
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xmvis)
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmbuf = XMesaCreateWindowBuffer(xmvis, win);
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xmbuf)
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) attribList;  /* Ignored in GLX 1.3 */
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return win;  /* A hack for now */
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXDestroyWindow( Display *dpy, GLXWindow window )
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable) window);
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (b)
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaDestroyBuffer(b);
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* don't destroy X window */
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* XXX untested */
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXPixmap
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const int *attribList )
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual v = (XMesaVisual) config;
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b;
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int *attr;
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int target = 0, format = 0, mipmap = 0;
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int value;
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dpy || !config || !pixmap)
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (attr = attribList; attr && *attr; attr++) {
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (*attr) {
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TEXTURE_FORMAT_EXT:
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         attr++;
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (*attr) {
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TEXTURE_FORMAT_NONE_EXT:
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TEXTURE_FORMAT_RGB_EXT:
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TEXTURE_FORMAT_RGBA_EXT:
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            format = *attr;
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* error */
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return 0;
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TEXTURE_TARGET_EXT:
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         attr++;
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (*attr) {
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TEXTURE_1D_EXT:
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TEXTURE_2D_EXT:
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_TEXTURE_RECTANGLE_EXT:
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            target = *attr;
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* error */
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return 0;
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_MIPMAP_TEXTURE_EXT:
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         attr++;
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (*attr)
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mipmap = 1;
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* error */
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0;
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format == GLX_TEXTURE_FORMAT_RGB_EXT) {
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (get_config(v, GLX_BIND_TO_TEXTURE_RGB_EXT,
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     &value, GL_TRUE) != Success
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          || !value) {
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0; /* error! */
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (format == GLX_TEXTURE_FORMAT_RGBA_EXT) {
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (get_config(v, GLX_BIND_TO_TEXTURE_RGBA_EXT,
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     &value, GL_TRUE) != Success
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          || !value) {
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0; /* error! */
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mipmap) {
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (get_config(v, GLX_BIND_TO_MIPMAP_TEXTURE_EXT,
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     &value, GL_TRUE) != Success
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          || !value) {
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0; /* error! */
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target == GLX_TEXTURE_1D_EXT) {
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (get_config(v, GLX_BIND_TO_TEXTURE_TARGETS_EXT,
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     &value, GL_TRUE) != Success
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          || (value & GLX_TEXTURE_1D_BIT_EXT) == 0) {
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0; /* error! */
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (target == GLX_TEXTURE_2D_EXT) {
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (get_config(v, GLX_BIND_TO_TEXTURE_TARGETS_EXT,
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     &value, GL_TRUE) != Success
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          || (value & GLX_TEXTURE_2D_BIT_EXT) == 0) {
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0; /* error! */
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (target == GLX_TEXTURE_RECTANGLE_EXT) {
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (get_config(v, GLX_BIND_TO_TEXTURE_TARGETS_EXT,
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     &value, GL_TRUE) != Success
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          || (value & GLX_TEXTURE_RECTANGLE_BIT_EXT) == 0) {
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0; /* error! */
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format || target || mipmap) {
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* texture from pixmap */
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      b = XMesaCreatePixmapTextureBuffer(v, pixmap, 0, format, target, mipmap);
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!b) {
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return pixmap;
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable)pixmap);
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (b)
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaDestroyBuffer(b);
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* don't destroy X pixmap */
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXPbuffer
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const int *attribList )
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis = (XMesaVisual) config;
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf;
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int *attrib;
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int width = 0, height = 0;
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (attrib = attribList; *attrib; attrib++) {
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (*attrib) {
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_PBUFFER_WIDTH:
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrib++;
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            width = *attrib;
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_PBUFFER_HEIGHT:
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrib++;
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            height = *attrib;
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_PRESERVED_CONTENTS:
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrib++;
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            preserveContents = *attrib;
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_LARGEST_PBUFFER:
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrib++;
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            useLargest = *attrib;
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return 0;
2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width == 0 || height == 0)
2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width > SWRAST_MAX_WIDTH || height > SWRAST_MAX_HEIGHT) {
2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* If allocation would have failed and GLX_LARGEST_PBUFFER is set,
2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * allocate the largest possible buffer.
2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (useLargest) {
2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         width = SWRAST_MAX_WIDTH;
2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         height = SWRAST_MAX_HEIGHT;
2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* A GLXPbuffer handle must be an X Drawable because that's what
2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXMakeCurrent takes.
2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmbuf) {
2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmbuf->largestPbuffer = useLargest;
2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmbuf->preservedContents = preserveContents;
2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (GLXPbuffer) xmbuf->frontxrb->pixmap;
2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf )
2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b = XMesaFindBuffer(dpy, pbuf);
2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (b) {
2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaDestroyBuffer(b);
2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned int *value )
2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, draw);
2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xmbuf)
2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* make sure buffer's dimensions are up to date */
2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmesa_check_and_update_buffer_size(NULL, xmbuf);
2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (attribute) {
2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_WIDTH:
2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->mesa_buffer.Width;
2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_HEIGHT:
2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->mesa_buffer.Height;
2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_PRESERVED_CONTENTS:
2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->preservedContents;
2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_LARGEST_PBUFFER:
2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->largestPbuffer;
2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_FBCONFIG_ID:
2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->xm_visual->visinfo->visualid;
2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_EXT_texture_from_pixmap
2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TEXTURE_FORMAT_EXT:
2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->TextureFormat;
2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_TEXTURE_TARGET_EXT:
2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->TextureTarget;
2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_MIPMAP_TEXTURE_EXT:
2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->TextureMipmap;
2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return; /* raise BadValue error */
2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXContext
2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          int renderType, GLXContext shareList, Bool direct )
2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *glxCtx;
2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *shareCtx = (struct fake_glx_context *) shareList;
2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis = (XMesaVisual) config;
2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dpy || !config ||
2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE))
2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx = CALLOC_STRUCT(fake_glx_context);
2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!glxCtx)
2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* deallocate unused windows/buffers */
2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaGarbageCollect(dpy);
2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx->xmesaContext = XMesaCreateContext(xmvis,
2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   shareCtx ? shareCtx->xmesaContext : NULL);
2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!glxCtx->xmesaContext) {
2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(glxCtx);
2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_glx_context(glxCtx, dpy);
2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (GLXContext) glxCtx;
2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaContext xmctx = glxCtx->xmesaContext;
2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) ctx;
2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (attribute) {
2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GLX_FBCONFIG_ID:
2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *value = xmctx->xm_visual->visinfo->visualid;
2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GLX_RENDER_TYPE:
2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *value = GLX_RGBA_TYPE;
2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GLX_SCREEN:
2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *value = 0;
2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return Success;
2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GLX_BAD_ATTRIBUTE;
2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask )
2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmbuf)
2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmbuf->selectedEvents = mask;
2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          unsigned long *mask )
2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmbuf)
2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *mask = xmbuf->selectedEvents;
2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *mask = 0;
2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGI_swap_control ***/
2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXSwapIntervalSGI(int interval)
2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) interval;
2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGI_video_sync ***/
2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned int FrameCounter = 0;
2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetVideoSyncSGI(unsigned int *count)
2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* this is a bogus implementation */
2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *count = FrameCounter++;
2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (divisor <= 0 || remainder < 0)
2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GLX_BAD_VALUE;
2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* this is a bogus implementation */
2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FrameCounter++;
2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (FrameCounter % divisor != remainder)
2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FrameCounter++;
2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *count = FrameCounter;
2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGI_make_current_read ***/
2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXMakeCurrentReadSGI(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return Fake_glXMakeContextCurrent( dpy, draw, read, ctx );
2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* not used
2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXDrawable
2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetCurrentReadDrawableSGI(void)
2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGIX_video_source ***/
2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(_VL_H)
2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXVideoSourceSGIX
2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode)
2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) server;
2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) path;
2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) nodeClass;
2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drainNode;
2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src)
2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) src;
2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_EXT_import_context ***/
2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXFreeContextEXT(Display *dpy, GLXContext context)
2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) context;
2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXContextID
2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetContextIDEXT(const GLXContext context)
2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) context;
2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXContext
2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXImportContextEXT(Display *dpy, GLXContextID contextID)
2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) contextID;
2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute, int *value)
2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) context;
2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) attribute;
2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) value;
2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGIX_fbconfig ***/
2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value)
2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return Fake_glXGetFBConfigAttrib(dpy, config, attribute, value);
2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXFBConfigSGIX *
2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXChooseFBConfigSGIX(Display *dpy, int screen, int *attrib_list, int *nelements)
2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (GLXFBConfig *) Fake_glXChooseFBConfig(dpy, screen, attrib_list, nelements);
2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXPixmap
2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateGLXPixmapWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap)
2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis = (XMesaVisual) config;
2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf = XMesaCreatePixmapBuffer(xmvis, pixmap, 0);
2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return xmbuf->frontxrb->pixmap; /* need to return an X ID */
2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXContext
2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct)
2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis = (XMesaVisual) config;
2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *glxCtx;
2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx = CALLOC_STRUCT(fake_glx_context);
2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!glxCtx)
2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* deallocate unused windows/buffers */
2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaGarbageCollect(dpy);
2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glxCtx->xmesaContext = XMesaCreateContext(xmvis,
2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   shareCtx ? shareCtx->xmesaContext : NULL);
2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!glxCtx->xmesaContext) {
2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(glxCtx);
2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_glx_context(glxCtx, dpy);
2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (GLXContext) glxCtx;
2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XVisualInfo *
2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetVisualFromFBConfigSGIX(Display *dpy, GLXFBConfigSGIX config)
2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return Fake_glXGetVisualFromFBConfig(dpy, config);
2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXFBConfigSGIX
2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis = find_glx_visual(dpy, vis);
2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xmvis) {
2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* This visual wasn't found with glXChooseVisual() */
2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmvis = create_glx_visual(dpy, vis);
2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (GLXFBConfigSGIX) xmvis;
2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGIX_pbuffer ***/
2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLXPbufferSGIX
2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config,
2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             unsigned int width, unsigned int height,
2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             int *attribList)
2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaVisual xmvis = (XMesaVisual) config;
2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf;
2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int *attrib;
2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (attrib = attribList; attrib && *attrib; attrib++) {
2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (*attrib) {
2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_PRESERVED_CONTENTS_SGIX:
2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrib++;
2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            preserveContents = *attrib; /* ignored */
2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case GLX_LARGEST_PBUFFER_SGIX:
2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrib++;
2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            useLargest = *attrib; /* ignored */
2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return 0;
2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* not used at this time */
2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) useLargest;
2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) preserveContents;
2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* A GLXPbuffer handle must be an X Drawable because that's what
2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * glXMakeCurrent takes.
2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (GLXPbuffer) xmbuf->frontxrb->pixmap;
2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXDestroyGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf)
2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf);
2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmbuf) {
2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaDestroyBuffer(xmbuf);
2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value)
2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf);
2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!xmbuf) {
2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Generate GLXBadPbufferSGIX for bad pbuffer */
2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (attribute) {
2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_PRESERVED_CONTENTS_SGIX:
2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->preservedContents;
2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_LARGEST_PBUFFER_SGIX:
2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->largestPbuffer;
2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_WIDTH_SGIX:
2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->mesa_buffer.Width;
2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_HEIGHT_SGIX:
2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = xmbuf->mesa_buffer.Height;
2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GLX_EVENT_MASK_SGIX:
2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = 0;  /* XXX might be wrong */
2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *value = 0;
2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXSelectEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long mask)
2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmbuf) {
2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Note: we'll never generate clobber events */
2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      xmbuf->selectedEvents = mask;
2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetSelectedEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long *mask)
2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xmbuf) {
2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *mask = xmbuf->selectedEvents;
2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *mask = 0;
2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGI_cushion ***/
2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXCushionSGI(Display *dpy, Window win, float cushion)
2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) win;
2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) cushion;
2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGIX_video_resize ***/
2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window window)
2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) channel;
2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) window;
2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXChannelRectSGIX(Display *dpy, int screen, int channel, int x, int y, int w, int h)
2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) channel;
2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) x;
2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) y;
2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) w;
2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) h;
2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryChannelRectSGIX(Display *dpy, int screen, int channel, int *x, int *y, int *w, int *h)
2734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
2737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) channel;
2738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) x;
2739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) y;
2740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) w;
2741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) h;
2742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel, int *dx, int *dy, int *dw, int *dh)
2747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
2750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) channel;
2751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dx;
2752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dy;
2753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dw;
2754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dh;
2755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
2759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXChannelRectSyncSGIX(Display *dpy, int screen, int channel, GLenum synctype)
2760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
2763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) channel;
2764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) synctype;
2765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGIX_dmbuffer **/
2771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(_DM_BUFFER_H_)
2773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
2774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer)
2775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) pbuffer;
2778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) params;
2779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dmbuffer;
2780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return False;
2781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
2783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGIX_swap_group ***/
2786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member)
2789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drawable;
2792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) member;
2793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGIX_swap_barrier ***/
2798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier)
2801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drawable;
2804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) barrier;
2805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
2808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
2809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
2812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) max;
2813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return False;
2814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SUN_get_transparent_index ***/
2819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Status
2821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, long *pTransparent)
2822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) dpy;
2824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) overlay;
2825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) underlay;
2826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) pTransparent;
2827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
2828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_MESA_release_buffers ***/
2833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Release the depth, stencil, accum buffers attached to a GLXDrawable
2836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (a window or pixmap) prior to destroying the GLXDrawable.
2837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
2839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
2840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b = XMesaFindBuffer(dpy, d);
2842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (b) {
2843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaDestroyBuffer(b);
2844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return True;
2845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return False;
2847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_MESA_set_3dfx_mode ***/
2852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool
2854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXSet3DfxModeMESA( int mode )
2855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return XMesaSetFXmode( mode );
2857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_NV_vertex_array range ***/
2862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *
2863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXAllocateMemoryNV( GLsizei size,
2864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLfloat readFrequency,
2865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLfloat writeFrequency,
2866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLfloat priority )
2867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) size;
2869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) readFrequency;
2870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) writeFrequency;
2871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) priority;
2872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
2873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXFreeMemoryNV( GLvoid *pointer )
2878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) pointer;
2880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_MESA_agp_offset ***/
2884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint
2886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXGetAGPOffsetMESA( const GLvoid *pointer )
2887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) pointer;
2889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ~0;
2890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_EXT_texture_from_pixmap ***/
2894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXBindTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer,
2897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const int *attrib_list)
2898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b = XMesaFindBuffer(dpy, drawable);
2900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (b)
2901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaBindTexImage(dpy, b, buffer, attrib_list);
2902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
2905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFake_glXReleaseTexImageEXT(Display *dpy, GLXDrawable drawable, int buffer)
2906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   XMesaBuffer b = XMesaFindBuffer(dpy, drawable);
2908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (b)
2909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      XMesaReleaseTexImage(dpy, b, buffer);
2910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* silence warning */
2914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern struct _glxapi_table *_mesa_GetGLXDispatchTable(void);
2915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
2918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new GLX API dispatch table with its function pointers
2919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * initialized to point to Mesa's "fake" GLX API functions.
2920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: there's a similar function (_real_GetGLXDispatchTable) that
2921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * returns a new dispatch table with all pointers initalized to point
2922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to "real" GLX functions (which understand GLX wire protocol, etc).
2923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
2924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct _glxapi_table *
2925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetGLXDispatchTable(void)
2926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static struct _glxapi_table glx;
2928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* be sure our dispatch table size <= libGL's table */
2930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint size = sizeof(struct _glxapi_table) / sizeof(void *);
2932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (void) size;
2933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(_glxapi_get_dispatch_table_size() >= size);
2934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* initialize the whole table to no-ops */
2937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _glxapi_set_no_op_table(&glx);
2938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* now initialize the table with the functions I implement */
2940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.ChooseVisual = Fake_glXChooseVisual;
2941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CopyContext = Fake_glXCopyContext;
2942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateContext = Fake_glXCreateContext;
2943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateGLXPixmap = Fake_glXCreateGLXPixmap;
2944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.DestroyContext = Fake_glXDestroyContext;
2945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.DestroyGLXPixmap = Fake_glXDestroyGLXPixmap;
2946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetConfig = Fake_glXGetConfig;
2947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*glx.GetCurrentContext = Fake_glXGetCurrentContext;*/
2948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*glx.GetCurrentDrawable = Fake_glXGetCurrentDrawable;*/
2949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.IsDirect = Fake_glXIsDirect;
2950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.MakeCurrent = Fake_glXMakeCurrent;
2951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryExtension = Fake_glXQueryExtension;
2952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryVersion = Fake_glXQueryVersion;
2953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.SwapBuffers = Fake_glXSwapBuffers;
2954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.UseXFont = Fake_glXUseXFont;
2955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.WaitGL = Fake_glXWaitGL;
2956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.WaitX = Fake_glXWaitX;
2957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_VERSION_1_1 ***/
2959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetClientString = Fake_glXGetClientString;
2960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryExtensionsString = Fake_glXQueryExtensionsString;
2961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryServerString = Fake_glXQueryServerString;
2962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_VERSION_1_2 ***/
2964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*glx.GetCurrentDisplay = Fake_glXGetCurrentDisplay;*/
2965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_VERSION_1_3 ***/
2967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.ChooseFBConfig = Fake_glXChooseFBConfig;
2968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateNewContext = Fake_glXCreateNewContext;
2969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreatePbuffer = Fake_glXCreatePbuffer;
2970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreatePixmap = Fake_glXCreatePixmap;
2971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateWindow = Fake_glXCreateWindow;
2972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.DestroyPbuffer = Fake_glXDestroyPbuffer;
2973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.DestroyPixmap = Fake_glXDestroyPixmap;
2974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.DestroyWindow = Fake_glXDestroyWindow;
2975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*glx.GetCurrentReadDrawable = Fake_glXGetCurrentReadDrawable;*/
2976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetFBConfigAttrib = Fake_glXGetFBConfigAttrib;
2977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetFBConfigs = Fake_glXGetFBConfigs;
2978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetSelectedEvent = Fake_glXGetSelectedEvent;
2979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetVisualFromFBConfig = Fake_glXGetVisualFromFBConfig;
2980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.MakeContextCurrent = Fake_glXMakeContextCurrent;
2981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryContext = Fake_glXQueryContext;
2982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryDrawable = Fake_glXQueryDrawable;
2983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.SelectEvent = Fake_glXSelectEvent;
2984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGI_swap_control ***/
2986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.SwapIntervalSGI = Fake_glXSwapIntervalSGI;
2987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGI_video_sync ***/
2989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetVideoSyncSGI = Fake_glXGetVideoSyncSGI;
2990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.WaitVideoSyncSGI = Fake_glXWaitVideoSyncSGI;
2991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGI_make_current_read ***/
2993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.MakeCurrentReadSGI = Fake_glXMakeCurrentReadSGI;
2994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*glx.GetCurrentReadDrawableSGI = Fake_glXGetCurrentReadDrawableSGI;*/
2995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** GLX_SGIX_video_source ***/
2997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(_VL_H)
2998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateGLXVideoSourceSGIX = Fake_glXCreateGLXVideoSourceSGIX;
2999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.DestroyGLXVideoSourceSGIX = Fake_glXDestroyGLXVideoSourceSGIX;
3000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
3001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_EXT_import_context ***/
3003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.FreeContextEXT = Fake_glXFreeContextEXT;
3004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetContextIDEXT = Fake_glXGetContextIDEXT;
3005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*glx.GetCurrentDisplayEXT = Fake_glXGetCurrentDisplayEXT;*/
3006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.ImportContextEXT = Fake_glXImportContextEXT;
3007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryContextInfoEXT = Fake_glXQueryContextInfoEXT;
3008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGIX_fbconfig ***/
3010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetFBConfigAttribSGIX = Fake_glXGetFBConfigAttribSGIX;
3011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.ChooseFBConfigSGIX = Fake_glXChooseFBConfigSGIX;
3012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateGLXPixmapWithConfigSGIX = Fake_glXCreateGLXPixmapWithConfigSGIX;
3013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateContextWithConfigSGIX = Fake_glXCreateContextWithConfigSGIX;
3014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetVisualFromFBConfigSGIX = Fake_glXGetVisualFromFBConfigSGIX;
3015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetFBConfigFromVisualSGIX = Fake_glXGetFBConfigFromVisualSGIX;
3016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGIX_pbuffer ***/
3018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateGLXPbufferSGIX = Fake_glXCreateGLXPbufferSGIX;
3019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.DestroyGLXPbufferSGIX = Fake_glXDestroyGLXPbufferSGIX;
3020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryGLXPbufferSGIX = Fake_glXQueryGLXPbufferSGIX;
3021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.SelectEventSGIX = Fake_glXSelectEventSGIX;
3022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetSelectedEventSGIX = Fake_glXGetSelectedEventSGIX;
3023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGI_cushion ***/
3025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CushionSGI = Fake_glXCushionSGI;
3026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGIX_video_resize ***/
3028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.BindChannelToWindowSGIX = Fake_glXBindChannelToWindowSGIX;
3029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.ChannelRectSGIX = Fake_glXChannelRectSGIX;
3030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryChannelRectSGIX = Fake_glXQueryChannelRectSGIX;
3031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryChannelDeltasSGIX = Fake_glXQueryChannelDeltasSGIX;
3032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.ChannelRectSyncSGIX = Fake_glXChannelRectSyncSGIX;
3033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGIX_dmbuffer **/
3035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(_DM_BUFFER_H_)
3036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.AssociateDMPbufferSGIX = NULL;
3037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
3038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGIX_swap_group ***/
3040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.JoinSwapGroupSGIX = Fake_glXJoinSwapGroupSGIX;
3041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SGIX_swap_barrier ***/
3043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.BindSwapBarrierSGIX = Fake_glXBindSwapBarrierSGIX;
3044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.QueryMaxSwapBarriersSGIX = Fake_glXQueryMaxSwapBarriersSGIX;
3045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_SUN_get_transparent_index ***/
3047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetTransparentIndexSUN = Fake_glXGetTransparentIndexSUN;
3048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_MESA_copy_sub_buffer ***/
3050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CopySubBufferMESA = Fake_glXCopySubBufferMESA;
3051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_MESA_release_buffers ***/
3053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.ReleaseBuffersMESA = Fake_glXReleaseBuffersMESA;
3054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_MESA_pixmap_colormap ***/
3056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.CreateGLXPixmapMESA = Fake_glXCreateGLXPixmapMESA;
3057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_MESA_set_3dfx_mode ***/
3059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.Set3DfxModeMESA = Fake_glXSet3DfxModeMESA;
3060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_NV_vertex_array_range ***/
3062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.AllocateMemoryNV = Fake_glXAllocateMemoryNV;
3063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.FreeMemoryNV = Fake_glXFreeMemoryNV;
3064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_MESA_agp_offset ***/
3066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.GetAGPOffsetMESA = Fake_glXGetAGPOffsetMESA;
3067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*** GLX_EXT_texture_from_pixmap ***/
3069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.BindTexImageEXT = Fake_glXBindTexImageEXT;
3070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   glx.ReleaseTexImageEXT = Fake_glXReleaseTexImageEXT;
3071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &glx;
3073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
3074