fakeglx.c revision 66ab7271016615cf485fb0b71832833d2e0f99a7
166ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul/* $Id: fakeglx.c,v 1.74 2002/11/05 21:11:18 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
53160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul * Version:  5.0
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
78d687e7e58a148f3f16573636023e54755372010Brian Paul * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2936cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paul * This is an emulation of the GLX API which allows Mesa/GLX-based programs
3036cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paul * to run on X servers which do not have the real GLX extension.
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Thanks to the contributors:
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
34ddf69f247fdb246b99ef6525fcfa6eda7b2e2aa7Brian Paul * Initial version:  Philip Brown (phil@bolthole.com)
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Better glXGetConfig() support: Armin Liebchen (liebchen@asylum.cs.utah.edu)
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Further visual-handling refinements: Wolfram Gloger
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *    (wmglo@Dent.MED.Uni-Muenchen.DE).
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Notes:
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *   Don't be fooled, stereo isn't supported yet.
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
45fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glxheader.h"
46426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#include "glxapi.h"
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/xmesa.h"
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "config.h"
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "macros.h"
513c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
5271dea349d2be623b7819389428b0d6a124e8d184Brian Paul#include "mmath.h"
535e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
5471dea349d2be623b7819389428b0d6a124e8d184Brian Paul#include "xfonts.h"
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "xmesaP.h"
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This indicates the client-side GLX API and GLX encoder version. */
5978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define CLIENT_MAJOR_VERSION 1
60a573803ed3fe9ef6489f45bd4c5455b77cb33a43Brian Paul#define CLIENT_MINOR_VERSION 4  /* but don't have 1.3's pbuffers, etc yet */
6178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
6278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This indicates the server-side GLX decoder version.
63ba57e5297d60eef37e43dd4d7f10d1e62f5e97ceBrian Paul * GLX 1.4 indicates OpenGL 1.3 support
6478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul */
6578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define SERVER_MAJOR_VERSION 1
66ba57e5297d60eef37e43dd4d7f10d1e62f5e97ceBrian Paul#define SERVER_MINOR_VERSION 4
6778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
6878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This is appended onto the glXGetClient/ServerString version strings. */
693160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul#define MESA_GLX_VERSION "Mesa 5.0"
7078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
7178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* Who implemented this GLX? */
7278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define VENDOR "Brian Paul"
7378fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
74e4656003caee346d9c4eb23256d73409271291a7Brian Paul#define EXTENSIONS \
75e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_MESA_set_3dfx_mode " \
76e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_MESA_copy_sub_buffer " \
77e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_MESA_pixmap_colormap " \
78e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_MESA_release_buffers " \
79e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_ARB_get_proc_address " \
80e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_EXT_visual_info " \
81e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_EXT_visual_rating " \
82e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_SGI_video_sync " \
83e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_SGIX_fbconfig " \
84e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_SGIX_pbuffer"
8578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
8743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul/* Silence compiler warnings */
88e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paulextern void Fake_glXDummyFunc( void );
8943c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paulvoid Fake_glXDummyFunc( void )
9043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul{
9143c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   (void) kernel8;
9243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   (void) DitherValues;
9343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   (void) HPCR_DRGB;
9443c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   (void) kernel1;
9543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul}
9643c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
9743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
987cf50e137da497a590ec9001a9918972a6246142Brian Paul/*
997cf50e137da497a590ec9001a9918972a6246142Brian Paul * Our fake GLX context will contain a "real" GLX context and an XMesa context.
1007cf50e137da497a590ec9001a9918972a6246142Brian Paul *
1017cf50e137da497a590ec9001a9918972a6246142Brian Paul * Note that a pointer to a __GLXcontext is a pointer to a fake_glx_context,
1027cf50e137da497a590ec9001a9918972a6246142Brian Paul * and vice versa.
1037cf50e137da497a590ec9001a9918972a6246142Brian Paul *
1047cf50e137da497a590ec9001a9918972a6246142Brian Paul * We really just need this structure in order to make the libGL functions
1057cf50e137da497a590ec9001a9918972a6246142Brian Paul * glXGetCurrentContext(), glXGetCurrentDrawable() and glXGetCurrentDisplay()
1067cf50e137da497a590ec9001a9918972a6246142Brian Paul * work correctly.
1077cf50e137da497a590ec9001a9918972a6246142Brian Paul */
1087cf50e137da497a590ec9001a9918972a6246142Brian Paulstruct fake_glx_context {
1097cf50e137da497a590ec9001a9918972a6246142Brian Paul   __GLXcontext glxContext;   /* this MUST be first! */
1107cf50e137da497a590ec9001a9918972a6246142Brian Paul   XMesaContext xmesaContext;
1117cf50e137da497a590ec9001a9918972a6246142Brian Paul};
11243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1157cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/
1167cf50e137da497a590ec9001a9918972a6246142Brian Paul/***                       GLX Visual Code                          ***/
1177cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/
1187cf50e137da497a590ec9001a9918972a6246142Brian Paul
1197cf50e137da497a590ec9001a9918972a6246142Brian Paul#define DONT_CARE -1
1207cf50e137da497a590ec9001a9918972a6246142Brian Paul
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define MAX_VISUALS 100
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual VisualTable[MAX_VISUALS];
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int NumVisuals = 0;
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * This struct and some code fragments borrowed
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * from Mark Kilgard's GLUT library.
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgtypedef struct _OverlayInfo {
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  /* Avoid 64-bit portability problems by being careful to use
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     longs due to the way XGetWindowProperty is specified. Note
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     that these parameters are passed as CARD32s over X
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     protocol. */
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  unsigned long overlay_visual;
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long transparent_type;
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long value;
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long layer;
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} OverlayInfo;
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Macro to handle c_class vs class field name in XVisualInfo struct */
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#if defined(__cplusplus) || defined(c_plusplus)
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLASS c_class
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLASS class
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Test if the given XVisualInfo is usable for Mesa rendering.
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLboolean is_usable_visual( XVisualInfo *vinfo )
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (vinfo->CLASS) {
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case StaticGray:
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GrayScale:
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Any StaticGray/GrayScale visual works in RGB or CI mode */
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_TRUE;
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case StaticColor:
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case PseudoColor:
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* Any StaticColor/PseudoColor visual of at least 4 bits */
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (vinfo->depth>=4) {
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return GL_TRUE;
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return GL_FALSE;
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case TrueColor:
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case DirectColor:
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* Any depth of TrueColor or DirectColor works in RGB mode */
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GL_TRUE;
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* This should never happen */
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GL_FALSE;
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the level (overlay, normal, underlay) of a given XVisualInfo.
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy - the X display
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         vinfo - the XVisualInfo to test
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  level of the visual:
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *             0 = normal planes
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *            >0 = overlay planes
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *            <0 = underlay planes
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int level_of_visual( Display *dpy, XVisualInfo *vinfo )
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom overlayVisualsAtom;
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OverlayInfo *overlay_info = NULL;
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int numOverlaysPerScreen;
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Status status;
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom actualType;
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int actualFormat;
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long sizeData, bytesLeft;
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * The SERVER_OVERLAY_VISUALS property on the root window contains
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * a list of overlay visuals.  Get that list now.
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (overlayVisualsAtom == None) {
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   status = XGetWindowProperty(dpy, RootWindow( dpy, vinfo->screen ),
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, 0L, (long) 10000, False,
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, &actualType, &actualFormat,
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               &sizeData, &bytesLeft,
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               (unsigned char **) &overlay_info );
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (status != Success || actualType != overlayVisualsAtom ||
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       actualFormat != 32 || sizeData < 4) {
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* something went wrong */
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XFree((void *) overlay_info);
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* search the overlay visual list for the visual ID of interest */
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   numOverlaysPerScreen = (int) (sizeData / 4);
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<numOverlaysPerScreen;i++) {
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OverlayInfo *ov;
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ov = overlay_info + i;
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ov->overlay_visual==vinfo->visualid) {
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* found the visual */
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (/*ov->transparent_type==1 &&*/ ov->layer!=0) {
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            int level = ov->layer;
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return level;
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return 0;
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* The visual ID was not found in the overlay list. */
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XFree((void *) overlay_info);
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return 0;
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Given an XVisualInfo and RGB, Double, and Depth buffer flags, save the
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * configuration in our list of GLX visuals.
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgsave_glx_visual( Display *dpy, XVisualInfo *vinfo,
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLboolean rgbFlag, GLboolean alphaFlag, GLboolean dbFlag,
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLboolean stereoFlag,
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLint depth_size, GLint stencil_size,
263b2e460018375f699198073a6167e0ee96ba1d267Brian Paul                 GLint accumRedSize, GLint accumGreenSize,
264b2e460018375f699198073a6167e0ee96ba1d267Brian Paul                 GLint accumBlueSize, GLint accumAlphaSize,
265b2e460018375f699198073a6167e0ee96ba1d267Brian Paul                 GLint level )
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean ximageFlag = GL_TRUE;
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual xmvis;
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint i;
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean comparePointers;
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (dbFlag) {
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Check if the MESA_BACK_BUFFER env var is set */
274367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      char *backbuffer = _mesa_getenv("MESA_BACK_BUFFER");
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (backbuffer) {
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (backbuffer[0]=='p' || backbuffer[0]=='P') {
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ximageFlag = GL_FALSE;
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else if (backbuffer[0]=='x' || backbuffer[0]=='X') {
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ximageFlag = GL_TRUE;
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
283d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul            _mesa_warning(NULL, "Mesa: invalid value for MESA_BACK_BUFFER environment variable, using an XImage.");
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Comparing IDs uses less memory but sometimes fails. */
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* XXX revisit this after 3.0 is finished. */
290367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_GLX_VISUAL_HACK"))
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      comparePointers = GL_TRUE;
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      comparePointers = GL_FALSE;
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* First check if a matching visual is already in the list */
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0; i<NumVisuals; i++) {
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaVisual v = VisualTable[i];
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (v->display == dpy
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && v->level == level
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && v->ximage_flag == ximageFlag
3011832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && v->mesa_visual.rgbMode == rgbFlag
3021832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && v->mesa_visual.doubleBufferMode == dbFlag
3031832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && v->mesa_visual.stereoMode == stereoFlag
3041832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.alphaBits > 0) == alphaFlag
3051832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.depthBits >= depth_size || depth_size == 0)
3061832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.stencilBits >= stencil_size || stencil_size == 0)
3071832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.accumRedBits >= accumRedSize || accumRedSize == 0)
3081832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.accumGreenBits >= accumGreenSize || accumGreenSize == 0)
3091832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.accumBlueBits >= accumBlueSize || accumBlueSize == 0)
3101832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.accumAlphaBits >= accumAlphaSize || accumAlphaSize == 0)) {
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* now either compare XVisualInfo pointers or visual IDs */
312d0247f53aea8fa8677aadc8a00f75c8993be9ebcBrian Paul         if ((!comparePointers && v->visinfo->visualid == vinfo->visualid)
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg             || (comparePointers && v->vishandle == vinfo)) {
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return v;
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Create a new visual and add it to the list. */
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
321d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul   if (NumVisuals >= MAX_VISUALS) {
322d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      _mesa_problem(NULL, "GLX Error: maximum number of visuals exceeded");
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
326c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul   xmvis = XMesaCreateVisual( dpy, vinfo, rgbFlag, alphaFlag, dbFlag,
327c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              stereoFlag, ximageFlag,
328c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              depth_size, stencil_size,
329c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              accumRedSize, accumBlueSize,
330c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              accumBlueSize, accumAlphaSize, 0, level,
331c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              GLX_NONE_EXT );
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (xmvis) {
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      VisualTable[NumVisuals] = xmvis;
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      NumVisuals++;
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return xmvis;
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create a GLX visual from a regular XVisualInfo.
343ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * This is called when Fake GLX is given an XVisualInfo which wasn't
344ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * returned by glXChooseVisual.  Since this is the first time we're
345ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * considering this visual we'll take a guess at reasonable values
346ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * for depth buffer size, stencil size, accum size, etc.
347ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * This is the best we can do with a client-side emulation of GLX.
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgcreate_glx_visual( Display *dpy, XVisualInfo *visinfo )
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int vislevel;
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   vislevel = level_of_visual( dpy, visinfo );
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vislevel) {
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Configure this visual as a CI, single-buffered overlay */
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return save_glx_visual( dpy, visinfo,
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* rgb */
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* alpha */
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* double */
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* stereo */
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              0,         /* depth bits */
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              0,         /* stencil bits */
364b2e460018375f699198073a6167e0ee96ba1d267Brian Paul                              0,0,0,0,   /* accum bits */
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              vislevel   /* level */
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                            );
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (is_usable_visual( visinfo )) {
369367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      if (_mesa_getenv("MESA_GLX_FORCE_CI")) {
3708f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         /* Configure this visual as a COLOR INDEX visual. */
3718f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         return save_glx_visual( dpy, visinfo,
3728f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,   /* rgb */
3738f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,  /* alpha */
3748f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_TRUE,   /* double */
3758f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,  /* stereo */
3768f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 DEFAULT_SOFTWARE_DEPTH_BITS,
3778f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 8 * sizeof(GLstencil),
3788f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 0 * sizeof(GLaccum), /* r */
3798f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 0 * sizeof(GLaccum), /* g */
3808f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 0 * sizeof(GLaccum), /* b */
3818f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 0 * sizeof(GLaccum), /* a */
3828f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 0          /* level */
3838f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                               );
3848f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      }
3858f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      else {
3868f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         /* Configure this visual as RGB, double-buffered, depth-buffered. */
3878f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         /* This is surely wrong for some people's needs but what else */
3888f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         /* can be done?  They should use glXChooseVisual(). */
3898f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         return save_glx_visual( dpy, visinfo,
3908f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_TRUE,   /* rgb */
3918f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,  /* alpha */
3928f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_TRUE,   /* double */
3938f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,  /* stereo */
3948f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 DEFAULT_SOFTWARE_DEPTH_BITS,
3958f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 8 * sizeof(GLstencil),
3968f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 8 * sizeof(GLaccum), /* r */
3978f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 8 * sizeof(GLaccum), /* g */
3988f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 8 * sizeof(GLaccum), /* b */
3998f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 8 * sizeof(GLaccum), /* a */
4008f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 0          /* level */
4018f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                               );
4028f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      }
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
405d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      _mesa_warning(NULL, "Mesa: error in glXCreateContext: bad visual\n");
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Find the GLX visual associated with an XVisualInfo.
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgfind_glx_visual( Display *dpy, XVisualInfo *vinfo )
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* First try to match pointers */
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<NumVisuals;i++) {
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (VisualTable[i]->display==dpy && VisualTable[i]->vishandle==vinfo) {
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return VisualTable[i];
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* try to match visual id */
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<NumVisuals;i++) {
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (VisualTable[i]->display==dpy
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && VisualTable[i]->visinfo->visualid == vinfo->visualid) {
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return VisualTable[i];
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the transparent pixel value for a GLX visual.
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  glxvis - the glx_visual
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  a pixel value or -1 if no transparent pixel
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int transparent_pixel( XMesaVisual glxvis )
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Display *dpy = glxvis->display;
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vinfo = glxvis->visinfo;
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom overlayVisualsAtom;
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OverlayInfo *overlay_info = NULL;
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int numOverlaysPerScreen;
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Status status;
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom actualType;
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int actualFormat;
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long sizeData, bytesLeft;
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * The SERVER_OVERLAY_VISUALS property on the root window contains
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * a list of overlay visuals.  Get that list now.
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (overlayVisualsAtom == None) {
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return -1;
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   status = XGetWindowProperty(dpy, RootWindow( dpy, vinfo->screen ),
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, 0L, (long) 10000, False,
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, &actualType, &actualFormat,
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               &sizeData, &bytesLeft,
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               (unsigned char **) &overlay_info );
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (status != Success || actualType != overlayVisualsAtom ||
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       actualFormat != 32 || sizeData < 4) {
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* something went wrong */
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XFree((void *) overlay_info);
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return -1;
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* search the overlay visual list for the visual ID of interest */
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   numOverlaysPerScreen = (int) (sizeData / 4);
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<numOverlaysPerScreen;i++) {
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OverlayInfo *ov;
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ov = overlay_info + i;
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ov->overlay_visual==vinfo->visualid) {
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* found it! */
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (ov->transparent_type==0) {
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* type 0 indicates no transparency */
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return -1;
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* ov->value is the transparent pixel */
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return ov->value;
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* The visual ID was not found in the overlay list. */
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XFree((void *) overlay_info);
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return -1;
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Try to get an X visual which matches the given arguments.
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *get_visual( Display *dpy, int scr,
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg			        unsigned int depth, int xclass )
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo temp, *vis;
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   long mask;
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int n;
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned int default_depth;
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int default_class;
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   mask = VisualScreenMask | VisualDepthMask | VisualClassMask;
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.screen = scr;
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.depth = depth;
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.CLASS = xclass;
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   default_depth = DefaultDepth(dpy,scr);
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   default_class = DefaultVisual(dpy,scr)->CLASS;
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (depth==default_depth && xclass==default_class) {
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* try to get root window's visual */
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      temp.visualid = DefaultVisual(dpy,scr)->visualid;
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      mask |= VisualIDMask;
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   vis = XGetVisualInfo( dpy, mask, &temp, &n );
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* In case bits/pixel > 24, make sure color channels are still <=8 bits.
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * An SGI Infinite Reality system, for example, can have 30bpp pixels:
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * 10 bits per color channel.  Mesa's limited to a max of 8 bits/channel.
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vis && depth > 24 && (xclass==TrueColor || xclass==DirectColor)) {
53871dea349d2be623b7819389428b0d6a124e8d184Brian Paul      if (_mesa_bitcount((GLuint) vis->red_mask  ) <= 8 &&
53971dea349d2be623b7819389428b0d6a124e8d184Brian Paul          _mesa_bitcount((GLuint) vis->green_mask) <= 8 &&
54071dea349d2be623b7819389428b0d6a124e8d184Brian Paul          _mesa_bitcount((GLuint) vis->blue_mask ) <= 8) {
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return vis;
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         XFree((void *) vis);
545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return vis;
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Retrieve the value of the given environment variable and find
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the X visual which matches it.
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy - the display
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         screen - the screen number
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         varname - the name of the environment variable
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  an XVisualInfo pointer to NULL if error.
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *get_env_visual(Display *dpy, int scr, const char *varname)
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   char value[100], type[100];
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int depth, xclass = -1;
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
568367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (!_mesa_getenv( varname )) {
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
572367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   _mesa_strncpy( value, _mesa_getenv(varname), 100 );
573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   value[99] = 0;
574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   sscanf( value, "%s %d", type, &depth );
576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
577367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_strcmp(type,"TrueColor")==0)          xclass = TrueColor;
578367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"DirectColor")==0)   xclass = DirectColor;
579367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"PseudoColor")==0)   xclass = PseudoColor;
580367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"StaticColor")==0)   xclass = StaticColor;
581367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"GrayScale")==0)     xclass = GrayScale;
582367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"StaticGray")==0)    xclass = StaticGray;
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (xclass>-1 && depth>0) {
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_visual( dpy, scr, depth, xclass );
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5912ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul   _mesa_warning(NULL, "GLX unable to find visual class=%s, depth=%d.",
5922ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul                 type, depth);
593d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Select an X visual which satisfies the RGBA/CI flag and minimum depth.
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy, screen - X display and screen number
602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         rgba - GL_TRUE = RGBA mode, GL_FALSE = CI mode
603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         min_depth - minimum visual depth
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         preferred_class - preferred GLX visual class or DONT_CARE
605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  pointer to an XVisualInfo or NULL.
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *choose_x_visual( Display *dpy, int screen,
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				     GLboolean rgba, int min_depth,
609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                     int preferred_class )
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
612db6aa58267cad3f502f03ab80b9deb6b75320a91Brian Paul   int xclass, visclass = 0;
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int depth;
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (rgba) {
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      Atom hp_cr_maps = XInternAtom(dpy, "_HP_RGB_SMOOTH_MAP_LIST", True);
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* First see if the MESA_RGB_VISUAL env var is defined */
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_env_visual( dpy, screen, "MESA_RGB_VISUAL" );
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Otherwise, search for a suitable visual */
623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class==DONT_CARE) {
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (xclass=0;xclass<6;xclass++) {
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            switch (xclass) {
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 0:  visclass = TrueColor;    break;
627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 1:  visclass = DirectColor;  break;
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 2:  visclass = PseudoColor;  break;
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 3:  visclass = StaticColor;  break;
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 4:  visclass = GrayScale;    break;
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 5:  visclass = StaticGray;   break;
632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (min_depth==0) {
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               /* start with shallowest */
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (depth=0;depth<=32;depth++) {
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (visclass==TrueColor && depth==8 && !hp_cr_maps) {
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* Special case:  try to get 8-bit PseudoColor before */
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* 8-bit TrueColor */
639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     vis = get_visual( dpy, screen, 8, PseudoColor );
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     if (vis) {
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                        return vis;
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     }
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  vis = get_visual( dpy, screen, depth, visclass );
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (vis) {
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     return vis;
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            else {
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               /* start with deepest */
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (depth=32;depth>=min_depth;depth--) {
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (visclass==TrueColor && depth==8 && !hp_cr_maps) {
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* Special case:  try to get 8-bit PseudoColor before */
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* 8-bit TrueColor */
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     vis = get_visual( dpy, screen, 8, PseudoColor );
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     if (vis) {
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                        return vis;
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     }
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  vis = get_visual( dpy, screen, depth, visclass );
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (vis) {
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     return vis;
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* search for a specific visual class */
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         switch (preferred_class) {
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_TRUE_COLOR_EXT:    visclass = TrueColor;    break;
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_DIRECT_COLOR_EXT:  visclass = DirectColor;  break;
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_PSEUDO_COLOR_EXT:  visclass = PseudoColor;  break;
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_COLOR_EXT:  visclass = StaticColor;  break;
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_GRAY_SCALE_EXT:    visclass = GrayScale;    break;
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_GRAY_EXT:   visclass = StaticGray;   break;
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            default:   return NULL;
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (min_depth==0) {
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* start with shallowest */
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=0;depth<=32;depth++) {
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* start with deepest */
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=32;depth>=min_depth;depth--) {
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* First see if the MESA_CI_VISUAL env var is defined */
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_env_visual( dpy, screen, "MESA_CI_VISUAL" );
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Otherwise, search for a suitable visual, starting with shallowest */
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class==DONT_CARE) {
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (xclass=0;xclass<4;xclass++) {
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            switch (xclass) {
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 0:  visclass = PseudoColor;  break;
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 1:  visclass = StaticColor;  break;
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 2:  visclass = GrayScale;    break;
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 3:  visclass = StaticGray;   break;
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* try 8-bit up through 16-bit */
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=8;depth<=16;depth++) {
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* try min_depth up to 8-bit */
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=min_depth;depth<8;depth++) {
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* search for a specific visual class */
733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         switch (preferred_class) {
734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_TRUE_COLOR_EXT:    visclass = TrueColor;    break;
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_DIRECT_COLOR_EXT:  visclass = DirectColor;  break;
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_PSEUDO_COLOR_EXT:  visclass = PseudoColor;  break;
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_COLOR_EXT:  visclass = StaticColor;  break;
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_GRAY_SCALE_EXT:    visclass = GrayScale;    break;
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_GRAY_EXT:   visclass = StaticGray;   break;
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            default:   return NULL;
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* try 8-bit up through 16-bit */
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (depth=8;depth<=16;depth++) {
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            vis = get_visual( dpy, screen, depth, visclass );
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (vis) {
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               return vis;
747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* try min_depth up to 8-bit */
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (depth=min_depth;depth<8;depth++) {
751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            vis = get_visual( dpy, screen, depth, visclass );
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (vis) {
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               return vis;
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* didn't find a visual */
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Find the deepest X over/underlay visual of at least min_depth.
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy, screen - X display and screen number
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         level - the over/underlay level
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         trans_type - transparent pixel type: GLX_NONE_EXT,
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                      GLX_TRANSPARENT_RGB_EXT, GLX_TRANSPARENT_INDEX_EXT,
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                      or DONT_CARE
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         trans_value - transparent pixel value or DONT_CARE
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         min_depth - minimum visual depth
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         preferred_class - preferred GLX visual class or DONT_CARE
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  pointer to an XVisualInfo or NULL.
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *choose_x_overlay_visual( Display *dpy, int scr,
77842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul                                             GLboolean rgbFlag,
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                             int level, int trans_type,
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                             int trans_value,
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                             int min_depth,
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                             int preferred_class )
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom overlayVisualsAtom;
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OverlayInfo *overlay_info;
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int numOverlaysPerScreen;
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Status status;
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom actualType;
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int actualFormat;
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long sizeData, bytesLeft;
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *deepvis;
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int deepest;
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*DEBUG int tt, tv; */
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (preferred_class) {
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRUE_COLOR_EXT:    preferred_class = TrueColor;    break;
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DIRECT_COLOR_EXT:  preferred_class = DirectColor;  break;
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_PSEUDO_COLOR_EXT:  preferred_class = PseudoColor;  break;
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STATIC_COLOR_EXT:  preferred_class = StaticColor;  break;
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_GRAY_SCALE_EXT:    preferred_class = GrayScale;    break;
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STATIC_GRAY_EXT:   preferred_class = StaticGray;   break;
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:                    preferred_class = DONT_CARE;
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * The SERVER_OVERLAY_VISUALS property on the root window contains
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * a list of overlay visuals.  Get that list now.
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (overlayVisualsAtom == (Atom) None) {
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   status = XGetWindowProperty(dpy, RootWindow( dpy, scr ),
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, 0L, (long) 10000, False,
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, &actualType, &actualFormat,
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               &sizeData, &bytesLeft,
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               (unsigned char **) &overlay_info );
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (status != Success || actualType != overlayVisualsAtom ||
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       actualFormat != 32 || sizeData < 4) {
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* something went wrong */
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Search for the deepest overlay which satisifies all criteria. */
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   deepest = min_depth;
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   deepvis = NULL;
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   numOverlaysPerScreen = (int) (sizeData / 4);
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<numOverlaysPerScreen;i++) {
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XVisualInfo *vislist, vistemplate;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      int count;
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OverlayInfo *ov;
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ov = overlay_info + i;
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ov->layer!=level) {
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed overlay level criteria */
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!(trans_type==DONT_CARE
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            || (trans_type==GLX_TRANSPARENT_INDEX_EXT
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                && ov->transparent_type>0)
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            || (trans_type==GLX_NONE_EXT && ov->transparent_type==0))) {
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed transparent pixel type criteria */
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (trans_value!=DONT_CARE && trans_value!=ov->value) {
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed transparent pixel value criteria */
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* get XVisualInfo and check the depth */
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vistemplate.visualid = ov->overlay_visual;
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vistemplate.screen = scr;
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vislist = XGetVisualInfo( dpy, VisualIDMask | VisualScreenMask,
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                &vistemplate, &count );
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (count!=1) {
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* something went wrong */
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class!=DONT_CARE && preferred_class!=vislist->CLASS) {
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* wrong visual class */
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
87042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      /* if RGB was requested, make sure we have True/DirectColor */
87142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (rgbFlag && vislist->CLASS != TrueColor
87242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul          && vislist->CLASS != DirectColor)
87342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         continue;
87442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul
87542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      /* if CI was requested, make sure we have a color indexed visual */
87642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (!rgbFlag
87742f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul          && (vislist->CLASS == TrueColor || vislist->CLASS == DirectColor))
87842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         continue;
87942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (deepvis==NULL || vislist->depth > deepest) {
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* YES!  found a satisfactory visual */
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (deepvis) {
88380af3614d88c0cac160e787de7f34b37e96cb626Brian Paul            XFree( deepvis );
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         deepest = vislist->depth;
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         deepvis = vislist;
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* DEBUG  tt = ov->transparent_type;*/
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* DEBUG  tv = ov->value; */
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*DEBUG
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (deepvis) {
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      printf("chose 0x%x:  layer=%d depth=%d trans_type=%d trans_value=%d\n",
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg             deepvis->visualid, level, deepvis->depth, tt, tv );
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg*/
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return deepvis;
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9027cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/
9037cf50e137da497a590ec9001a9918972a6246142Brian Paul/***                  Begin Fake GLX API Functions                  ***/
9047cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/
9057cf50e137da497a590ec9001a9918972a6246142Brian Paul
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9073265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paulstatic XMesaVisual choose_visual( Display *dpy, int screen, const int *list )
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
9093265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   const int *parselist;
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int min_ci = 0;
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int min_red=0, min_green=0, min_blue=0;
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean rgb_flag = GL_FALSE;
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean alpha_flag = GL_FALSE;
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean double_flag = GL_FALSE;
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean stereo_flag = GL_FALSE;
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint depth_size = 0;
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint stencil_size = 0;
919b2e460018375f699198073a6167e0ee96ba1d267Brian Paul   GLint accumRedSize = 0;
920b2e460018375f699198073a6167e0ee96ba1d267Brian Paul   GLint accumGreenSize = 0;
921b2e460018375f699198073a6167e0ee96ba1d267Brian Paul   GLint accumBlueSize = 0;
922b2e460018375f699198073a6167e0ee96ba1d267Brian Paul   GLint accumAlphaSize = 0;
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int level = 0;
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int visual_type = DONT_CARE;
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int trans_type = DONT_CARE;
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int trans_value = DONT_CARE;
927e1210b176926349b258c7ec77b7f36716025c82aBrian Paul   GLint caveat = DONT_CARE;
9283265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual xmvis = NULL;
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   parselist = list;
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   while (*parselist) {
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      switch (*parselist) {
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_USE_GL:
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* ignore */
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_BUFFER_SIZE:
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_ci = *parselist++;
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_LEVEL:
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            level = *parselist++;
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_RGBA:
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    rgb_flag = GL_TRUE;
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_DOUBLEBUFFER:
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    double_flag = GL_TRUE;
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_STEREO:
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            stereo_flag = GL_TRUE;
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return NULL;
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_AUX_BUFFERS:
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* ignore */
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_RED_SIZE:
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_red = *parselist++;
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_GREEN_SIZE:
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_green = *parselist++;
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_BLUE_SIZE:
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_blue = *parselist++;
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ALPHA_SIZE:
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            {
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLint size = *parselist++;
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               alpha_flag = size>0 ? 1 : 0;
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_DEPTH_SIZE:
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    depth_size = *parselist++;
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_STENCIL_SIZE:
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    stencil_size = *parselist++;
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_RED_SIZE:
991b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	    parselist++;
992b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            {
993b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               GLint size = *parselist++;
994b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               accumRedSize = MAX2( accumRedSize, size );
995b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            }
996b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            break;
997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_GREEN_SIZE:
998b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	    parselist++;
999b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            {
1000b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               GLint size = *parselist++;
1001b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               accumGreenSize = MAX2( accumGreenSize, size );
1002b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            }
1003b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            break;
1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_BLUE_SIZE:
1005b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	    parselist++;
1006b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            {
1007b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               GLint size = *parselist++;
1008b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               accumBlueSize = MAX2( accumBlueSize, size );
1009b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            }
1010b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            break;
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_ALPHA_SIZE:
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            {
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLint size = *parselist++;
1015b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               accumAlphaSize = MAX2( accumAlphaSize, size );
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /*
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          * GLX_EXT_visual_info extension
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          */
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_X_VISUAL_TYPE_EXT:
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            visual_type = *parselist++;
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_TYPE_EXT:
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            trans_type = *parselist++;
1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_INDEX_VALUE_EXT:
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            trans_value = *parselist++;
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_RED_VALUE_EXT:
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_GREEN_VALUE_EXT:
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_BLUE_VALUE_EXT:
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_ALPHA_VALUE_EXT:
1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* ignore */
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
10425e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
1043e1210b176926349b258c7ec77b7f36716025c82aBrian Paul         /*
1044e1210b176926349b258c7ec77b7f36716025c82aBrian Paul          * GLX_EXT_visual_info extension
1045e1210b176926349b258c7ec77b7f36716025c82aBrian Paul          */
1046e1210b176926349b258c7ec77b7f36716025c82aBrian Paul         case GLX_VISUAL_CAVEAT_EXT:
1047e1210b176926349b258c7ec77b7f36716025c82aBrian Paul            parselist++;
1048e1210b176926349b258c7ec77b7f36716025c82aBrian Paul            caveat = *parselist++; /* ignored for now */
1049e1210b176926349b258c7ec77b7f36716025c82aBrian Paul            break;
1050e1210b176926349b258c7ec77b7f36716025c82aBrian Paul
10513265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         /*
105266ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul          * GLX_ARB_multisample
105366ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul          */
105466ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul         case GLX_SAMPLE_BUFFERS_ARB:
105566ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul            /* ms not supported */
105666ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul            return NULL;
105766ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul         case GLX_SAMPLES_ARB:
105866ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul            /* ms not supported */
105966ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul            return NULL;
106066ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul
106166ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul         /*
10623265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul          * FBConfig attribs.
10633265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul          */
10643265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         case GLX_RENDER_TYPE:
10653265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            parselist++;
10663265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            if (*parselist == GLX_RGBA_BIT) {
10673265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul               rgb_flag = GL_TRUE;
10683265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            }
10693265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            else if (*parselist == GLX_COLOR_INDEX_BIT) {
10703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul               rgb_flag = GL_FALSE;
10713265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            }
10723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            else if (*parselist == 0) {
10733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul               rgb_flag = GL_TRUE;
10743265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            }
10753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            parselist++;
10763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            break;
10773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         case GLX_DRAWABLE_TYPE:
10783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            parselist++;
10793265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            if (*parselist & ~(GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT)) {
10803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul               return NULL; /* bad bit */
10813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            }
10823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            parselist++;
10833265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            break;
10843265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case None:
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
10873265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 default:
1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* undefined attribute */
10902ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL, "unexpected attrib 0x%x in choose_visual()",
10912ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul                          *parselist);
1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return NULL;
1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * Since we're only simulating the GLX extension this function will never
1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * find any real GL visuals.  Instead, all we can do is try to find an RGB
1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * or CI visual of appropriate depth.  Other requested attributes such as
1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * double buffering, depth buffer, etc. will be associated with the X
1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * visual and stored in the VisualTable[].
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (level==0) {
1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* normal color planes */
1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (rgb_flag) {
1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Get an RGB visual */
1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         int min_rgb = min_red + min_green + min_blue;
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (min_rgb>1 && min_rgb<8) {
1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* a special case to be sure we can get a monochrome visual */
1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            min_rgb = 1;
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         vis = choose_x_visual( dpy, screen, rgb_flag, min_rgb, visual_type );
1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Get a color index visual */
1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         vis = choose_x_visual( dpy, screen, rgb_flag, min_ci, visual_type );
1117b2e460018375f699198073a6167e0ee96ba1d267Brian Paul         accumRedSize = accumGreenSize = accumBlueSize = accumAlphaSize = 0;
1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* over/underlay planes */
112242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (rgb_flag) {
112342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         /* rgba overlay */
112442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         int min_rgb = min_red + min_green + min_blue;
112542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         if (min_rgb>1 && min_rgb<8) {
112642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul            /* a special case to be sure we can get a monochrome visual */
112742f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul            min_rgb = 1;
112842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         }
112942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level,
113042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul                              trans_type, trans_value, min_rgb, visual_type );
113142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      }
113242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      else {
113342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         /* color index overlay */
113442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level,
113542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul                              trans_type, trans_value, min_ci, visual_type );
113642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      }
1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vis) {
1140ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      /* Note: we're not exactly obeying the glXChooseVisual rules here.
1141ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul       * When GLX_DEPTH_SIZE = 1 is specified we're supposed to choose the
11422c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul       * largest depth buffer size, which is 32bits/value.  Instead, we
1143ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul       * return 16 to maintain performance with earlier versions of Mesa.
1144ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul       */
11452c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul      if (depth_size > 24)
11462c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul         depth_size = 31;   /* 32 causes int overflow problems */
1147ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      else if (depth_size > 16)
1148ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul         depth_size = 24;
11492c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul      else if (depth_size > 0)
11502c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul         depth_size = DEFAULT_SOFTWARE_DEPTH_BITS; /*16*/
11512c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul
1152ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      /* we only support one size of stencil and accum buffers. */
1153ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      if (stencil_size > 0)
1154ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul         stencil_size = STENCIL_BITS;
11556d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul      if (accumRedSize > 0 || accumGreenSize > 0 || accumBlueSize > 0 ||
11566d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul          accumAlphaSize > 0) {
1157b2e460018375f699198073a6167e0ee96ba1d267Brian Paul         accumRedSize = ACCUM_BITS;
1158b2e460018375f699198073a6167e0ee96ba1d267Brian Paul         accumGreenSize = ACCUM_BITS;
1159b2e460018375f699198073a6167e0ee96ba1d267Brian Paul         accumBlueSize = ACCUM_BITS;
11606d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul         accumAlphaSize = alpha_flag ? ACCUM_BITS : 0;
11616d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul      }
11626d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul
11633265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      xmvis = save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
11643265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                               stereo_flag, depth_size, stencil_size,
11653265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                               accumRedSize, accumGreenSize,
11663265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                               accumBlueSize, accumAlphaSize, level );
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11693265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return xmvis;
1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paulstatic XVisualInfo *
11743265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXChooseVisual( Display *dpy, int screen, int *list )
11753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul{
11763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual xmvis = choose_visual(dpy, screen, list);
11773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   if (xmvis)
11783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      return xmvis->vishandle;
11793265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   else
11803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      return NULL;
11813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul}
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1184426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXContext
1185426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateContext( Display *dpy, XVisualInfo *visinfo,
1186426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       GLXContext share_list, Bool direct )
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1188e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis;
11897cf50e137da497a590ec9001a9918972a6246142Brian Paul   struct fake_glx_context *glxCtx;
11905e1680ce1d8296b2182e8909856927bbeddf3b95Brian Paul   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
119199aab341998e84d9fa208c525cae8021b3845812Brian Paul
119299aab341998e84d9fa208c525cae8021b3845812Brian Paul   if (!dpy || !visinfo)
119399aab341998e84d9fa208c525cae8021b3845812Brian Paul      return 0;
119499aab341998e84d9fa208c525cae8021b3845812Brian Paul
11957cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx = CALLOC_STRUCT(fake_glx_context);
11967cf50e137da497a590ec9001a9918972a6246142Brian Paul   if (!glxCtx)
11977cf50e137da497a590ec9001a9918972a6246142Brian Paul      return 0;
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* deallocate unused windows/buffers */
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaGarbageCollect();
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1202e4656003caee346d9c4eb23256d73409271291a7Brian Paul   xmvis = find_glx_visual( dpy, visinfo );
1203e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmvis) {
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* This visual wasn't found with glXChooseVisual() */
1205e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmvis = create_glx_visual( dpy, visinfo );
1206e4656003caee346d9c4eb23256d73409271291a7Brian Paul      if (!xmvis) {
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
12087cf50e137da497a590ec9001a9918972a6246142Brian Paul         FREE(glxCtx);
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1213e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->xmesaContext = XMesaCreateContext(xmvis,
12145e1680ce1d8296b2182e8909856927bbeddf3b95Brian Paul                                   shareCtx ? shareCtx->xmesaContext : NULL);
12157cf50e137da497a590ec9001a9918972a6246142Brian Paul   if (!glxCtx->xmesaContext) {
12167cf50e137da497a590ec9001a9918972a6246142Brian Paul      FREE(glxCtx);
12177cf50e137da497a590ec9001a9918972a6246142Brian Paul      return NULL;
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12197cf50e137da497a590ec9001a9918972a6246142Brian Paul
12207cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx->xmesaContext->direct = GL_FALSE;
12217cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx->glxContext.isDirect = GL_FALSE;
12227cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx->glxContext.currentDpy = dpy;
12237cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
12247cf50e137da497a590ec9001a9918972a6246142Brian Paul
12257cf50e137da497a590ec9001a9918972a6246142Brian Paul   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
12267cf50e137da497a590ec9001a9918972a6246142Brian Paul
12277cf50e137da497a590ec9001a9918972a6246142Brian Paul   return (GLXContext) glxCtx;
1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
12317cf50e137da497a590ec9001a9918972a6246142Brian Paul/* XXX these may have to be removed due to thread-safety issues. */
1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLXContext MakeCurrent_PrevContext = 0;
1233086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic GLXDrawable MakeCurrent_PrevDrawable = 0;
1234086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic GLXDrawable MakeCurrent_PrevReadable = 0;
1235086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic XMesaBuffer MakeCurrent_PrevDrawBuffer = 0;
1236086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic XMesaBuffer MakeCurrent_PrevReadBuffer = 0;
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
12387cf50e137da497a590ec9001a9918972a6246142Brian Paul
1239086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul/* GLX 1.3 and later */
1240426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1241426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
12427a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell                            GLXDrawable read, GLXContext ctx )
1243086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul{
12447cf50e137da497a590ec9001a9918972a6246142Brian Paul   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
12457cf50e137da497a590ec9001a9918972a6246142Brian Paul
12467a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (ctx && draw && read) {
1247086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      XMesaBuffer drawBuffer, readBuffer;
12487cf50e137da497a590ec9001a9918972a6246142Brian Paul      XMesaContext xmctx = glxCtx->xmesaContext;
1249086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1250086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'draw' */
12517a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell      if (ctx == MakeCurrent_PrevContext
12527a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell          && draw == MakeCurrent_PrevDrawable) {
1253086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         drawBuffer = MakeCurrent_PrevDrawBuffer;
1254086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1255086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      else {
1256086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         drawBuffer = XMesaFindBuffer( dpy, draw );
1257086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1258086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      if (!drawBuffer) {
1259086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         /* drawable must be a new window! */
12607cf50e137da497a590ec9001a9918972a6246142Brian Paul         drawBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, draw, xmctx);
1261086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         if (!drawBuffer) {
1262086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            /* Out of memory, or context/drawable depth mismatch */
1263086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            return False;
1264086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         }
1265086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1266086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1267086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'read' */
12687a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell      if (ctx == MakeCurrent_PrevContext
1269086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul          && read == MakeCurrent_PrevReadable) {
1270086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         readBuffer = MakeCurrent_PrevReadBuffer;
1271086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1272086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      else {
1273086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         readBuffer = XMesaFindBuffer( dpy, read );
1274086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1275086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      if (!readBuffer) {
1276086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         /* drawable must be a new window! */
12777cf50e137da497a590ec9001a9918972a6246142Brian Paul         readBuffer = XMesaCreateWindowBuffer2(glxCtx->xmesaContext->xm_visual,
12787cf50e137da497a590ec9001a9918972a6246142Brian Paul                                               read, xmctx);
1279086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         if (!readBuffer) {
1280086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            /* Out of memory, or context/drawable depth mismatch */
1281086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            return False;
1282086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         }
1283086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1284086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
12857a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell      MakeCurrent_PrevContext = ctx;
1286086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawable = draw;
1287086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadable = read;
1288086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawBuffer = drawBuffer;
1289086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadBuffer = readBuffer;
1290086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1291086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Now make current! */
12927cf50e137da497a590ec9001a9918972a6246142Brian Paul      if (XMesaMakeCurrent2(xmctx, drawBuffer, readBuffer)) {
129312c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul         ((__GLXcontext *) ctx)->currentDpy = dpy;
129412c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul         ((__GLXcontext *) ctx)->currentDrawable = draw;
12958d687e7e58a148f3f16573636023e54755372010Brian Paul#ifndef GLX_BUILT_IN_XMESA
129612c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul         ((__GLXcontext *) ctx)->currentReadable = read;
12978d687e7e58a148f3f16573636023e54755372010Brian Paul#else
12987cf50e137da497a590ec9001a9918972a6246142Brian Paul         __glXSetCurrentContext(ctx);
12997cf50e137da497a590ec9001a9918972a6246142Brian Paul#endif
13007cf50e137da497a590ec9001a9918972a6246142Brian Paul         return True;
13017cf50e137da497a590ec9001a9918972a6246142Brian Paul      }
13027cf50e137da497a590ec9001a9918972a6246142Brian Paul      else {
13037cf50e137da497a590ec9001a9918972a6246142Brian Paul         return False;
13047cf50e137da497a590ec9001a9918972a6246142Brian Paul      }
1305086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
13067a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   else if (!ctx && !draw && !read) {
1307086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* release current context w/out assigning new one. */
1308086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      XMesaMakeCurrent( NULL, NULL );
1309086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevContext = 0;
1310086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawable = 0;
1311086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadable = 0;
1312086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawBuffer = 0;
1313086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadBuffer = 0;
131484cac8441fcf5f692cd220e9fa86cab398a4c159Brian Paul#ifdef GLX_BUILT_IN_XMESA
1315b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul      /* XXX bind dummy context with __glXSetCurrentContext(ctx); */
1316b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#endif
1317086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      return True;
1318086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
1319086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   else {
1320086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* The args must either all be non-zero or all zero.
1321086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul       * This is an error.
1322086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul       */
1323086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      return False;
1324086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
1325086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul}
1326086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1327086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1328426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1329426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1330426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
1331426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1332426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return Fake_glXMakeContextCurrent( dpy, drawable, drawable, ctx );
1333426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1334426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1335426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1336426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1337426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
1338426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual v;
1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b;
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   v = find_glx_visual( dpy, visinfo );
1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!v) {
1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      v = create_glx_visual( dpy, visinfo );
1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!v) {
1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!b) {
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return b->frontbuffer;
1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1360b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_pixmap_colormap ***/
1361b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul
1362426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
1363426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
1364426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                             Pixmap pixmap, Colormap cmap )
1365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual v;
1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b;
1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   v = find_glx_visual( dpy, visinfo );
1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!v) {
1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      v = create_glx_visual( dpy, visinfo );
1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!v) {
1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   b = XMesaCreatePixmapBuffer( v, pixmap, cmap );
1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!b) {
1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return b->frontbuffer;
1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1386426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1387426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b = XMesaFindBuffer(dpy, pixmap);
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (b) {
1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaDestroyBuffer(b);
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1393367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_getenv("MESA_DEBUG")) {
1394d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      _mesa_warning(NULL, "Mesa: glXDestroyGLXPixmap: invalid pixmap\n");
1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
13994c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul
1400426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1401426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
14023994b77bab8c62a4c1a4dffdfba233ef46662b99Brian Paul                     unsigned long mask )
1403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
140483b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul   struct fake_glx_context *fakeSrc = (struct fake_glx_context *) src;
140583b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul   struct fake_glx_context *fakeDst = (struct fake_glx_context *) dst;
140683b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul   XMesaContext xm_src = fakeSrc->xmesaContext;
140783b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul   XMesaContext xm_dst = fakeDst->xmesaContext;
1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
14097a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   _mesa_copy_context( xm_src->gl_ctx, xm_dst->gl_ctx, (GLuint) mask );
1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1414426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1415426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryExtension( Display *dpy, int *errorb, int *event )
1416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Mesa's GLX isn't really an X extension but we try to act like one. */
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) errorb;
1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) event;
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return True;
1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1425e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paulextern void _kw_ungrab_all( Display *dpy );
1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid _kw_ungrab_all( Display *dpy )
1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XUngrabPointer( dpy, CurrentTime );
1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XUngrabKeyboard( dpy, CurrentTime );
1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1433426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1434426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyContext( Display *dpy, GLXContext ctx )
1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
14367cf50e137da497a590ec9001a9918972a6246142Brian Paul   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   MakeCurrent_PrevContext = 0;
1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   MakeCurrent_PrevDrawable = 0;
1440086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevReadable = 0;
1441086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevDrawBuffer = 0;
1442086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevReadBuffer = 0;
14437cf50e137da497a590ec9001a9918972a6246142Brian Paul   XMesaDestroyContext( glxCtx->xmesaContext );
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaGarbageCollect();
1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1449426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1450426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXIsDirect( Display *dpy, GLXContext ctx )
1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
14527cf50e137da497a590ec9001a9918972a6246142Brian Paul   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
14547cf50e137da497a590ec9001a9918972a6246142Brian Paul   return glxCtx->xmesaContext->direct;
1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1459426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1460426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSwapBuffers( Display *dpy, GLXDrawable drawable )
1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (buffer) {
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaSwapBuffers(buffer);
1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1467367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_getenv("MESA_DEBUG")) {
1468d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      _mesa_warning(NULL, "Mesa: glXSwapBuffers: invalid drawable\n");
1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14734c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul
1474b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_copy_sub_buffer ***/
1475b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul
1476426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1477426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
1478426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                           int x, int y, int width, int height )
1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (buffer) {
1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaCopySubBuffer(buffer, x, y, width, height);
1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1484367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_getenv("MESA_DEBUG")) {
1485d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      _mesa_warning(NULL, "Mesa: glXCopySubBufferMESA: invalid drawable\n");
1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1491426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1492426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryVersion( Display *dpy, int *maj, int *min )
1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Return GLX version, not Mesa version */
149678fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   assert(CLIENT_MAJOR_VERSION == SERVER_MAJOR_VERSION);
149778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   *maj = CLIENT_MAJOR_VERSION;
149878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   *min = MIN2( CLIENT_MINOR_VERSION, SERVER_MINOR_VERSION );
1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return True;
1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Query the GLX attributes of the given XVisualInfo.
1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1507426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1508e4656003caee346d9c4eb23256d73409271291a7Brian Paulget_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig )
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1510e4656003caee346d9c4eb23256d73409271291a7Brian Paul   ASSERT(xmvis);
1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch(attrib) {
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_USE_GL:
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = (int) True;
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_BUFFER_SIZE:
1516e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->visinfo->depth;
1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_LEVEL:
1519e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->level;
1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_RGBA:
1522e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 if (xmvis->mesa_visual.rgbMode) {
1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    *value = True;
1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    *value = False;
1527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DOUBLEBUFFER:
1530e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = (int) xmvis->mesa_visual.doubleBufferMode;
1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STEREO:
1533e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = (int) xmvis->mesa_visual.stereoMode;
1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_AUX_BUFFERS:
1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 *value = (int) False;
1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_RED_SIZE:
1539e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.redBits;
1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_GREEN_SIZE:
1542e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.greenBits;
1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_BLUE_SIZE:
1545e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.blueBits;
1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ALPHA_SIZE:
1548e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.alphaBits;
1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DEPTH_SIZE:
1551e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.depthBits;
1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STENCIL_SIZE:
1554e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->mesa_visual.stencilBits;
1555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_RED_SIZE:
1557e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->mesa_visual.accumRedBits;
1558b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	 return 0;
1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_GREEN_SIZE:
1560e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->mesa_visual.accumGreenBits;
1561b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	 return 0;
1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_BLUE_SIZE:
1563e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->mesa_visual.accumBlueBits;
1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_ALPHA_SIZE:
1566e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.accumAlphaBits;
1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /*
1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       * GLX_EXT_visual_info extension
1571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       */
1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_X_VISUAL_TYPE_EXT:
1573e4656003caee346d9c4eb23256d73409271291a7Brian Paul         switch (xmvis->visinfo->CLASS) {
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case StaticGray:   *value = GLX_STATIC_GRAY_EXT;   return 0;
1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GrayScale:    *value = GLX_GRAY_SCALE_EXT;    return 0;
1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case StaticColor:  *value = GLX_STATIC_GRAY_EXT;   return 0;
1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case PseudoColor:  *value = GLX_PSEUDO_COLOR_EXT;  return 0;
1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case TrueColor:    *value = GLX_TRUE_COLOR_EXT;    return 0;
1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case DirectColor:  *value = GLX_DIRECT_COLOR_EXT;  return 0;
1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_TYPE_EXT:
1583e4656003caee346d9c4eb23256d73409271291a7Brian Paul         if (xmvis->level==0) {
1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* normal planes */
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *value = GLX_NONE_EXT;
1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1587e4656003caee346d9c4eb23256d73409271291a7Brian Paul         else if (xmvis->level>0) {
1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* overlay */
1589e4656003caee346d9c4eb23256d73409271291a7Brian Paul            if (xmvis->mesa_visual.rgbMode) {
1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = GLX_TRANSPARENT_RGB_EXT;
1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            else {
1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = GLX_TRANSPARENT_INDEX_EXT;
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1596e4656003caee346d9c4eb23256d73409271291a7Brian Paul         else if (xmvis->level<0) {
1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* underlay */
1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *value = GLX_NONE_EXT;
1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_INDEX_VALUE_EXT:
1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         {
1603e4656003caee346d9c4eb23256d73409271291a7Brian Paul            int pixel = transparent_pixel( xmvis );
1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (pixel>=0) {
1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = pixel;
1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* else undefined */
1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_RED_VALUE_EXT:
1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_GREEN_VALUE_EXT:
1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_BLUE_VALUE_EXT:
1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_ALPHA_VALUE_EXT:
1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /*
1624b2e460018375f699198073a6167e0ee96ba1d267Brian Paul       * GLX_EXT_visual_info extension
1625b2e460018375f699198073a6167e0ee96ba1d267Brian Paul       */
1626b2e460018375f699198073a6167e0ee96ba1d267Brian Paul      case GLX_VISUAL_CAVEAT_EXT:
1627fc68be6b111473a0bf8f991468f973bb9dd275f4Brian Paul         /* test for zero, just in case */
1628e4656003caee346d9c4eb23256d73409271291a7Brian Paul         if (xmvis->VisualCaveat > 0)
1629e4656003caee346d9c4eb23256d73409271291a7Brian Paul            *value = xmvis->VisualCaveat;
1630962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul         else
1631962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul            *value = GLX_NONE_EXT;
1632962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul         return 0;
1633b2e460018375f699198073a6167e0ee96ba1d267Brian Paul
1634b2e460018375f699198073a6167e0ee96ba1d267Brian Paul      /*
163566ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul       * GLX_ARB_multisample
1636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       */
163766ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul      case GLX_SAMPLE_BUFFERS_ARB:
16383265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *value = 0;
16393265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         return 0;
164066ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul      case GLX_SAMPLES_ARB:
16413265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *value = 0;
16423265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         return 0;
16433265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
16443265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      /*
16453265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul       * For FBConfigs:
16463265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul       */
16473265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_SCREEN_EXT:
16483265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16493265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1650e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->visinfo->screen;
16513265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16523265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_DRAWABLE_TYPE: /*SGIX too */
16533265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16543265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
16553265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *value = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
16563265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16573265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_RENDER_TYPE_SGIX:
16583265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16593265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1660e4656003caee346d9c4eb23256d73409271291a7Brian Paul         if (xmvis->mesa_visual.rgbMode)
16613265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            *value = GLX_RGBA_BIT;
16623265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         else
16633265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            *value = GLX_COLOR_INDEX_BIT;
16643265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16653265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_X_RENDERABLE_SGIX:
16663265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16673265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
16683265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *value = True; /* XXX really? */
16693265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_FBCONFIG_ID_SGIX:
16713265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1673e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->vishandle->visualid;
16743265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_MAX_PBUFFER_WIDTH:
16763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
16783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         /* XXX or MAX_WIDTH? */
1679e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = DisplayWidth(xmvis->display, xmvis->vishandle->screen);
16803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_MAX_PBUFFER_HEIGHT:
16823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16833265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1684e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = DisplayHeight(xmvis->display, xmvis->vishandle->screen);
16853265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16863265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_MAX_PBUFFER_PIXELS:
16873265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16883265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1689e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = DisplayWidth(xmvis->display, xmvis->vishandle->screen) *
1690e4656003caee346d9c4eb23256d73409271291a7Brian Paul                  DisplayHeight(xmvis->display, xmvis->vishandle->screen);
16913265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16923265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_VISUAL_ID:
16933265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
16943265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1695e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->vishandle->visualid;
16963265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
16973265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GLX_BAD_ATTRIBUTE;
1700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
17013265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return Success;
1702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17053265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paulstatic int
17063265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
17073265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                   int attrib, int *value )
17083265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul{
1709e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis;
17103265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1711e4656003caee346d9c4eb23256d73409271291a7Brian Paul   xmvis = find_glx_visual( dpy, visinfo );
1712e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmvis) {
17133265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      /* this visual wasn't obtained with glXChooseVisual */
1714e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmvis = create_glx_visual( dpy, visinfo );
1715e4656003caee346d9c4eb23256d73409271291a7Brian Paul      if (!xmvis) {
17163265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 /* this visual can't be used for GL rendering */
17173265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 if (attrib==GLX_USE_GL) {
17183265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	    *value = (int) False;
17193265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	    return 0;
17203265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 }
17213265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 else {
17223265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	    return GLX_BAD_VISUAL;
17233265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 }
17243265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
17253265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   }
17263265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1727e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return get_config(xmvis, attrib, value, GL_FALSE);
17283265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul}
17293265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1731426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1732426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitGL( void )
1733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xmesa = XMesaGetCurrentContext();
1735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaFlush( xmesa );
1736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1740426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1741426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitX( void )
1742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xmesa = XMesaGetCurrentContext();
1744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaFlush( xmesa );
1745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1748e4656003caee346d9c4eb23256d73409271291a7Brian Paulstatic const char *
1749e4656003caee346d9c4eb23256d73409271291a7Brian Paulget_extensions( void )
175043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul{
175143c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul#ifdef FX
1752367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   const char *fx = _mesa_getenv("MESA_GLX_FX");
175343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   if (fx && fx[0] != 'd') {
1754e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return EXTENSIONS;
175543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   }
175643c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul#endif
1757e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return EXTENSIONS + 23; /* skip "GLX_MESA_set_3dfx_mode" */
175843c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul}
1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1763426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1764426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryExtensionsString( Display *dpy, int screen )
1765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) screen;
176843c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   return get_extensions();
1769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1774426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1775426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryServerString( Display *dpy, int screen, int name )
1776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
177778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   static char version[1000];
17782ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul   _mesa_sprintf(version, "%d.%d %s",
17792ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul                 SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION, MESA_GLX_VERSION);
1780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) screen;
1783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_EXTENSIONS:
178643c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul         return get_extensions();
1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VENDOR:
178878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul	 return VENDOR;
1789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VERSION:
1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return version;
1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1799426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1800426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetClientString( Display *dpy, int name )
1801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
180278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   static char version[1000];
18032ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul   _mesa_sprintf(version, "%d.%d %s", CLIENT_MAJOR_VERSION,
18042ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul                 CLIENT_MINOR_VERSION, MESA_GLX_VERSION);
1805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_EXTENSIONS:
181043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul         return get_extensions();
1811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VENDOR:
181278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul	 return VENDOR;
1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VERSION:
1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return version;
1815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1822426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul/*
1823426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul * GLX 1.3 and later
1824426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul */
1825426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
18267d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
18275605798e56ca6e9f968623f33b58ee7ca90594afBrian Paulstatic GLXFBConfig *
1828426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXChooseFBConfig( Display *dpy, int screen,
1829426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                        const int *attribList, int *nitems )
1830426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
18313265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual xmvis = choose_visual(dpy, screen, attribList);
18323265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   if (xmvis) {
18333c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul      GLXFBConfig *config = _mesa_malloc(sizeof(XMesaVisual));
18343265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      if (!config) {
18353265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *nitems = 0;
18363265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         return NULL;
18373265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
18383265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      *nitems = 1;
18393265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      config[0] = (GLXFBConfig) xmvis;
18403265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      return (GLXFBConfig *) config;
18413265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   }
18423265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   else {
18433265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      *nitems = 0;
18443265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      return NULL;
18453265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   }
1846426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1847426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1848426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1849426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1850426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
1851426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                           int attribute, int *value )
1852426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
18533265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual v = (XMesaVisual) config;
1854426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1855426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
18567d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
18577d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!dpy || !config || !value)
18587d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return -1;
18597d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
18603265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return get_config(v, attribute, value, GL_TRUE);
1861426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1862426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1863426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
18645605798e56ca6e9f968623f33b58ee7ca90594afBrian Paulstatic GLXFBConfig *
18655605798e56ca6e9f968623f33b58ee7ca90594afBrian PaulFake_glXGetFBConfigs( Display *dpy, int screen, int *nelements )
18665605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul{
18673265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XVisualInfo *visuals, visTemplate;
18683265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   const long visMask = VisualScreenMask;
18693265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   int i;
18703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
18713265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   /* Get list of all X visuals */
18723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   visTemplate.screen = screen;
18733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   visuals = XGetVisualInfo(dpy, visMask, &visTemplate, nelements);
18743265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   if (*nelements > 0) {
18753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      XMesaVisual *results;
18763c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul      results = _mesa_malloc(*nelements * sizeof(XMesaVisual));
18773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      if (!results) {
18783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *nelements = 0;
18793265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         return NULL;
18803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
18813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      for (i = 0; i < *nelements; i++) {
18823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         results[i] = create_glx_visual(dpy, visuals + i);
18833265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
18843265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      return (GLXFBConfig *) results;
18853265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   }
18863265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return NULL;
18875605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul}
18885605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul
18895605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul
1890426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic XVisualInfo *
1891426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
1892426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
18937d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (dpy && config) {
18947d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      XMesaVisual v = (XMesaVisual) config;
18957d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return v->vishandle;
18967d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
18977d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   else {
18987d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return NULL;
18997d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
1900426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1901426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1902426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1903426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXWindow
1904426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
1905426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                      const int *attribList )
1906426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1907426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1908426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
1909426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) win;
19107d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   (void) attribList;  /* Ignored in GLX 1.3 */
19117d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19127d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   return win;  /* A hack for now */
1913426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1914426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1915426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1916426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1917426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyWindow( Display *dpy, GLXWindow window )
1918426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
19197d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable) window);
19207d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (b)
19217d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      XMesaDestroyBuffer(b);
19227d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   /* don't destroy X window */
1923426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1924426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1925426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
19267d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul/* XXX untested */
1927426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
1928426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
1929426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                      const int *attribList )
1930426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
19317d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaVisual v = (XMesaVisual) config;
19327d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XVisualInfo *visinfo;
19337d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaBuffer b;
19347d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
1935426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1936426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
1937426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) pixmap;
19387d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   (void) attribList;  /* Ignored in GLX 1.3 */
19397d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19407d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!dpy || !config || !pixmap)
19417d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return 0;
19427d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19437d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   visinfo = v->vishandle;
19447d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19457d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   v = find_glx_visual( dpy, visinfo );
19467d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!v) {
19477d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      v = create_glx_visual( dpy, visinfo );
19487d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      if (!v) {
19497d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         /* unusable visual */
19507d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         return 0;
19517d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      }
19527d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
19537d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19547d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
19557d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!b) {
19567d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return 0;
19577d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
19587d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19597d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   return pixmap;
1960426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1961426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1962426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1963426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1964426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
1965426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
19667d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable)pixmap);
19677d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (b)
19687d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      XMesaDestroyBuffer(b);
19697d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   /* don't destroy X pixmap */
1970426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1971426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1972426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1973426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPbuffer
1974426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
1975426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       const int *attribList )
1976426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
19773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
19783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaBuffer xmbuf;
19797d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   const int *attrib;
19807d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   int width = 0, height = 0;
19817d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
19827d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
1983426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
19847d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19853265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   for (attrib = attribList; *attrib; attrib++) {
19867d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      switch (*attrib) {
19877d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         case GLX_PBUFFER_WIDTH:
19883265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
19893265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            width = *attrib;
19907d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            break;
19917d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         case GLX_PBUFFER_HEIGHT:
19923265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
19933265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            height = *attrib;
19947d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            break;
19957d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         case GLX_PRESERVED_CONTENTS:
19963265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
19973265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            preserveContents = *attrib; /* ignored */
19987d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            break;
19997d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         case GLX_LARGEST_PBUFFER:
20003265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
20013265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            useLargest = *attrib; /* ignored */
20027d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            break;
20037d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         default:
20047d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            return 0;
20057d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      }
20067d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
20077d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20087d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (width == 0 || height == 0)
20097d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return 0;
20107d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20113265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
2012e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* A GLXPbuffer handle must be an X Drawable because that's what
2013e4656003caee346d9c4eb23256d73409271291a7Brian Paul    * glXMakeCurrent takes.
2014e4656003caee346d9c4eb23256d73409271291a7Brian Paul    */
2015e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return (GLXPbuffer) xmbuf->frontbuffer;
2016426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2017426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2018426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2019426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2020426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf )
2021426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2022e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer b = XMesaFindBuffer(dpy, pbuf);
2023e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (b) {
2024e4656003caee346d9c4eb23256d73409271291a7Brian Paul      XMesaDestroyBuffer(b);
2025e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2026426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2027426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2028426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2029426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2030426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
2031426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       unsigned int *value )
2032426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2033e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, draw);
2034e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmbuf)
2035e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return;
20367d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20377d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   switch (attribute) {
20387d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_WIDTH:
2039e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmbuf->width;
2040e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
20417d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_HEIGHT:
2042e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmbuf->height;
2043e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
20447d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_PRESERVED_CONTENTS:
2045e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = True;
2046e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
20477d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_LARGEST_PBUFFER:
2048e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmbuf->width * xmbuf->height;
2049e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
20507d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_FBCONFIG_ID:
2051e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmbuf->xm_visual->vishandle->visualid;
20527d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         return;
20537d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      default:
20547d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         return;  /* GLX_BAD_ATTRIBUTE? */
20557d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
2056426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2057426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2058426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2059426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXContext
2060426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
2061426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                          int renderType, GLXContext shareList, Bool direct )
2062426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
20637d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaVisual v = (XMesaVisual) config;
20647d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20657d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!dpy || !config ||
20667d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul       (renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE))
20677d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return 0;
20687d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20697d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   return Fake_glXCreateContext(dpy, v->vishandle, shareList, direct);
2070426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2071426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2072426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2073426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
2074426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
2075426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2076e4656003caee346d9c4eb23256d73409271291a7Brian Paul   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
2077e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaContext xmctx = glxCtx->xmesaContext;
2078e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2079426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
2080426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) ctx;
20817d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20827d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   switch (attribute) {
20837d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   case GLX_FBCONFIG_ID:
2084e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *value = xmctx->xm_visual->vishandle->visualid;
2085e4656003caee346d9c4eb23256d73409271291a7Brian Paul      break;
20867d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   case GLX_RENDER_TYPE:
2087e4656003caee346d9c4eb23256d73409271291a7Brian Paul      if (xmctx->xm_visual->mesa_visual.rgbMode)
2088e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = GLX_RGBA_BIT;
2089e4656003caee346d9c4eb23256d73409271291a7Brian Paul      else
2090e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = GLX_COLOR_INDEX_BIT;
2091e4656003caee346d9c4eb23256d73409271291a7Brian Paul      break;
20927d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   case GLX_SCREEN:
20937d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      *value = 0;
20947d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return Success;
20957d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   default:
20967d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return GLX_BAD_ATTRIBUTE;
20977d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
2098e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return 0;
2099426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2100426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2101426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2102426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2103426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask )
2104426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2105e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2106e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf)
2107e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmbuf->selectedEvents = mask;
2108426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2109426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2110426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2111426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2112426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
2113426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                          unsigned long *mask )
2114426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2115e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2116e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf)
2117e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *mask = xmbuf->selectedEvents;
2118e4656003caee346d9c4eb23256d73409271291a7Brian Paul   else
2119e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *mask = 0;
2120426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2121b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
2122b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
2123b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
2124b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_swap_control ***/
2125783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2126783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2127783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSwapIntervalSGI(int interval)
2128783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2129783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) interval;
2130783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2131783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2132783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2133783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2134783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2135b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_video_sync ***/
2136783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2137783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2138783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetVideoSyncSGI(unsigned int *count)
2139783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2140783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) count;
2141783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2142783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2143783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2144783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2145783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
2146783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2147783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) divisor;
2148783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) remainder;
2149783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) count;
2150783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2151783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2152783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2153783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2154783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2155b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_make_current_read ***/
2156783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2157426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
2158783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXMakeCurrentReadSGI(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
2159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2160a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   return Fake_glXMakeContextCurrent( dpy, draw, read, ctx );
2161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2162783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
21637cf50e137da497a590ec9001a9918972a6246142Brian Paul/* not used
2164783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXDrawable
2165b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian PaulFake_glXGetCurrentReadDrawableSGI(void)
2166783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2167783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2168783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
21697cf50e137da497a590ec9001a9918972a6246142Brian Paul*/
2170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2172b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_source ***/
2173b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_VL_H)
21744c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul
2175783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXVideoSourceSGIX
2176783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode)
2177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2178783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2179783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2180783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) server;
2181783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) path;
2182783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) nodeClass;
2183783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) drainNode;
2184783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2185783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2186783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2187783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2188783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src)
2189783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2190783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2191783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) src;
2192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2193783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
21944c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul#endif
21954c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul
219689a42b7e736bd9b0ab090906cab0cd047a6ec12eBrian Paul
2197b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_EXT_import_context ***/
219889a42b7e736bd9b0ab090906cab0cd047a6ec12eBrian Paul
2199783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2200783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXFreeContextEXT(Display *dpy, GLXContext context)
2201783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2202783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2203783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) context;
2204783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2205426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2206783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContextID
2207783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetContextIDEXT(const GLXContext context)
2208783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2209783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) context;
2210783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2211783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2212783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2213783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContext
2214783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXImportContextEXT(Display *dpy, GLXContextID contextID)
2215783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2216783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2217783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) contextID;
2218783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2219783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2220426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2221426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
2222783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute, int *value)
2223426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2224783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2225783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) context;
2226783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) attribute;
2227783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) value;
2228426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
2229426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2230426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2231783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2232783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2233b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_fbconfig ***/
2234426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2235426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
2236783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value)
2237783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
22383265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return Fake_glXGetFBConfigAttrib(dpy, config, attribute, value);
2239783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2240783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2241783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXFBConfigSGIX *
2242783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChooseFBConfigSGIX(Display *dpy, int screen, int *attrib_list, int *nelements)
2243783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
22443265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return (GLXFBConfig *) Fake_glXChooseFBConfig(dpy, screen, attrib_list, nelements);
2245783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2246783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2247e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2248783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXPixmap
2249783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateGLXPixmapWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap)
2250783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2251e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
2252e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaCreatePixmapBuffer(xmvis, pixmap, 0);
2253e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return xmbuf->frontbuffer; /* need to return an X ID */
2254783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2255783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2256e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2257783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContext
2258783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct)
2259783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2260e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
2261e4656003caee346d9c4eb23256d73409271291a7Brian Paul   struct fake_glx_context *glxCtx;
2262e4656003caee346d9c4eb23256d73409271291a7Brian Paul   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
2263e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2264e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx = CALLOC_STRUCT(fake_glx_context);
2265e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!glxCtx)
2266e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return 0;
2267e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2268e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* deallocate unused windows/buffers */
2269e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaGarbageCollect();
2270e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2271e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->xmesaContext = XMesaCreateContext(xmvis,
2272e4656003caee346d9c4eb23256d73409271291a7Brian Paul                                   shareCtx ? shareCtx->xmesaContext : NULL);
2273e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!glxCtx->xmesaContext) {
2274e4656003caee346d9c4eb23256d73409271291a7Brian Paul      FREE(glxCtx);
2275e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return NULL;
2276e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2277e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2278e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->xmesaContext->direct = GL_FALSE;
2279e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->glxContext.isDirect = GL_FALSE;
2280e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->glxContext.currentDpy = dpy;
2281e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
2282e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2283e4656003caee346d9c4eb23256d73409271291a7Brian Paul   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
2284e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2285e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return (GLXContext) glxCtx;
2286783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2287783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2288e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2289783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic XVisualInfo *
2290783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetVisualFromFBConfigSGIX(Display *dpy, GLXFBConfigSGIX config)
2291783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
22923265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return Fake_glXGetVisualFromFBConfig(dpy, config);
2293783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2294783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2295e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2296783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXFBConfigSGIX
2297783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
2298426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2299e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis = find_glx_visual(dpy, vis);
2300e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmvis) {
2301e4656003caee346d9c4eb23256d73409271291a7Brian Paul      /* This visual wasn't found with glXChooseVisual() */
2302e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmvis = create_glx_visual(dpy, vis);
2303e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2304e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2305e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return (GLXFBConfigSGIX) xmvis;
2306426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2307426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2308426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2309426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2310b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_pbuffer ***/
2311783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2312783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXPbufferSGIX
23133265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config,
23143265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                             unsigned int width, unsigned int height,
23153265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                             int *attribList)
2316783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
23173265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
23183265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaBuffer xmbuf;
23193265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   const int *attrib;
23203265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
23213265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
2322783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
23233265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
23243265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   for (attrib = attribList; *attrib; attrib++) {
23253265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      switch (*attrib) {
23263265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         case GLX_PRESERVED_CONTENTS_SGIX:
23273265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
23283265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            preserveContents = *attrib; /* ignored */
23293265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            break;
23303265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         case GLX_LARGEST_PBUFFER_SGIX:
23313265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
23323265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            useLargest = *attrib; /* ignored */
23333265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            break;
23343265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         default:
23353265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return 0;
23363265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
23373265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   }
23383265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
23393265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
2340e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* A GLXPbuffer handle must be an X Drawable because that's what
2341e4656003caee346d9c4eb23256d73409271291a7Brian Paul    * glXMakeCurrent takes.
2342e4656003caee346d9c4eb23256d73409271291a7Brian Paul    */
2343e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return (GLXPbuffer) xmbuf->frontbuffer;
2344783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2345783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2346e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2347783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2348783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXDestroyGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf)
2349783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2350e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf);
2351e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf) {
2352e4656003caee346d9c4eb23256d73409271291a7Brian Paul      XMesaDestroyBuffer(xmbuf);
2353e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2354783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2355783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2356e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2357783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2358783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value)
2359783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2360e4656003caee346d9c4eb23256d73409271291a7Brian Paul   const XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf);
2361e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2362e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmbuf) {
2363e4656003caee346d9c4eb23256d73409271291a7Brian Paul      /* Generate GLXBadPbufferSGIX for bad pbuffer */
2364e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return 0;
2365e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2366e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2367e4656003caee346d9c4eb23256d73409271291a7Brian Paul   switch (attribute) {
2368e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_PRESERVED_CONTENTS_SGIX:
2369e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = True;
2370e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2371e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_LARGEST_PBUFFER_SGIX:
2372e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmbuf->width * xmbuf->height;
2373e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2374e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_WIDTH_SGIX:
2375e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmbuf->width;
2376e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2377e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_HEIGHT_SGIX:
2378e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmbuf->height;
2379e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2380e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_EVENT_MASK_SGIX:
2381e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = 0;  /* XXX might be wrong */
2382e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2383e4656003caee346d9c4eb23256d73409271291a7Brian Paul      default:
2384e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = 0;
2385e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2386783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2387783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2388783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2389e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2390783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2391783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSelectEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long mask)
2392783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2393e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2394e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf) {
2395e4656003caee346d9c4eb23256d73409271291a7Brian Paul      /* Note: we'll never generate clobber events */
2396e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmbuf->selectedEvents = mask;
2397e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2398783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2399783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2400e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2401783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2402783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetSelectedEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long *mask)
2403783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2404e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2405e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf) {
2406e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *mask = xmbuf->selectedEvents;
2407e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2408e4656003caee346d9c4eb23256d73409271291a7Brian Paul   else {
2409e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *mask = 0;
2410e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2411783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2412783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2413783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2414783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2415b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_cushion ***/
2416783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2417783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2418783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCushionSGI(Display *dpy, Window win, float cushion)
2419783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2420783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2421783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) win;
2422783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) cushion;
2423783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2424783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2425783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2426783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2427b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_resize ***/
2428783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2429783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2430783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window window)
2431783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2432783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2433783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2434783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2435783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) window;
2436783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2437783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2438783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2439783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2440783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChannelRectSGIX(Display *dpy, int screen, int channel, int x, int y, int w, int h)
2441783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2442783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2443783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2444783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2445783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) x;
2446783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) y;
2447783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) w;
2448783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) h;
2449783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2450783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2451783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2452783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2453783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryChannelRectSGIX(Display *dpy, int screen, int channel, int *x, int *y, int *w, int *h)
2454783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2455783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2456783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2457783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2458783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) x;
2459783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) y;
2460783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) w;
2461783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) h;
2462783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2463783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2464783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2465783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2466783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel, int *dx, int *dy, int *dw, int *dh)
2467783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2468783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2469783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2470783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2471783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dx;
2472783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dy;
2473783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dw;
2474783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dh;
2475783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2476783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2477783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2478783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2479783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChannelRectSyncSGIX(Display *dpy, int screen, int channel, GLenum synctype)
2480783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2481783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2482783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2483783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2484783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) synctype;
2485783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2486783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2487783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2488783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2489783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2490b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_dmbuffer **/
2491783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2492b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_DM_BUFFER_H_)
2493783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool
2494783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer)
2495783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2496783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2497783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) pbuffer;
2498783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) params;
2499783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dmbuffer;
2500783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return False;
2501783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2502783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif
2503783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2504783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2505b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_swap_group ***/
2506783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2507783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2508783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member)
2509783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2510783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2511783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) drawable;
2512783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) member;
2513783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2514783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2515783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2516783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2517b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_swap_barrier ***/
2518783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2519783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2520783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier)
2521783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2522783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2523783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) drawable;
2524783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) barrier;
2525783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2526783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2527783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool
2528783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
2529783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2530783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2531783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2532783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) max;
2533783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return False;
2534783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2535783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2536783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2537783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2538b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SUN_get_transparent_index ***/
2539783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2540783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Status
2541783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, long *pTransparent)
2542783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2543783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2544783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) overlay;
2545783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) underlay;
2546783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) pTransparent;
2547783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2548783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2549783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2550783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2551783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2552b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_release_buffers ***/
2553b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul
2554783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul/*
2555783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul * Release the depth, stencil, accum buffers attached to a GLXDrawable
2556783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul * (a window or pixmap) prior to destroying the GLXDrawable.
2557783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul */
2558783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool
2559783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
2560783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2561783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   XMesaBuffer b = XMesaFindBuffer(dpy, d);
2562783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   if (b) {
2563783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul      XMesaDestroyBuffer(b);
2564783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul      return True;
2565783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   }
2566783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return False;
2567783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2568783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2569783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2570783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2571b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_set_3dfx_mode ***/
2572b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul
2573783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool
2574783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSet3DfxModeMESA( int mode )
2575783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2576783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return XMesaSetFXmode( mode );
2577783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2578783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2579783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2580783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
25818fefafa2200d3ea44ec46592b190654a10685b46Brian Paul/*** AGP memory allocation ***/
25828fefafa2200d3ea44ec46592b190654a10685b46Brian Paulstatic void *
25838fefafa2200d3ea44ec46592b190654a10685b46Brian PaulFake_glXAllocateMemoryNV( GLsizei size,
25848fefafa2200d3ea44ec46592b190654a10685b46Brian Paul                          GLfloat readFrequency,
25858fefafa2200d3ea44ec46592b190654a10685b46Brian Paul                          GLfloat writeFrequency,
25868fefafa2200d3ea44ec46592b190654a10685b46Brian Paul                          GLfloat priority )
25878fefafa2200d3ea44ec46592b190654a10685b46Brian Paul{
25888fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) size;
25898fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) readFrequency;
25908fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) writeFrequency;
25918fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) priority;
25928fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   return NULL;
25938fefafa2200d3ea44ec46592b190654a10685b46Brian Paul}
25948fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
25958fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
25968fefafa2200d3ea44ec46592b190654a10685b46Brian Paulstatic void
25978fefafa2200d3ea44ec46592b190654a10685b46Brian PaulFake_glXFreeMemoryNV( GLvoid *pointer )
25988fefafa2200d3ea44ec46592b190654a10685b46Brian Paul{
25998fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) pointer;
26008fefafa2200d3ea44ec46592b190654a10685b46Brian Paul}
26018fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
26028fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
260343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
2604e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paulextern struct _glxapi_table *_mesa_GetGLXDispatchTable(void);
2605426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstruct _glxapi_table *_mesa_GetGLXDispatchTable(void)
2606426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2607426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   static struct _glxapi_table glx;
2608426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2609426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* be sure our dispatch table size <= libGL's table */
2610426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   {
261101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      GLuint size = sizeof(struct _glxapi_table) / sizeof(void *);
2612426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul      (void) size;
2613426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul      assert(_glxapi_get_dispatch_table_size() >= size);
2614426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   }
2615426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2616426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* initialize the whole table to no-ops */
2617426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   _glxapi_set_no_op_table(&glx);
2618426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2619426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* now initialize the table with the functions I implement */
2620426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ChooseVisual = Fake_glXChooseVisual;
2621426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CopyContext = Fake_glXCopyContext;
2622426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateContext = Fake_glXCreateContext;
2623426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateGLXPixmap = Fake_glXCreateGLXPixmap;
2624426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyContext = Fake_glXDestroyContext;
2625426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyGLXPixmap = Fake_glXDestroyGLXPixmap;
2626426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetConfig = Fake_glXGetConfig;
2627426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentContext = Fake_glXGetCurrentContext;*/
2628426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentDrawable = Fake_glXGetCurrentDrawable;*/
2629426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.IsDirect = Fake_glXIsDirect;
2630426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.MakeCurrent = Fake_glXMakeCurrent;
2631426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryExtension = Fake_glXQueryExtension;
2632426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryVersion = Fake_glXQueryVersion;
2633426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.SwapBuffers = Fake_glXSwapBuffers;
2634426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.UseXFont = Fake_glXUseXFont;
2635426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitGL = Fake_glXWaitGL;
2636426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitX = Fake_glXWaitX;
2637426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2638b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_VERSION_1_1 ***/
2639426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetClientString = Fake_glXGetClientString;
2640426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryExtensionsString = Fake_glXQueryExtensionsString;
2641426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryServerString = Fake_glXQueryServerString;
2642426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2643b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_VERSION_1_2 ***/
2644426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentDisplay = Fake_glXGetCurrentDisplay;*/
2645426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2646b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_VERSION_1_3 ***/
2647426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ChooseFBConfig = Fake_glXChooseFBConfig;
2648426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateNewContext = Fake_glXCreateNewContext;
2649426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreatePbuffer = Fake_glXCreatePbuffer;
2650426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreatePixmap = Fake_glXCreatePixmap;
2651426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateWindow = Fake_glXCreateWindow;
2652426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyPbuffer = Fake_glXDestroyPbuffer;
2653426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyPixmap = Fake_glXDestroyPixmap;
2654426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyWindow = Fake_glXDestroyWindow;
2655426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentReadDrawable = Fake_glXGetCurrentReadDrawable;*/
2656426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetFBConfigAttrib = Fake_glXGetFBConfigAttrib;
265771dea349d2be623b7819389428b0d6a124e8d184Brian Paul   glx.GetFBConfigs = Fake_glXGetFBConfigs;
2658426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetSelectedEvent = Fake_glXGetSelectedEvent;
2659426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetVisualFromFBConfig = Fake_glXGetVisualFromFBConfig;
2660426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.MakeContextCurrent = Fake_glXMakeContextCurrent;
2661426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryContext = Fake_glXQueryContext;
2662426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryDrawable = Fake_glXQueryDrawable;
2663426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.SelectEvent = Fake_glXSelectEvent;
2664426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2665b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGI_swap_control ***/
2666783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.SwapIntervalSGI = Fake_glXSwapIntervalSGI;
2667783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2668b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGI_video_sync ***/
2669426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetVideoSyncSGI = Fake_glXGetVideoSyncSGI;
2670426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitVideoSyncSGI = Fake_glXWaitVideoSyncSGI;
2671426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2672b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGI_make_current_read ***/
2673783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.MakeCurrentReadSGI = Fake_glXMakeCurrentReadSGI;
26747cf50e137da497a590ec9001a9918972a6246142Brian Paul   /*glx.GetCurrentReadDrawableSGI = Fake_glXGetCurrentReadDrawableSGI;*/
2675783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2676b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_source ***/
2677b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_VL_H)
2678783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CreateGLXVideoSourceSGIX = Fake_glXCreateGLXVideoSourceSGIX;
2679783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.DestroyGLXVideoSourceSGIX = Fake_glXDestroyGLXVideoSourceSGIX;
2680783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif
2681783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2682b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_EXT_import_context ***/
2683783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.FreeContextEXT = Fake_glXFreeContextEXT;
2684783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetContextIDEXT = Fake_glXGetContextIDEXT;
26857cf50e137da497a590ec9001a9918972a6246142Brian Paul   /*glx.GetCurrentDisplayEXT = Fake_glXGetCurrentDisplayEXT;*/
2686783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.ImportContextEXT = Fake_glXImportContextEXT;
2687783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryContextInfoEXT = Fake_glXQueryContextInfoEXT;
26884536021a62e02fceaa6e8eb889b0f61743109cc4Brian Paul
2689b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_fbconfig ***/
2690783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetFBConfigAttribSGIX = Fake_glXGetFBConfigAttribSGIX;
2691783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.ChooseFBConfigSGIX = Fake_glXChooseFBConfigSGIX;
2692783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CreateGLXPixmapWithConfigSGIX = Fake_glXCreateGLXPixmapWithConfigSGIX;
2693783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CreateContextWithConfigSGIX = Fake_glXCreateContextWithConfigSGIX;
2694783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetVisualFromFBConfigSGIX = Fake_glXGetVisualFromFBConfigSGIX;
2695783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetFBConfigFromVisualSGIX = Fake_glXGetFBConfigFromVisualSGIX;
2696783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2697b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_pbuffer ***/
2698783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CreateGLXPbufferSGIX = Fake_glXCreateGLXPbufferSGIX;
2699783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.DestroyGLXPbufferSGIX = Fake_glXDestroyGLXPbufferSGIX;
2700783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryGLXPbufferSGIX = Fake_glXQueryGLXPbufferSGIX;
2701783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.SelectEventSGIX = Fake_glXSelectEventSGIX;
2702783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetSelectedEventSGIX = Fake_glXGetSelectedEventSGIX;
2703783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2704b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGI_cushion ***/
2705783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CushionSGI = Fake_glXCushionSGI;
2706783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2707b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_video_resize ***/
2708783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.BindChannelToWindowSGIX = Fake_glXBindChannelToWindowSGIX;
2709783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.ChannelRectSGIX = Fake_glXChannelRectSGIX;
2710783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryChannelRectSGIX = Fake_glXQueryChannelRectSGIX;
2711783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryChannelDeltasSGIX = Fake_glXQueryChannelDeltasSGIX;
2712783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.ChannelRectSyncSGIX = Fake_glXChannelRectSyncSGIX;
2713783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2714b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_dmbuffer **/
2715b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_DM_BUFFER_H_)
2716783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.AssociateDMPbufferSGIX = NULL;
2717783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif
2718783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2719b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_swap_group ***/
2720783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.JoinSwapGroupSGIX = Fake_glXJoinSwapGroupSGIX;
2721783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2722b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_swap_barrier ***/
2723783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.BindSwapBarrierSGIX = Fake_glXBindSwapBarrierSGIX;
2724783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryMaxSwapBarriersSGIX = Fake_glXQueryMaxSwapBarriersSGIX;
2725783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2726b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SUN_get_transparent_index ***/
2727783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetTransparentIndexSUN = Fake_glXGetTransparentIndexSUN;
27284536021a62e02fceaa6e8eb889b0f61743109cc4Brian Paul
2729b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_MESA_copy_sub_buffer ***/
2730426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CopySubBufferMESA = Fake_glXCopySubBufferMESA;
2731426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2732b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_MESA_release_buffers ***/
2733426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ReleaseBuffersMESA = Fake_glXReleaseBuffersMESA;
2734426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2735b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_MESA_pixmap_colormap ***/
2736426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateGLXPixmapMESA = Fake_glXCreateGLXPixmapMESA;
2737426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2738b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_MESA_set_3dfx_mode ***/
2739426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.Set3DfxModeMESA = Fake_glXSet3DfxModeMESA;
2740426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
27418fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   /*** GLX AGP memory allocation ***/
27428fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   glx.AllocateMemoryNV = Fake_glXAllocateMemoryNV;
27438fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   glx.FreeMemoryNV = Fake_glXFreeMemoryNV;
27448fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
2745426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return &glx;
2746426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2747