fakeglx.c revision ee061060826df059f0ddb904a2160ed610423579
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
3ee061060826df059f0ddb904a2160ed610423579Brian Paul * Version:  6.5.1
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
568edf28df68701ac429e53c0fd6dbb70b39c3fd0Brian Paul * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2736cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paul * This is an emulation of the GLX API which allows Mesa/GLX-based programs
2836cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paul * to run on X servers which do not have the real GLX extension.
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Thanks to the contributors:
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
32ddf69f247fdb246b99ef6525fcfa6eda7b2e2aa7Brian Paul * Initial version:  Philip Brown (phil@bolthole.com)
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Better glXGetConfig() support: Armin Liebchen (liebchen@asylum.cs.utah.edu)
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Further visual-handling refinements: Wolfram Gloger
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *    (wmglo@Dent.MED.Uni-Muenchen.DE).
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Notes:
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *   Don't be fooled, stereo isn't supported yet.
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
43fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glxheader.h"
44426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#include "glxapi.h"
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/xmesa.h"
46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "config.h"
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "macros.h"
493c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
512c5f93784ea1ba28ae15181917ff3e47656a93adBrian Paul#include "version.h"
5271dea349d2be623b7819389428b0d6a124e8d184Brian Paul#include "xfonts.h"
53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "xmesaP.h"
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5570cf1f0cf83fc3f2df241cc638e23f8df3b89923Jouk Jansen#ifdef __VMS
5670cf1f0cf83fc3f2df241cc638e23f8df3b89923Jouk Jansen#define _mesa_sprintf sprintf
5770cf1f0cf83fc3f2df241cc638e23f8df3b89923Jouk Jansen#endif
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This indicates the client-side GLX API and GLX encoder version. */
6078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define CLIENT_MAJOR_VERSION 1
61a573803ed3fe9ef6489f45bd4c5455b77cb33a43Brian Paul#define CLIENT_MINOR_VERSION 4  /* but don't have 1.3's pbuffers, etc yet */
6278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
6378fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This indicates the server-side GLX decoder version.
64ba57e5297d60eef37e43dd4d7f10d1e62f5e97ceBrian Paul * GLX 1.4 indicates OpenGL 1.3 support
6578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul */
6678fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define SERVER_MAJOR_VERSION 1
67ba57e5297d60eef37e43dd4d7f10d1e62f5e97ceBrian Paul#define SERVER_MINOR_VERSION 4
6878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
6978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This is appended onto the glXGetClient/ServerString version strings. */
702c5f93784ea1ba28ae15181917ff3e47656a93adBrian Paul#define MESA_GLX_VERSION "Mesa " MESA_VERSION_STRING
7178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
7278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* Who implemented this GLX? */
7378fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define VENDOR "Brian Paul"
7478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
75e4656003caee346d9c4eb23256d73409271291a7Brian Paul#define EXTENSIONS \
76e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_MESA_set_3dfx_mode " \
77e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_MESA_copy_sub_buffer " \
78e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_MESA_pixmap_colormap " \
79e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_MESA_release_buffers " \
80e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_ARB_get_proc_address " \
81e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_EXT_visual_info " \
82e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_EXT_visual_rating " \
83ee061060826df059f0ddb904a2160ed610423579Brian Paul   /*"GLX_SGI_video_sync "*/ \
84e4656003caee346d9c4eb23256d73409271291a7Brian Paul   "GLX_SGIX_fbconfig " \
856d6efd605f662c1f07e183e58416db804f0a058fBrian Paul   "GLX_SGIX_pbuffer "
8643c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
877cf50e137da497a590ec9001a9918972a6246142Brian Paul/*
887cf50e137da497a590ec9001a9918972a6246142Brian Paul * Our fake GLX context will contain a "real" GLX context and an XMesa context.
897cf50e137da497a590ec9001a9918972a6246142Brian Paul *
907cf50e137da497a590ec9001a9918972a6246142Brian Paul * Note that a pointer to a __GLXcontext is a pointer to a fake_glx_context,
917cf50e137da497a590ec9001a9918972a6246142Brian Paul * and vice versa.
927cf50e137da497a590ec9001a9918972a6246142Brian Paul *
937cf50e137da497a590ec9001a9918972a6246142Brian Paul * We really just need this structure in order to make the libGL functions
947cf50e137da497a590ec9001a9918972a6246142Brian Paul * glXGetCurrentContext(), glXGetCurrentDrawable() and glXGetCurrentDisplay()
957cf50e137da497a590ec9001a9918972a6246142Brian Paul * work correctly.
967cf50e137da497a590ec9001a9918972a6246142Brian Paul */
977cf50e137da497a590ec9001a9918972a6246142Brian Paulstruct fake_glx_context {
987cf50e137da497a590ec9001a9918972a6246142Brian Paul   __GLXcontext glxContext;   /* this MUST be first! */
997cf50e137da497a590ec9001a9918972a6246142Brian Paul   XMesaContext xmesaContext;
1007cf50e137da497a590ec9001a9918972a6246142Brian Paul};
10143c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1047cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/
1057cf50e137da497a590ec9001a9918972a6246142Brian Paul/***                       GLX Visual Code                          ***/
1067cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/
1077cf50e137da497a590ec9001a9918972a6246142Brian Paul
1087cf50e137da497a590ec9001a9918972a6246142Brian Paul#define DONT_CARE -1
1097cf50e137da497a590ec9001a9918972a6246142Brian Paul
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11164034c4fb5c56f63d37faa6f64f3183ca106856aAlan Hourihanestatic XMesaVisual *VisualTable = NULL;
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int NumVisuals = 0;
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * This struct and some code fragments borrowed
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * from Mark Kilgard's GLUT library.
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgtypedef struct _OverlayInfo {
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  /* Avoid 64-bit portability problems by being careful to use
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     longs due to the way XGetWindowProperty is specified. Note
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     that these parameters are passed as CARD32s over X
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     protocol. */
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  unsigned long overlay_visual;
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long transparent_type;
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long value;
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long layer;
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} OverlayInfo;
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Macro to handle c_class vs class field name in XVisualInfo struct */
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#if defined(__cplusplus) || defined(c_plusplus)
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLASS c_class
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLASS class
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Test if the given XVisualInfo is usable for Mesa rendering.
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1447287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulstatic GLboolean
1457287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulis_usable_visual( XVisualInfo *vinfo )
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (vinfo->CLASS) {
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case StaticGray:
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GrayScale:
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Any StaticGray/GrayScale visual works in RGB or CI mode */
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_TRUE;
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case StaticColor:
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case PseudoColor:
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* Any StaticColor/PseudoColor visual of at least 4 bits */
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (vinfo->depth>=4) {
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return GL_TRUE;
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return GL_FALSE;
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case TrueColor:
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case DirectColor:
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* Any depth of TrueColor or DirectColor works in RGB mode */
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GL_TRUE;
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* This should never happen */
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GL_FALSE;
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1731d97c277e0cb2b75559d495a58222f2511212a66Brian Paul/**
1741d97c277e0cb2b75559d495a58222f2511212a66Brian Paul * Get an array OverlayInfo records for specified screen.
1751d97c277e0cb2b75559d495a58222f2511212a66Brian Paul * \param dpy  the display
1761d97c277e0cb2b75559d495a58222f2511212a66Brian Paul * \param screen  screen number
1771d97c277e0cb2b75559d495a58222f2511212a66Brian Paul * \param numOverlays  returns numver of OverlayInfo records
1781d97c277e0cb2b75559d495a58222f2511212a66Brian Paul * \return  pointer to OverlayInfo array, free with XFree()
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1801d97c277e0cb2b75559d495a58222f2511212a66Brian Paulstatic OverlayInfo *
1811d97c277e0cb2b75559d495a58222f2511212a66Brian PaulGetOverlayInfo(Display *dpy, int screen, int *numOverlays)
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom overlayVisualsAtom;
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom actualType;
1851d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   Status status;
1861d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   unsigned char *ovInfo;
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long sizeData, bytesLeft;
1881d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   int actualFormat;
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * The SERVER_OVERLAY_VISUALS property on the root window contains
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * a list of overlay visuals.  Get that list now.
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (overlayVisualsAtom == None) {
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1991d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   status = XGetWindowProperty(dpy, RootWindow(dpy, screen),
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, 0L, (long) 10000, False,
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, &actualType, &actualFormat,
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               &sizeData, &bytesLeft,
2031d97c277e0cb2b75559d495a58222f2511212a66Brian Paul                               &ovInfo);
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (status != Success || actualType != overlayVisualsAtom ||
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       actualFormat != 32 || sizeData < 4) {
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* something went wrong */
2081d97c277e0cb2b75559d495a58222f2511212a66Brian Paul      XFree((void *) ovInfo);
2091d97c277e0cb2b75559d495a58222f2511212a66Brian Paul      *numOverlays = 0;
2101d97c277e0cb2b75559d495a58222f2511212a66Brian Paul      return NULL;
2111d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   }
2121d97c277e0cb2b75559d495a58222f2511212a66Brian Paul
2131d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   *numOverlays = sizeData / 4;
2141d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   return (OverlayInfo *) ovInfo;
2151d97c277e0cb2b75559d495a58222f2511212a66Brian Paul}
2161d97c277e0cb2b75559d495a58222f2511212a66Brian Paul
2171d97c277e0cb2b75559d495a58222f2511212a66Brian Paul
2181d97c277e0cb2b75559d495a58222f2511212a66Brian Paul
2191d97c277e0cb2b75559d495a58222f2511212a66Brian Paul/**
2201d97c277e0cb2b75559d495a58222f2511212a66Brian Paul * Return the level (overlay, normal, underlay) of a given XVisualInfo.
2211d97c277e0cb2b75559d495a58222f2511212a66Brian Paul * Input:  dpy - the X display
2221d97c277e0cb2b75559d495a58222f2511212a66Brian Paul *         vinfo - the XVisualInfo to test
2231d97c277e0cb2b75559d495a58222f2511212a66Brian Paul * Return:  level of the visual:
2241d97c277e0cb2b75559d495a58222f2511212a66Brian Paul *             0 = normal planes
2251d97c277e0cb2b75559d495a58222f2511212a66Brian Paul *            >0 = overlay planes
2261d97c277e0cb2b75559d495a58222f2511212a66Brian Paul *            <0 = underlay planes
2271d97c277e0cb2b75559d495a58222f2511212a66Brian Paul */
2281d97c277e0cb2b75559d495a58222f2511212a66Brian Paulstatic int
2291d97c277e0cb2b75559d495a58222f2511212a66Brian Paullevel_of_visual( Display *dpy, XVisualInfo *vinfo )
2301d97c277e0cb2b75559d495a58222f2511212a66Brian Paul{
2311d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   OverlayInfo *overlay_info;
2321d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   int numOverlaysPerScreen, i;
2331d97c277e0cb2b75559d495a58222f2511212a66Brian Paul
2341d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   overlay_info = GetOverlayInfo(dpy, vinfo->screen, &numOverlaysPerScreen);
2351d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   if (!overlay_info) {
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* search the overlay visual list for the visual ID of interest */
2401d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   for (i = 0; i < numOverlaysPerScreen; i++) {
2411d97c277e0cb2b75559d495a58222f2511212a66Brian Paul      const OverlayInfo *ov = overlay_info + i;
2421d97c277e0cb2b75559d495a58222f2511212a66Brian Paul      if (ov->overlay_visual == vinfo->visualid) {
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* found the visual */
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (/*ov->transparent_type==1 &&*/ ov->layer!=0) {
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            int level = ov->layer;
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return level;
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return 0;
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* The visual ID was not found in the overlay list. */
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XFree((void *) overlay_info);
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return 0;
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Given an XVisualInfo and RGB, Double, and Depth buffer flags, save the
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * configuration in our list of GLX visuals.
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgsave_glx_visual( Display *dpy, XVisualInfo *vinfo,
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLboolean rgbFlag, GLboolean alphaFlag, GLboolean dbFlag,
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLboolean stereoFlag,
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLint depth_size, GLint stencil_size,
273b2e460018375f699198073a6167e0ee96ba1d267Brian Paul                 GLint accumRedSize, GLint accumGreenSize,
274b2e460018375f699198073a6167e0ee96ba1d267Brian Paul                 GLint accumBlueSize, GLint accumAlphaSize,
275894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                 GLint level, GLint numAuxBuffers )
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean ximageFlag = GL_TRUE;
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual xmvis;
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint i;
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean comparePointers;
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (dbFlag) {
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Check if the MESA_BACK_BUFFER env var is set */
284367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      char *backbuffer = _mesa_getenv("MESA_BACK_BUFFER");
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (backbuffer) {
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (backbuffer[0]=='p' || backbuffer[0]=='P') {
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ximageFlag = GL_FALSE;
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else if (backbuffer[0]=='x' || backbuffer[0]=='X') {
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ximageFlag = GL_TRUE;
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
293d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul            _mesa_warning(NULL, "Mesa: invalid value for MESA_BACK_BUFFER environment variable, using an XImage.");
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Comparing IDs uses less memory but sometimes fails. */
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* XXX revisit this after 3.0 is finished. */
300367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_GLX_VISUAL_HACK"))
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      comparePointers = GL_TRUE;
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      comparePointers = GL_FALSE;
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
305a13331d59b535aa4a1ddad695420de5d6f814550Brian Paul   /* Force the visual to have an alpha channel */
306a13331d59b535aa4a1ddad695420de5d6f814550Brian Paul   if (rgbFlag && _mesa_getenv("MESA_GLX_FORCE_ALPHA"))
307a13331d59b535aa4a1ddad695420de5d6f814550Brian Paul      alphaFlag = GL_TRUE;
308a13331d59b535aa4a1ddad695420de5d6f814550Brian Paul
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* First check if a matching visual is already in the list */
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0; i<NumVisuals; i++) {
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaVisual v = VisualTable[i];
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (v->display == dpy
313304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick          && v->mesa_visual.level == level
314894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul          && v->mesa_visual.numAuxBuffers == numAuxBuffers
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && v->ximage_flag == ximageFlag
3161832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && v->mesa_visual.rgbMode == rgbFlag
3171832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && v->mesa_visual.doubleBufferMode == dbFlag
3181832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && v->mesa_visual.stereoMode == stereoFlag
3191832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.alphaBits > 0) == alphaFlag
3201832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.depthBits >= depth_size || depth_size == 0)
3211832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.stencilBits >= stencil_size || stencil_size == 0)
3221832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.accumRedBits >= accumRedSize || accumRedSize == 0)
3231832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.accumGreenBits >= accumGreenSize || accumGreenSize == 0)
3241832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.accumBlueBits >= accumBlueSize || accumBlueSize == 0)
3251832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          && (v->mesa_visual.accumAlphaBits >= accumAlphaSize || accumAlphaSize == 0)) {
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* now either compare XVisualInfo pointers or visual IDs */
327d0247f53aea8fa8677aadc8a00f75c8993be9ebcBrian Paul         if ((!comparePointers && v->visinfo->visualid == vinfo->visualid)
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg             || (comparePointers && v->vishandle == vinfo)) {
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return v;
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Create a new visual and add it to the list. */
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
336c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul   xmvis = XMesaCreateVisual( dpy, vinfo, rgbFlag, alphaFlag, dbFlag,
337c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              stereoFlag, ximageFlag,
338c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              depth_size, stencil_size,
339c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              accumRedSize, accumBlueSize,
340c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              accumBlueSize, accumAlphaSize, 0, level,
341c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul                              GLX_NONE_EXT );
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (xmvis) {
343f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      /* Save a copy of the pointer now so we can find this visual again
344f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul       * if we need to search for it in find_glx_visual().
345f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul       */
346f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      xmvis->vishandle = vinfo;
34764034c4fb5c56f63d37faa6f64f3183ca106856aAlan Hourihane      /* Allocate more space for additional visual */
3489580179dfb42d5b81ff6ec9704b82a556c7f1229Brian Paul      VisualTable = (XMesaVisual *) _mesa_realloc( VisualTable,
34964034c4fb5c56f63d37faa6f64f3183ca106856aAlan Hourihane                                   sizeof(XMesaVisual) * NumVisuals,
350394fd40a536faade5ccfbbb1f2920394e89ad4aaBrian Paul                                   sizeof(XMesaVisual) * (NumVisuals + 1));
351f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      /* add xmvis to the list */
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      VisualTable[NumVisuals] = xmvis;
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      NumVisuals++;
3547287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul      /* XXX minor hack, because XMesaCreateVisual doesn't support an
3557287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul       * aux buffers parameter.
3567287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul       */
357894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul      xmvis->mesa_visual.numAuxBuffers = numAuxBuffers;
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return xmvis;
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
363dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul/**
364dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul * Return the default number of bits for the Z buffer.
365dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul * If defined, use the MESA_GLX_DEPTH_BITS env var value.
366dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul * Otherwise, use the DEFAULT_SOFTWARE_DEPTH_BITS constant.
367dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul * XXX probably do the same thing for stencil, accum, etc.
368dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul */
369dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paulstatic GLint
370dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Pauldefault_depth_bits(void)
371dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul{
372dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul   int zBits;
373dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul   const char *zEnv = _mesa_getenv("MESA_GLX_DEPTH_BITS");
374dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul   if (zEnv)
375dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul      zBits = _mesa_atoi(zEnv);
376dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul   else
377dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul      zBits = DEFAULT_SOFTWARE_DEPTH_BITS;
378dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul   return zBits;
379dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul}
380dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul
381978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paulstatic GLint
382c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Pauldefault_alpha_bits(void)
383c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul{
384c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul   int aBits;
385c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul   const char *aEnv = _mesa_getenv("MESA_GLX_ALPHA_BITS");
386c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul   if (aEnv)
387c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul      aBits = _mesa_atoi(aEnv);
388c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul   else
389c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul      aBits = 0;
390c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul   return aBits;
391c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul}
392c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul
393c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paulstatic GLint
394978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Pauldefault_accum_bits(void)
395978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul{
396978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul   return 16;
397978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul}
398978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul
399dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create a GLX visual from a regular XVisualInfo.
403ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * This is called when Fake GLX is given an XVisualInfo which wasn't
404ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * returned by glXChooseVisual.  Since this is the first time we're
405ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * considering this visual we'll take a guess at reasonable values
406ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * for depth buffer size, stencil size, accum size, etc.
407ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * This is the best we can do with a client-side emulation of GLX.
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgcreate_glx_visual( Display *dpy, XVisualInfo *visinfo )
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int vislevel;
413dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul   GLint zBits = default_depth_bits();
414978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul   GLint accBits = default_accum_bits();
415c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul   GLboolean alphaFlag = default_alpha_bits() > 0;
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   vislevel = level_of_visual( dpy, visinfo );
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vislevel) {
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Configure this visual as a CI, single-buffered overlay */
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return save_glx_visual( dpy, visinfo,
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* rgb */
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* alpha */
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* double */
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* stereo */
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              0,         /* depth bits */
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              0,         /* stencil bits */
427b2e460018375f699198073a6167e0ee96ba1d267Brian Paul                              0,0,0,0,   /* accum bits */
428894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                              vislevel,  /* level */
429894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                              0          /* numAux */
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                            );
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (is_usable_visual( visinfo )) {
433367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      if (_mesa_getenv("MESA_GLX_FORCE_CI")) {
4348f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         /* Configure this visual as a COLOR INDEX visual. */
4358f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         return save_glx_visual( dpy, visinfo,
4368f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,   /* rgb */
4378f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,  /* alpha */
4388f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_TRUE,   /* double */
4398f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,  /* stereo */
440dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul                                 zBits,
441e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                 STENCIL_BITS,
442e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                 0, 0, 0, 0, /* accum bits */
443894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                                 0,         /* level */
444894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                                 0          /* numAux */
4458f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                               );
4468f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      }
4478f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      else {
4488f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         /* Configure this visual as RGB, double-buffered, depth-buffered. */
4498f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         /* This is surely wrong for some people's needs but what else */
4508f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         /* can be done?  They should use glXChooseVisual(). */
4518f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul         return save_glx_visual( dpy, visinfo,
4528f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_TRUE,   /* rgb */
453c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul                                 alphaFlag, /* alpha */
4548f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_TRUE,   /* double */
4558f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                                 GL_FALSE,  /* stereo */
456dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul                                 zBits,
457e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                 STENCIL_BITS,
458978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul                                 accBits, /* r */
459978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul                                 accBits, /* g */
460978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul                                 accBits, /* b */
461978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul                                 accBits, /* a */
462894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                                 0,         /* level */
463894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                                 0          /* numAux */
4648f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul                               );
4658f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul      }
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
468d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      _mesa_warning(NULL, "Mesa: error in glXCreateContext: bad visual\n");
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Find the GLX visual associated with an XVisualInfo.
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgfind_glx_visual( Display *dpy, XVisualInfo *vinfo )
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
483f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   /* try to match visual id */
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<NumVisuals;i++) {
485f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      if (VisualTable[i]->display==dpy
486f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul          && VisualTable[i]->visinfo->visualid == vinfo->visualid) {
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return VisualTable[i];
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
490f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul
491f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   /* if that fails, try to match pointers */
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<NumVisuals;i++) {
493f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      if (VisualTable[i]->display==dpy && VisualTable[i]->vishandle==vinfo) {
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return VisualTable[i];
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
497f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5031d97c277e0cb2b75559d495a58222f2511212a66Brian Paul/**
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the transparent pixel value for a GLX visual.
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  glxvis - the glx_visual
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  a pixel value or -1 if no transparent pixel
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
5087287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulstatic int
5097287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paultransparent_pixel( XMesaVisual glxvis )
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Display *dpy = glxvis->display;
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vinfo = glxvis->visinfo;
5131d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   OverlayInfo *overlay_info;
5141d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   int numOverlaysPerScreen, i;
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5161d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   overlay_info = GetOverlayInfo(dpy, vinfo->screen, &numOverlaysPerScreen);
5171d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   if (!overlay_info) {
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return -1;
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5211d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   for (i = 0; i < numOverlaysPerScreen; i++) {
5221d97c277e0cb2b75559d495a58222f2511212a66Brian Paul      const OverlayInfo *ov = overlay_info + i;
5231d97c277e0cb2b75559d495a58222f2511212a66Brian Paul      if (ov->overlay_visual == vinfo->visualid) {
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* found it! */
5251d97c277e0cb2b75559d495a58222f2511212a66Brian Paul         if (ov->transparent_type == 0) {
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* type 0 indicates no transparency */
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return -1;
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* ov->value is the transparent pixel */
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return ov->value;
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* The visual ID was not found in the overlay list. */
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XFree((void *) overlay_info);
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return -1;
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5451d97c277e0cb2b75559d495a58222f2511212a66Brian Paul/**
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Try to get an X visual which matches the given arguments.
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
5487287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulstatic XVisualInfo *
5497287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulget_visual( Display *dpy, int scr, unsigned int depth, int xclass )
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo temp, *vis;
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   long mask;
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int n;
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned int default_depth;
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int default_class;
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   mask = VisualScreenMask | VisualDepthMask | VisualClassMask;
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.screen = scr;
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.depth = depth;
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.CLASS = xclass;
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   default_depth = DefaultDepth(dpy,scr);
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   default_class = DefaultVisual(dpy,scr)->CLASS;
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (depth==default_depth && xclass==default_class) {
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* try to get root window's visual */
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      temp.visualid = DefaultVisual(dpy,scr)->visualid;
568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      mask |= VisualIDMask;
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   vis = XGetVisualInfo( dpy, mask, &temp, &n );
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* In case bits/pixel > 24, make sure color channels are still <=8 bits.
574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * An SGI Infinite Reality system, for example, can have 30bpp pixels:
575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * 10 bits per color channel.  Mesa's limited to a max of 8 bits/channel.
576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vis && depth > 24 && (xclass==TrueColor || xclass==DirectColor)) {
57871dea349d2be623b7819389428b0d6a124e8d184Brian Paul      if (_mesa_bitcount((GLuint) vis->red_mask  ) <= 8 &&
57971dea349d2be623b7819389428b0d6a124e8d184Brian Paul          _mesa_bitcount((GLuint) vis->green_mask) <= 8 &&
58071dea349d2be623b7819389428b0d6a124e8d184Brian Paul          _mesa_bitcount((GLuint) vis->blue_mask ) <= 8) {
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return vis;
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         XFree((void *) vis);
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return vis;
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Retrieve the value of the given environment variable and find
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the X visual which matches it.
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy - the display
598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         screen - the screen number
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         varname - the name of the environment variable
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  an XVisualInfo pointer to NULL if error.
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
6027287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulstatic XVisualInfo *
6037287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulget_env_visual(Display *dpy, int scr, const char *varname)
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   char value[100], type[100];
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int depth, xclass = -1;
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
609367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (!_mesa_getenv( varname )) {
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
613367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   _mesa_strncpy( value, _mesa_getenv(varname), 100 );
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   value[99] = 0;
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   sscanf( value, "%s %d", type, &depth );
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
618367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_strcmp(type,"TrueColor")==0)          xclass = TrueColor;
619367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"DirectColor")==0)   xclass = DirectColor;
620367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"PseudoColor")==0)   xclass = PseudoColor;
621367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"StaticColor")==0)   xclass = StaticColor;
622367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"GrayScale")==0)     xclass = GrayScale;
623367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_strcmp(type,"StaticGray")==0)    xclass = StaticGray;
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (xclass>-1 && depth>0) {
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_visual( dpy, scr, depth, xclass );
627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6322ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul   _mesa_warning(NULL, "GLX unable to find visual class=%s, depth=%d.",
6332ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul                 type, depth);
634d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Select an X visual which satisfies the RGBA/CI flag and minimum depth.
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy, screen - X display and screen number
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         rgba - GL_TRUE = RGBA mode, GL_FALSE = CI mode
644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         min_depth - minimum visual depth
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         preferred_class - preferred GLX visual class or DONT_CARE
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  pointer to an XVisualInfo or NULL.
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
6487287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulstatic XVisualInfo *
6497287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulchoose_x_visual( Display *dpy, int screen, GLboolean rgba, int min_depth,
6507287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul                 int preferred_class )
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
653db6aa58267cad3f502f03ab80b9deb6b75320a91Brian Paul   int xclass, visclass = 0;
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int depth;
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (rgba) {
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      Atom hp_cr_maps = XInternAtom(dpy, "_HP_RGB_SMOOTH_MAP_LIST", True);
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* First see if the MESA_RGB_VISUAL env var is defined */
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_env_visual( dpy, screen, "MESA_RGB_VISUAL" );
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Otherwise, search for a suitable visual */
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class==DONT_CARE) {
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (xclass=0;xclass<6;xclass++) {
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            switch (xclass) {
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 0:  visclass = TrueColor;    break;
668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 1:  visclass = DirectColor;  break;
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 2:  visclass = PseudoColor;  break;
670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 3:  visclass = StaticColor;  break;
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 4:  visclass = GrayScale;    break;
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 5:  visclass = StaticGray;   break;
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (min_depth==0) {
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               /* start with shallowest */
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (depth=0;depth<=32;depth++) {
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (visclass==TrueColor && depth==8 && !hp_cr_maps) {
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* Special case:  try to get 8-bit PseudoColor before */
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* 8-bit TrueColor */
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     vis = get_visual( dpy, screen, 8, PseudoColor );
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     if (vis) {
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                        return vis;
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     }
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  vis = get_visual( dpy, screen, depth, visclass );
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (vis) {
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     return vis;
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            else {
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               /* start with deepest */
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (depth=32;depth>=min_depth;depth--) {
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (visclass==TrueColor && depth==8 && !hp_cr_maps) {
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* Special case:  try to get 8-bit PseudoColor before */
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* 8-bit TrueColor */
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     vis = get_visual( dpy, screen, 8, PseudoColor );
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     if (vis) {
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                        return vis;
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     }
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  vis = get_visual( dpy, screen, depth, visclass );
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (vis) {
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     return vis;
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* search for a specific visual class */
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         switch (preferred_class) {
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_TRUE_COLOR_EXT:    visclass = TrueColor;    break;
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_DIRECT_COLOR_EXT:  visclass = DirectColor;  break;
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_PSEUDO_COLOR_EXT:  visclass = PseudoColor;  break;
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_COLOR_EXT:  visclass = StaticColor;  break;
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_GRAY_SCALE_EXT:    visclass = GrayScale;    break;
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_GRAY_EXT:   visclass = StaticGray;   break;
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            default:   return NULL;
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (min_depth==0) {
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* start with shallowest */
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=0;depth<=32;depth++) {
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* start with deepest */
732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=32;depth>=min_depth;depth--) {
733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* First see if the MESA_CI_VISUAL env var is defined */
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_env_visual( dpy, screen, "MESA_CI_VISUAL" );
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Otherwise, search for a suitable visual, starting with shallowest */
748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class==DONT_CARE) {
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (xclass=0;xclass<4;xclass++) {
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            switch (xclass) {
751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 0:  visclass = PseudoColor;  break;
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 1:  visclass = StaticColor;  break;
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 2:  visclass = GrayScale;    break;
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 3:  visclass = StaticGray;   break;
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* try 8-bit up through 16-bit */
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=8;depth<=16;depth++) {
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* try min_depth up to 8-bit */
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=min_depth;depth<8;depth++) {
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* search for a specific visual class */
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         switch (preferred_class) {
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_TRUE_COLOR_EXT:    visclass = TrueColor;    break;
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_DIRECT_COLOR_EXT:  visclass = DirectColor;  break;
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_PSEUDO_COLOR_EXT:  visclass = PseudoColor;  break;
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_COLOR_EXT:  visclass = StaticColor;  break;
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_GRAY_SCALE_EXT:    visclass = GrayScale;    break;
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_GRAY_EXT:   visclass = StaticGray;   break;
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            default:   return NULL;
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* try 8-bit up through 16-bit */
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (depth=8;depth<=16;depth++) {
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            vis = get_visual( dpy, screen, depth, visclass );
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (vis) {
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               return vis;
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* try min_depth up to 8-bit */
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (depth=min_depth;depth<8;depth++) {
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            vis = get_visual( dpy, screen, depth, visclass );
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (vis) {
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               return vis;
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* didn't find a visual */
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Find the deepest X over/underlay visual of at least min_depth.
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy, screen - X display and screen number
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         level - the over/underlay level
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         trans_type - transparent pixel type: GLX_NONE_EXT,
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                      GLX_TRANSPARENT_RGB_EXT, GLX_TRANSPARENT_INDEX_EXT,
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                      or DONT_CARE
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         trans_value - transparent pixel value or DONT_CARE
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         min_depth - minimum visual depth
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         preferred_class - preferred GLX visual class or DONT_CARE
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  pointer to an XVisualInfo or NULL.
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
8187287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulstatic XVisualInfo *
8197287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulchoose_x_overlay_visual( Display *dpy, int scr, GLboolean rgbFlag,
8207287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul                         int level, int trans_type, int trans_value,
8217287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul                         int min_depth, int preferred_class )
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OverlayInfo *overlay_info;
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int numOverlaysPerScreen;
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *deepvis;
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int deepest;
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*DEBUG int tt, tv; */
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (preferred_class) {
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRUE_COLOR_EXT:    preferred_class = TrueColor;    break;
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DIRECT_COLOR_EXT:  preferred_class = DirectColor;  break;
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_PSEUDO_COLOR_EXT:  preferred_class = PseudoColor;  break;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STATIC_COLOR_EXT:  preferred_class = StaticColor;  break;
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_GRAY_SCALE_EXT:    preferred_class = GrayScale;    break;
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STATIC_GRAY_EXT:   preferred_class = StaticGray;   break;
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:                    preferred_class = DONT_CARE;
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
8411d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   overlay_info = GetOverlayInfo(dpy, scr, &numOverlaysPerScreen);
8421d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   if (!overlay_info) {
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Search for the deepest overlay which satisifies all criteria. */
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   deepest = min_depth;
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   deepvis = NULL;
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
8501d97c277e0cb2b75559d495a58222f2511212a66Brian Paul   for (i = 0; i < numOverlaysPerScreen; i++) {
8511d97c277e0cb2b75559d495a58222f2511212a66Brian Paul      const OverlayInfo *ov = overlay_info + i;
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XVisualInfo *vislist, vistemplate;
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      int count;
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ov->layer!=level) {
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed overlay level criteria */
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!(trans_type==DONT_CARE
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            || (trans_type==GLX_TRANSPARENT_INDEX_EXT
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                && ov->transparent_type>0)
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            || (trans_type==GLX_NONE_EXT && ov->transparent_type==0))) {
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed transparent pixel type criteria */
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (trans_value!=DONT_CARE && trans_value!=ov->value) {
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed transparent pixel value criteria */
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* get XVisualInfo and check the depth */
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vistemplate.visualid = ov->overlay_visual;
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vistemplate.screen = scr;
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vislist = XGetVisualInfo( dpy, VisualIDMask | VisualScreenMask,
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                &vistemplate, &count );
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (count!=1) {
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* something went wrong */
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class!=DONT_CARE && preferred_class!=vislist->CLASS) {
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* wrong visual class */
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
88642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      /* if RGB was requested, make sure we have True/DirectColor */
88742f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (rgbFlag && vislist->CLASS != TrueColor
88842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul          && vislist->CLASS != DirectColor)
88942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         continue;
89042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul
89142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      /* if CI was requested, make sure we have a color indexed visual */
89242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (!rgbFlag
89342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul          && (vislist->CLASS == TrueColor || vislist->CLASS == DirectColor))
89442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         continue;
89542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (deepvis==NULL || vislist->depth > deepest) {
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* YES!  found a satisfactory visual */
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (deepvis) {
89980af3614d88c0cac160e787de7f34b37e96cb626Brian Paul            XFree( deepvis );
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         deepest = vislist->depth;
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         deepvis = vislist;
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* DEBUG  tt = ov->transparent_type;*/
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* DEBUG  tv = ov->value; */
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*DEBUG
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (deepvis) {
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      printf("chose 0x%x:  layer=%d depth=%d trans_type=%d trans_value=%d\n",
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg             deepvis->visualid, level, deepvis->depth, tt, tv );
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg*/
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return deepvis;
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9187cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/
9197cf50e137da497a590ec9001a9918972a6246142Brian Paul/***                  Begin Fake GLX API Functions                  ***/
9207cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/
9217cf50e137da497a590ec9001a9918972a6246142Brian Paul
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
923ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul/**
924ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul * Helper used by glXChooseVisual and glXChooseFBConfig.
925ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul * The fbConfig parameter must be GL_FALSE for the former and GL_TRUE for
926ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul * the later.
927ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul * In either case, the attribute list is terminated with the value 'None'.
928ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul */
9297287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulstatic XMesaVisual
9301f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paulchoose_visual( Display *dpy, int screen, const int *list, GLboolean fbConfig )
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
9321f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul   const GLboolean rgbModeDefault = fbConfig;
9333265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   const int *parselist;
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int min_ci = 0;
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int min_red=0, min_green=0, min_blue=0;
937b3063ac398b72e6a4fd2015d4e220495b9779294Brian Paul   GLboolean rgb_flag = rgbModeDefault;
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean alpha_flag = GL_FALSE;
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean double_flag = GL_FALSE;
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean stereo_flag = GL_FALSE;
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint depth_size = 0;
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint stencil_size = 0;
943b2e460018375f699198073a6167e0ee96ba1d267Brian Paul   GLint accumRedSize = 0;
944b2e460018375f699198073a6167e0ee96ba1d267Brian Paul   GLint accumGreenSize = 0;
945b2e460018375f699198073a6167e0ee96ba1d267Brian Paul   GLint accumBlueSize = 0;
946b2e460018375f699198073a6167e0ee96ba1d267Brian Paul   GLint accumAlphaSize = 0;
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int level = 0;
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int visual_type = DONT_CARE;
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int trans_type = DONT_CARE;
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int trans_value = DONT_CARE;
951e1210b176926349b258c7ec77b7f36716025c82aBrian Paul   GLint caveat = DONT_CARE;
9523265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual xmvis = NULL;
9533a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul   int desiredVisualID = -1;
954894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul   int numAux = 0;
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   parselist = list;
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   while (*parselist) {
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      switch (*parselist) {
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_USE_GL:
9621f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            if (fbConfig) {
9631f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               /* invalid token */
9641f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               return NULL;
9651f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            }
9661f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            else {
9671f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               /* skip */
9681f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               parselist++;
9691f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            }
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_BUFFER_SIZE:
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_ci = *parselist++;
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_LEVEL:
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            level = *parselist++;
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_RGBA:
9801f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            if (fbConfig) {
9811f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               /* invalid token */
9821f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               return NULL;
9831f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            }
9841f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            else {
9851f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               rgb_flag = GL_TRUE;
9861f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               parselist++;
9871f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            }
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_DOUBLEBUFFER:
9901f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            parselist++;
9911f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            if (fbConfig) {
9921f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               double_flag = *parselist++;
9931f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            }
9941f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            else {
9951f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               double_flag = GL_TRUE;
9961f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            }
997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_STEREO:
9991f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            parselist++;
10001f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            if (fbConfig) {
10011f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               stereo_flag = *parselist++;
10021f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            }
10031f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            else {
10041f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul               stereo_flag = GL_TRUE;
10051f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            }
10061f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            return NULL; /* stereo not supported */
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_AUX_BUFFERS:
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1009894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul            numAux = *parselist++;
1010894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul            if (numAux > MAX_AUX_BUFFERS)
1011894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul               return NULL;
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_RED_SIZE:
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_red = *parselist++;
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_GREEN_SIZE:
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_green = *parselist++;
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_BLUE_SIZE:
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_blue = *parselist++;
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ALPHA_SIZE:
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            {
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLint size = *parselist++;
1029c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul               alpha_flag = size ? GL_TRUE : GL_FALSE;
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_DEPTH_SIZE:
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    depth_size = *parselist++;
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_STENCIL_SIZE:
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    stencil_size = *parselist++;
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_RED_SIZE:
1041b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	    parselist++;
1042b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            {
1043b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               GLint size = *parselist++;
1044b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               accumRedSize = MAX2( accumRedSize, size );
1045b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            }
1046b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            break;
1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_GREEN_SIZE:
1048b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	    parselist++;
1049b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            {
1050b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               GLint size = *parselist++;
1051b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               accumGreenSize = MAX2( accumGreenSize, size );
1052b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            }
1053b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            break;
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_BLUE_SIZE:
1055b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	    parselist++;
1056b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            {
1057b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               GLint size = *parselist++;
1058b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               accumBlueSize = MAX2( accumBlueSize, size );
1059b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            }
1060b2e460018375f699198073a6167e0ee96ba1d267Brian Paul            break;
1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_ALPHA_SIZE:
1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            {
1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLint size = *parselist++;
1065b2e460018375f699198073a6167e0ee96ba1d267Brian Paul               accumAlphaSize = MAX2( accumAlphaSize, size );
1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /*
1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          * GLX_EXT_visual_info extension
1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          */
1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_X_VISUAL_TYPE_EXT:
1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            visual_type = *parselist++;
1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_TYPE_EXT:
1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            trans_type = *parselist++;
1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_INDEX_VALUE_EXT:
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            trans_value = *parselist++;
1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_RED_VALUE_EXT:
1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_GREEN_VALUE_EXT:
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_BLUE_VALUE_EXT:
1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_ALPHA_VALUE_EXT:
1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* ignore */
1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
10925e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
1093e1210b176926349b258c7ec77b7f36716025c82aBrian Paul         /*
1094e1210b176926349b258c7ec77b7f36716025c82aBrian Paul          * GLX_EXT_visual_info extension
1095e1210b176926349b258c7ec77b7f36716025c82aBrian Paul          */
1096e1210b176926349b258c7ec77b7f36716025c82aBrian Paul         case GLX_VISUAL_CAVEAT_EXT:
1097e1210b176926349b258c7ec77b7f36716025c82aBrian Paul            parselist++;
1098e1210b176926349b258c7ec77b7f36716025c82aBrian Paul            caveat = *parselist++; /* ignored for now */
1099e1210b176926349b258c7ec77b7f36716025c82aBrian Paul            break;
1100e1210b176926349b258c7ec77b7f36716025c82aBrian Paul
11013265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         /*
110266ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul          * GLX_ARB_multisample
110366ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul          */
110466ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul         case GLX_SAMPLE_BUFFERS_ARB:
110566ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul            /* ms not supported */
110666ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul            return NULL;
110766ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul         case GLX_SAMPLES_ARB:
110866ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul            /* ms not supported */
110966ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul            return NULL;
111066ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul
111166ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul         /*
11123265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul          * FBConfig attribs.
11133265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul          */
11143265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         case GLX_RENDER_TYPE:
1115dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul            if (!fbConfig)
1116dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul               return NULL;
11173265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            parselist++;
11183265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            if (*parselist == GLX_RGBA_BIT) {
11193265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul               rgb_flag = GL_TRUE;
11203265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            }
11213265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            else if (*parselist == GLX_COLOR_INDEX_BIT) {
11223265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul               rgb_flag = GL_FALSE;
11233265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            }
11243265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            else if (*parselist == 0) {
11253265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul               rgb_flag = GL_TRUE;
11263265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            }
11273265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            parselist++;
11283265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            break;
11293265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         case GLX_DRAWABLE_TYPE:
1130dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul            if (!fbConfig)
1131dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul               return NULL;
11323265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            parselist++;
11333265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            if (*parselist & ~(GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT)) {
11343265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul               return NULL; /* bad bit */
11353265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            }
11363265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            parselist++;
11373265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            break;
11383a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul         case GLX_FBCONFIG_ID:
1139dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul            if (!fbConfig)
1140dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul               return NULL;
11413a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul            parselist++;
1142dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul            desiredVisualID = *parselist++;
1143dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul            break;
1144dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul         case GLX_X_RENDERABLE:
1145dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul            if (!fbConfig)
1146dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul               return NULL;
1147dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul            parselist += 2;
1148dfb6c56ed85d7b11b6e7e9b0a5ec7eddb1162510Brian Paul            /* ignore */
11493a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul            break;
11503265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case None:
11523a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul            /* end of list */
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
11543265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 default:
1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* undefined attribute */
11572ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL, "unexpected attrib 0x%x in choose_visual()",
11582ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul                          *parselist);
1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return NULL;
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1163b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul   (void) caveat;
1164b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul
1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * Since we're only simulating the GLX extension this function will never
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * find any real GL visuals.  Instead, all we can do is try to find an RGB
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * or CI visual of appropriate depth.  Other requested attributes such as
1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * double buffering, depth buffer, etc. will be associated with the X
1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * visual and stored in the VisualTable[].
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
11723a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul   if (desiredVisualID != -1) {
11733a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul      /* try to get a specific visual, by visualID */
11743a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul      XVisualInfo temp;
11753a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul      int n;
11763a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul      temp.visualid = desiredVisualID;
11773a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul      temp.screen = screen;
11783a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul      vis = XGetVisualInfo(dpy, VisualIDMask | VisualScreenMask, &temp, &n);
11793a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul      if (vis) {
11803a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul         /* give the visual some useful GLX attributes */
11813a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul         double_flag = GL_TRUE;
11823a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul         if (vis->depth > 8)
11833a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul            rgb_flag = GL_TRUE;
1184dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul         depth_size = default_depth_bits();
11853a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul         stencil_size = STENCIL_BITS;
11863a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul         /* XXX accum??? */
11873a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul      }
11883a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul   }
11893a99674980c1fd76649ac48a95402bedc75a5e46Brian Paul   else if (level==0) {
1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* normal color planes */
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (rgb_flag) {
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Get an RGB visual */
1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         int min_rgb = min_red + min_green + min_blue;
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (min_rgb>1 && min_rgb<8) {
1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* a special case to be sure we can get a monochrome visual */
1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            min_rgb = 1;
1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         vis = choose_x_visual( dpy, screen, rgb_flag, min_rgb, visual_type );
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Get a color index visual */
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         vis = choose_x_visual( dpy, screen, rgb_flag, min_ci, visual_type );
1203b2e460018375f699198073a6167e0ee96ba1d267Brian Paul         accumRedSize = accumGreenSize = accumBlueSize = accumAlphaSize = 0;
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* over/underlay planes */
120842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (rgb_flag) {
120942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         /* rgba overlay */
121042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         int min_rgb = min_red + min_green + min_blue;
121142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         if (min_rgb>1 && min_rgb<8) {
121242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul            /* a special case to be sure we can get a monochrome visual */
121342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul            min_rgb = 1;
121442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         }
121542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level,
121642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul                              trans_type, trans_value, min_rgb, visual_type );
121742f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      }
121842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      else {
121942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         /* color index overlay */
122042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level,
122142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul                              trans_type, trans_value, min_ci, visual_type );
122242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      }
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vis) {
1226ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      /* Note: we're not exactly obeying the glXChooseVisual rules here.
1227ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul       * When GLX_DEPTH_SIZE = 1 is specified we're supposed to choose the
12282c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul       * largest depth buffer size, which is 32bits/value.  Instead, we
1229ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul       * return 16 to maintain performance with earlier versions of Mesa.
1230ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul       */
12312c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul      if (depth_size > 24)
12329e4e3adcf82a72e9a74f21b492fbf5552ebfd47fBrian Paul         depth_size = 32;
1233ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      else if (depth_size > 16)
1234ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul         depth_size = 24;
1235dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul      else if (depth_size > 0) {
1236dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul         depth_size = default_depth_bits();
1237dfa5c2bfbbba1e24829582863caeafd97f124d5eBrian Paul      }
12382c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul
1239c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul      if (!alpha_flag) {
1240c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul         alpha_flag = default_alpha_bits() > 0;
1241c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul      }
1242c12ee99d119debe1a421a77c1cc6d99d958ae94bBrian Paul
1243ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      /* we only support one size of stencil and accum buffers. */
1244ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul      if (stencil_size > 0)
1245ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul         stencil_size = STENCIL_BITS;
12466d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul      if (accumRedSize > 0 || accumGreenSize > 0 || accumBlueSize > 0 ||
12476d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul          accumAlphaSize > 0) {
1248978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul         accumRedSize =
1249978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul         accumGreenSize =
1250978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul         accumBlueSize = default_accum_bits();
1251978ef2bb6d9ca4996a24f95820a699e22c84f70bBrian Paul         accumAlphaSize = alpha_flag ? accumRedSize : 0;
12526d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul      }
12536d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul
12543265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      xmvis = save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
12553265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                               stereo_flag, depth_size, stencil_size,
12563265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                               accumRedSize, accumGreenSize,
1257894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul                               accumBlueSize, accumAlphaSize, level, numAux );
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
12603265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return xmvis;
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
12643265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paulstatic XVisualInfo *
12653265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXChooseVisual( Display *dpy, int screen, int *list )
12663265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul{
1267b3063ac398b72e6a4fd2015d4e220495b9779294Brian Paul   XMesaVisual xmvis = choose_visual(dpy, screen, list, GL_FALSE);
1268f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   if (xmvis) {
1269f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#if 0
1270f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      return xmvis->vishandle;
1271f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#else
1272f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      /* create a new vishandle - the cached one may be stale */
12734039cb8ca82d59451a6de8902fe35e693cdca3baBrian Paul      xmvis->vishandle = (XVisualInfo *) _mesa_malloc(sizeof(XVisualInfo));
1274f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      if (xmvis->vishandle) {
1275f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul         _mesa_memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo));
1276f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      }
12773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      return xmvis->vishandle;
1278f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#endif
1279f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   }
12803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   else
12813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      return NULL;
12823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul}
1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1285426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXContext
1286426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateContext( Display *dpy, XVisualInfo *visinfo,
1287426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       GLXContext share_list, Bool direct )
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1289e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis;
12907cf50e137da497a590ec9001a9918972a6246142Brian Paul   struct fake_glx_context *glxCtx;
12915e1680ce1d8296b2182e8909856927bbeddf3b95Brian Paul   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
129299aab341998e84d9fa208c525cae8021b3845812Brian Paul
129399aab341998e84d9fa208c525cae8021b3845812Brian Paul   if (!dpy || !visinfo)
129499aab341998e84d9fa208c525cae8021b3845812Brian Paul      return 0;
129599aab341998e84d9fa208c525cae8021b3845812Brian Paul
12967cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx = CALLOC_STRUCT(fake_glx_context);
12977cf50e137da497a590ec9001a9918972a6246142Brian Paul   if (!glxCtx)
12987cf50e137da497a590ec9001a9918972a6246142Brian Paul      return 0;
1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* deallocate unused windows/buffers */
1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaGarbageCollect();
1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1303e4656003caee346d9c4eb23256d73409271291a7Brian Paul   xmvis = find_glx_visual( dpy, visinfo );
1304e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmvis) {
1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* This visual wasn't found with glXChooseVisual() */
1306e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmvis = create_glx_visual( dpy, visinfo );
1307e4656003caee346d9c4eb23256d73409271291a7Brian Paul      if (!xmvis) {
1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
13097cf50e137da497a590ec9001a9918972a6246142Brian Paul         FREE(glxCtx);
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1314e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->xmesaContext = XMesaCreateContext(xmvis,
13155e1680ce1d8296b2182e8909856927bbeddf3b95Brian Paul                                   shareCtx ? shareCtx->xmesaContext : NULL);
13167cf50e137da497a590ec9001a9918972a6246142Brian Paul   if (!glxCtx->xmesaContext) {
13177cf50e137da497a590ec9001a9918972a6246142Brian Paul      FREE(glxCtx);
13187cf50e137da497a590ec9001a9918972a6246142Brian Paul      return NULL;
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
13207cf50e137da497a590ec9001a9918972a6246142Brian Paul
13217cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx->xmesaContext->direct = GL_FALSE;
13227cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx->glxContext.isDirect = GL_FALSE;
13237cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx->glxContext.currentDpy = dpy;
13247cf50e137da497a590ec9001a9918972a6246142Brian Paul   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
13257cf50e137da497a590ec9001a9918972a6246142Brian Paul
13267cf50e137da497a590ec9001a9918972a6246142Brian Paul   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
13277cf50e137da497a590ec9001a9918972a6246142Brian Paul
13287cf50e137da497a590ec9001a9918972a6246142Brian Paul   return (GLXContext) glxCtx;
1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
13327cf50e137da497a590ec9001a9918972a6246142Brian Paul/* XXX these may have to be removed due to thread-safety issues. */
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLXContext MakeCurrent_PrevContext = 0;
1334086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic GLXDrawable MakeCurrent_PrevDrawable = 0;
1335086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic GLXDrawable MakeCurrent_PrevReadable = 0;
1336086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic XMesaBuffer MakeCurrent_PrevDrawBuffer = 0;
1337086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic XMesaBuffer MakeCurrent_PrevReadBuffer = 0;
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
13397cf50e137da497a590ec9001a9918972a6246142Brian Paul
1340086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul/* GLX 1.3 and later */
1341426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1342426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
13437a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell                            GLXDrawable read, GLXContext ctx )
1344086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul{
13457cf50e137da497a590ec9001a9918972a6246142Brian Paul   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
13467cf50e137da497a590ec9001a9918972a6246142Brian Paul
13477a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (ctx && draw && read) {
1348086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      XMesaBuffer drawBuffer, readBuffer;
13497cf50e137da497a590ec9001a9918972a6246142Brian Paul      XMesaContext xmctx = glxCtx->xmesaContext;
1350086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1351086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'draw' */
13527a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell      if (ctx == MakeCurrent_PrevContext
13537a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell          && draw == MakeCurrent_PrevDrawable) {
1354086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         drawBuffer = MakeCurrent_PrevDrawBuffer;
1355086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1356086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      else {
1357086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         drawBuffer = XMesaFindBuffer( dpy, draw );
1358086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1359086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      if (!drawBuffer) {
1360086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         /* drawable must be a new window! */
13617cf50e137da497a590ec9001a9918972a6246142Brian Paul         drawBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, draw, xmctx);
1362086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         if (!drawBuffer) {
1363086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            /* Out of memory, or context/drawable depth mismatch */
1364086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            return False;
1365086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         }
1366086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1367086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1368086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'read' */
13697a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell      if (ctx == MakeCurrent_PrevContext
1370086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul          && read == MakeCurrent_PrevReadable) {
1371086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         readBuffer = MakeCurrent_PrevReadBuffer;
1372086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1373086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      else {
1374086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         readBuffer = XMesaFindBuffer( dpy, read );
1375086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1376086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      if (!readBuffer) {
1377086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         /* drawable must be a new window! */
13787cf50e137da497a590ec9001a9918972a6246142Brian Paul         readBuffer = XMesaCreateWindowBuffer2(glxCtx->xmesaContext->xm_visual,
13797cf50e137da497a590ec9001a9918972a6246142Brian Paul                                               read, xmctx);
1380086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         if (!readBuffer) {
1381086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            /* Out of memory, or context/drawable depth mismatch */
1382086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            return False;
1383086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         }
1384086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1385086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
13867a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell      MakeCurrent_PrevContext = ctx;
1387086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawable = draw;
1388086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadable = read;
1389086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawBuffer = drawBuffer;
1390086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadBuffer = readBuffer;
1391086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1392086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Now make current! */
13937cf50e137da497a590ec9001a9918972a6246142Brian Paul      if (XMesaMakeCurrent2(xmctx, drawBuffer, readBuffer)) {
139412c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul         ((__GLXcontext *) ctx)->currentDpy = dpy;
139512c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul         ((__GLXcontext *) ctx)->currentDrawable = draw;
139612c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul         ((__GLXcontext *) ctx)->currentReadable = read;
13977cf50e137da497a590ec9001a9918972a6246142Brian Paul         return True;
13987cf50e137da497a590ec9001a9918972a6246142Brian Paul      }
13997cf50e137da497a590ec9001a9918972a6246142Brian Paul      else {
14007cf50e137da497a590ec9001a9918972a6246142Brian Paul         return False;
14017cf50e137da497a590ec9001a9918972a6246142Brian Paul      }
1402086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
14037a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   else if (!ctx && !draw && !read) {
1404086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* release current context w/out assigning new one. */
1405086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      XMesaMakeCurrent( NULL, NULL );
1406086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevContext = 0;
1407086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawable = 0;
1408086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadable = 0;
1409086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawBuffer = 0;
1410086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadBuffer = 0;
1411086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      return True;
1412086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
1413086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   else {
1414086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* The args must either all be non-zero or all zero.
1415086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul       * This is an error.
1416086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul       */
1417086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      return False;
1418086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
1419086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul}
1420086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1421086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1422426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1423426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
1424426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1425426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return Fake_glXMakeContextCurrent( dpy, drawable, drawable, ctx );
1426426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1427426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1428426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1429426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
1430426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual v;
1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b;
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   v = find_glx_visual( dpy, visinfo );
1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!v) {
1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      v = create_glx_visual( dpy, visinfo );
1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!v) {
1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
1440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!b) {
1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1448e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return b->frontxrb->pixmap;
1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1452b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_pixmap_colormap ***/
1453b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul
1454426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
1455426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
1456426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                             Pixmap pixmap, Colormap cmap )
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual v;
1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b;
1460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   v = find_glx_visual( dpy, visinfo );
1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!v) {
1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      v = create_glx_visual( dpy, visinfo );
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!v) {
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   b = XMesaCreatePixmapBuffer( v, pixmap, cmap );
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!b) {
1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1474e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return b->frontxrb->pixmap;
1475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1478426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1479426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b = XMesaFindBuffer(dpy, pixmap);
1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (b) {
1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaDestroyBuffer(b);
1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1485367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_getenv("MESA_DEBUG")) {
1486d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      _mesa_warning(NULL, "Mesa: glXDestroyGLXPixmap: invalid pixmap\n");
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1491426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1492426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
14933994b77bab8c62a4c1a4dffdfba233ef46662b99Brian Paul                     unsigned long mask )
1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
149583b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul   struct fake_glx_context *fakeSrc = (struct fake_glx_context *) src;
149683b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul   struct fake_glx_context *fakeDst = (struct fake_glx_context *) dst;
149783b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul   XMesaContext xm_src = fakeSrc->xmesaContext;
149883b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul   XMesaContext xm_dst = fakeDst->xmesaContext;
1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
150068edf28df68701ac429e53c0fd6dbb70b39c3fd0Brian Paul   if (MakeCurrent_PrevContext == src) {
150168edf28df68701ac429e53c0fd6dbb70b39c3fd0Brian Paul      _mesa_Flush();
150268edf28df68701ac429e53c0fd6dbb70b39c3fd0Brian Paul   }
15031e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_copy_context( &(xm_src->mesa), &(xm_dst->mesa), (GLuint) mask );
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1507426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1508426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryExtension( Display *dpy, int *errorb, int *event )
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Mesa's GLX isn't really an X extension but we try to act like one. */
1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) errorb;
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) event;
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return True;
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1518e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paulextern void _kw_ungrab_all( Display *dpy );
1519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid _kw_ungrab_all( Display *dpy )
1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XUngrabPointer( dpy, CurrentTime );
1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XUngrabKeyboard( dpy, CurrentTime );
1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1526426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1527426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyContext( Display *dpy, GLXContext ctx )
1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
15297cf50e137da497a590ec9001a9918972a6246142Brian Paul   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   MakeCurrent_PrevContext = 0;
1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   MakeCurrent_PrevDrawable = 0;
1533086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevReadable = 0;
1534086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevDrawBuffer = 0;
1535086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevReadBuffer = 0;
15367cf50e137da497a590ec9001a9918972a6246142Brian Paul   XMesaDestroyContext( glxCtx->xmesaContext );
1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaGarbageCollect();
1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1541426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1542426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXIsDirect( Display *dpy, GLXContext ctx )
1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
15447cf50e137da497a590ec9001a9918972a6246142Brian Paul   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
15467cf50e137da497a590ec9001a9918972a6246142Brian Paul   return glxCtx->xmesaContext->direct;
1547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1551426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1552426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSwapBuffers( Display *dpy, GLXDrawable drawable )
1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
1555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (buffer) {
1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaSwapBuffers(buffer);
1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1559367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_getenv("MESA_DEBUG")) {
1560ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul      _mesa_warning(NULL, "glXSwapBuffers: invalid drawable 0x%x\n",
1561ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul                    (int) drawable);
1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
15664c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul
1567b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_copy_sub_buffer ***/
1568b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul
1569426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1570426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
1571426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                           int x, int y, int width, int height )
1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (buffer) {
1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaCopySubBuffer(buffer, x, y, width, height);
1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1577367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   else if (_mesa_getenv("MESA_DEBUG")) {
1578d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul      _mesa_warning(NULL, "Mesa: glXCopySubBufferMESA: invalid drawable\n");
1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1583426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1584426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryVersion( Display *dpy, int *maj, int *min )
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Return GLX version, not Mesa version */
158878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   assert(CLIENT_MAJOR_VERSION == SERVER_MAJOR_VERSION);
158978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   *maj = CLIENT_MAJOR_VERSION;
159078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   *min = MIN2( CLIENT_MINOR_VERSION, SERVER_MINOR_VERSION );
1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return True;
1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Query the GLX attributes of the given XVisualInfo.
1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1598426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1599e4656003caee346d9c4eb23256d73409271291a7Brian Paulget_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig )
1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1601e4656003caee346d9c4eb23256d73409271291a7Brian Paul   ASSERT(xmvis);
1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch(attrib) {
1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_USE_GL:
16041f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul         if (fbconfig)
16051f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            return GLX_BAD_ATTRIBUTE;
1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = (int) True;
1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_BUFFER_SIZE:
1609e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->visinfo->depth;
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_LEVEL:
1612304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	 *value = xmvis->mesa_visual.level;
1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_RGBA:
16151f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul         if (fbconfig)
16161f98ee90228aa56df207cdbd223bb4b8c0bb15d9Brian Paul            return GLX_BAD_ATTRIBUTE;
1617e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 if (xmvis->mesa_visual.rgbMode) {
1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    *value = True;
1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    *value = False;
1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DOUBLEBUFFER:
1625e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = (int) xmvis->mesa_visual.doubleBufferMode;
1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STEREO:
1628e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = (int) xmvis->mesa_visual.stereoMode;
1629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_AUX_BUFFERS:
1631894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul	 *value = xmvis->mesa_visual.numAuxBuffers;
1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_RED_SIZE:
1634e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.redBits;
1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_GREEN_SIZE:
1637e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.greenBits;
1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_BLUE_SIZE:
1640e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.blueBits;
1641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ALPHA_SIZE:
1643e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.alphaBits;
1644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DEPTH_SIZE:
1646e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.depthBits;
1647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STENCIL_SIZE:
1649e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->mesa_visual.stencilBits;
1650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_RED_SIZE:
1652e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->mesa_visual.accumRedBits;
1653b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	 return 0;
1654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_GREEN_SIZE:
1655e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->mesa_visual.accumGreenBits;
1656b2e460018375f699198073a6167e0ee96ba1d267Brian Paul	 return 0;
1657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_BLUE_SIZE:
1658e4656003caee346d9c4eb23256d73409271291a7Brian Paul	 *value = xmvis->mesa_visual.accumBlueBits;
1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_ALPHA_SIZE:
1661e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->mesa_visual.accumAlphaBits;
1662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /*
1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       * GLX_EXT_visual_info extension
1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       */
1667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_X_VISUAL_TYPE_EXT:
1668e4656003caee346d9c4eb23256d73409271291a7Brian Paul         switch (xmvis->visinfo->CLASS) {
1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case StaticGray:   *value = GLX_STATIC_GRAY_EXT;   return 0;
1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GrayScale:    *value = GLX_GRAY_SCALE_EXT;    return 0;
1671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case StaticColor:  *value = GLX_STATIC_GRAY_EXT;   return 0;
1672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case PseudoColor:  *value = GLX_PSEUDO_COLOR_EXT;  return 0;
1673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case TrueColor:    *value = GLX_TRUE_COLOR_EXT;    return 0;
1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case DirectColor:  *value = GLX_DIRECT_COLOR_EXT;  return 0;
1675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_TYPE_EXT:
1678304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick         if (xmvis->mesa_visual.level==0) {
1679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* normal planes */
1680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *value = GLX_NONE_EXT;
1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1682304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick         else if (xmvis->mesa_visual.level>0) {
1683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* overlay */
1684e4656003caee346d9c4eb23256d73409271291a7Brian Paul            if (xmvis->mesa_visual.rgbMode) {
1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = GLX_TRANSPARENT_RGB_EXT;
1686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            else {
1688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = GLX_TRANSPARENT_INDEX_EXT;
1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1691304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick         else if (xmvis->mesa_visual.level<0) {
1692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* underlay */
1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *value = GLX_NONE_EXT;
1694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_INDEX_VALUE_EXT:
1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         {
1698e4656003caee346d9c4eb23256d73409271291a7Brian Paul            int pixel = transparent_pixel( xmvis );
1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (pixel>=0) {
1700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = pixel;
1701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* else undefined */
1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_RED_VALUE_EXT:
1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_GREEN_VALUE_EXT:
1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_BLUE_VALUE_EXT:
1712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_ALPHA_VALUE_EXT:
1715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /*
1719b2e460018375f699198073a6167e0ee96ba1d267Brian Paul       * GLX_EXT_visual_info extension
1720b2e460018375f699198073a6167e0ee96ba1d267Brian Paul       */
1721b2e460018375f699198073a6167e0ee96ba1d267Brian Paul      case GLX_VISUAL_CAVEAT_EXT:
1722fc68be6b111473a0bf8f991468f973bb9dd275f4Brian Paul         /* test for zero, just in case */
1723304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick         if (xmvis->mesa_visual.visualRating > 0)
1724304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick            *value = xmvis->mesa_visual.visualRating;
1725962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul         else
1726962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul            *value = GLX_NONE_EXT;
1727962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul         return 0;
1728b2e460018375f699198073a6167e0ee96ba1d267Brian Paul
1729b2e460018375f699198073a6167e0ee96ba1d267Brian Paul      /*
173066ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul       * GLX_ARB_multisample
1731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       */
173266ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul      case GLX_SAMPLE_BUFFERS_ARB:
17333265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *value = 0;
17343265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         return 0;
173566ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul      case GLX_SAMPLES_ARB:
17363265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *value = 0;
17373265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         return 0;
17383265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
17393265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      /*
17403265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul       * For FBConfigs:
17413265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul       */
17423265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_SCREEN_EXT:
17433265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17443265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1745e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = xmvis->visinfo->screen;
17463265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17473265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_DRAWABLE_TYPE: /*SGIX too */
17483265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17493265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
17503265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *value = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
17513265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17523265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_RENDER_TYPE_SGIX:
17533265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17543265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1755e4656003caee346d9c4eb23256d73409271291a7Brian Paul         if (xmvis->mesa_visual.rgbMode)
17563265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            *value = GLX_RGBA_BIT;
17573265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         else
17583265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            *value = GLX_COLOR_INDEX_BIT;
17593265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17603265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_X_RENDERABLE_SGIX:
17613265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17623265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
17633265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *value = True; /* XXX really? */
17643265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17653265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_FBCONFIG_ID_SGIX:
17663265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17673265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1768f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul         *value = xmvis->visinfo->visualid;
17693265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_MAX_PBUFFER_WIDTH:
17713265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
17733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         /* XXX or MAX_WIDTH? */
1774f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul         *value = DisplayWidth(xmvis->display, xmvis->visinfo->screen);
17753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_MAX_PBUFFER_HEIGHT:
17773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1779f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul         *value = DisplayHeight(xmvis->display, xmvis->visinfo->screen);
17803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_MAX_PBUFFER_PIXELS:
17823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17833265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1784f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul         *value = DisplayWidth(xmvis->display, xmvis->visinfo->screen) *
1785f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul                  DisplayHeight(xmvis->display, xmvis->visinfo->screen);
17863265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17873265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      case GLX_VISUAL_ID:
17883265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         if (!fbconfig)
17893265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return GLX_BAD_ATTRIBUTE;
1790f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul         *value = xmvis->visinfo->visualid;
17913265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         break;
17923265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GLX_BAD_ATTRIBUTE;
1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
17963265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return Success;
1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
18003265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paulstatic int
18013265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
18023265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                   int attrib, int *value )
18033265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul{
1804e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis;
1805ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul   int k;
1806379641956d134b8dc761b6411d7c4dca8f94a092Brian Paul   if (!dpy || !visinfo)
1807a9a1c3f20f2d6aad4afc47cf2b29c5393fddb6b6Brian Paul      return GLX_BAD_ATTRIBUTE;
1808a9a1c3f20f2d6aad4afc47cf2b29c5393fddb6b6Brian Paul
1809e4656003caee346d9c4eb23256d73409271291a7Brian Paul   xmvis = find_glx_visual( dpy, visinfo );
1810e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmvis) {
18113265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      /* this visual wasn't obtained with glXChooseVisual */
1812e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmvis = create_glx_visual( dpy, visinfo );
1813e4656003caee346d9c4eb23256d73409271291a7Brian Paul      if (!xmvis) {
18143265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 /* this visual can't be used for GL rendering */
18153265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 if (attrib==GLX_USE_GL) {
18163265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	    *value = (int) False;
18173265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	    return 0;
18183265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 }
18193265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 else {
18203265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	    return GLX_BAD_VISUAL;
18213265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul	 }
18223265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
18233265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   }
18243265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1825ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul   k = get_config(xmvis, attrib, value, GL_FALSE);
1826ba0fe1832e3573c7ec872ba9bfb1cf1773e384c6Brian Paul   return k;
18273265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul}
18283265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1830426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1831426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitGL( void )
1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xmesa = XMesaGetCurrentContext();
1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaFlush( xmesa );
1835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1839426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1840426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitX( void )
1841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xmesa = XMesaGetCurrentContext();
1843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaFlush( xmesa );
1844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1847e4656003caee346d9c4eb23256d73409271291a7Brian Paulstatic const char *
1848e4656003caee346d9c4eb23256d73409271291a7Brian Paulget_extensions( void )
184943c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul{
185043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul#ifdef FX
1851367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   const char *fx = _mesa_getenv("MESA_GLX_FX");
185243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   if (fx && fx[0] != 'd') {
1853e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return EXTENSIONS;
185443c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   }
185543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul#endif
1856e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return EXTENSIONS + 23; /* skip "GLX_MESA_set_3dfx_mode" */
185743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul}
1858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1862426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1863426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryExtensionsString( Display *dpy, int screen )
1864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) screen;
186743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   return get_extensions();
1868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1873426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1874426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryServerString( Display *dpy, int screen, int name )
1875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
187678fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   static char version[1000];
18772ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul   _mesa_sprintf(version, "%d.%d %s",
18782ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul                 SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION, MESA_GLX_VERSION);
1879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) screen;
1882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_EXTENSIONS:
188543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul         return get_extensions();
1886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VENDOR:
188778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul	 return VENDOR;
1888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VERSION:
1889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return version;
1890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1898426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1899426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetClientString( Display *dpy, int name )
1900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
190178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   static char version[1000];
19022ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul   _mesa_sprintf(version, "%d.%d %s", CLIENT_MAJOR_VERSION,
19032ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul                 CLIENT_MINOR_VERSION, MESA_GLX_VERSION);
1904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_EXTENSIONS:
190943c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul         return get_extensions();
1910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VENDOR:
191178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul	 return VENDOR;
1912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VERSION:
1913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return version;
1914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1921426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul/*
1922426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul * GLX 1.3 and later
1923426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul */
1924426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
19257d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
1926426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1927426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
1928426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                           int attribute, int *value )
1929426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
19303265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual v = (XMesaVisual) config;
1931426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1932426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
19337d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19347d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!dpy || !config || !value)
19357d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return -1;
19367d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
19373265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return get_config(v, attribute, value, GL_TRUE);
1938426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1939426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1940426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
19415605798e56ca6e9f968623f33b58ee7ca90594afBrian Paulstatic GLXFBConfig *
19425605798e56ca6e9f968623f33b58ee7ca90594afBrian PaulFake_glXGetFBConfigs( Display *dpy, int screen, int *nelements )
19435605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul{
19443265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XVisualInfo *visuals, visTemplate;
19453265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   const long visMask = VisualScreenMask;
19463265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   int i;
19473265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
19483265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   /* Get list of all X visuals */
19493265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   visTemplate.screen = screen;
19503265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   visuals = XGetVisualInfo(dpy, visMask, &visTemplate, nelements);
19513265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   if (*nelements > 0) {
19523265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      XMesaVisual *results;
19534039cb8ca82d59451a6de8902fe35e693cdca3baBrian Paul      results = (XMesaVisual *) _mesa_malloc(*nelements * sizeof(XMesaVisual));
19543265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      if (!results) {
19553265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         *nelements = 0;
19563265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         return NULL;
19573265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
19583265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      for (i = 0; i < *nelements; i++) {
19593265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         results[i] = create_glx_visual(dpy, visuals + i);
19603265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
19613265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      return (GLXFBConfig *) results;
19623265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   }
19633265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return NULL;
19645605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul}
19655605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul
19665605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul
1967481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paulstatic GLXFBConfig *
1968481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian PaulFake_glXChooseFBConfig( Display *dpy, int screen,
1969481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul                        const int *attribList, int *nitems )
1970481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul{
1971481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul   XMesaVisual xmvis;
1972481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul
1973481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul   if (!attribList || !attribList[0]) {
1974481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      /* return list of all configs (per GLX_SGIX_fbconfig spec) */
1975481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      return Fake_glXGetFBConfigs(dpy, screen, nitems);
1976481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul   }
1977481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul
1978481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul   xmvis = choose_visual(dpy, screen, attribList, GL_TRUE);
1979481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul   if (xmvis) {
1980481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      GLXFBConfig *config = (GLXFBConfig *) _mesa_malloc(sizeof(XMesaVisual));
1981481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      if (!config) {
1982481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul         *nitems = 0;
1983481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul         return NULL;
1984481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      }
1985481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      *nitems = 1;
1986481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      config[0] = (GLXFBConfig) xmvis;
1987481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      return (GLXFBConfig *) config;
1988481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul   }
1989481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul   else {
1990481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      *nitems = 0;
1991481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul      return NULL;
1992481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul   }
1993481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul}
1994481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul
1995481bdd383ac309cda8e471215b8fd3d6b5fa8cadBrian Paul
1996426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic XVisualInfo *
1997426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
1998426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
19997d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (dpy && config) {
2000f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      XMesaVisual xmvis = (XMesaVisual) config;
2001f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#if 0
2002f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      return xmvis->vishandle;
2003f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#else
2004f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      /* create a new vishandle - the cached one may be stale */
20054039cb8ca82d59451a6de8902fe35e693cdca3baBrian Paul      xmvis->vishandle = (XVisualInfo *) _mesa_malloc(sizeof(XVisualInfo));
2006f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      if (xmvis->vishandle) {
2007f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul         _mesa_memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo));
2008f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      }
2009f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      return xmvis->vishandle;
2010f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#endif
20117d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
20127d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   else {
20137d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return NULL;
20147d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
2015426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2016426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2017426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2018426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXWindow
2019426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
2020426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                      const int *attribList )
2021426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2022529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
2023529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul   XMesaBuffer xmbuf;
2024529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul   if (!xmvis)
2025529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul      return 0;
2026529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul
2027529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul   xmbuf = XMesaCreateWindowBuffer2(xmvis, win, NULL);
2028529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul   if (!xmbuf)
2029529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul      return 0;
2030529614cd1a1e426ca7ad019795a6b72ad51cd9e6Brian Paul
2031426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
20327d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   (void) attribList;  /* Ignored in GLX 1.3 */
20337d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20347d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   return win;  /* A hack for now */
2035426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2036426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2037426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2038426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2039426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyWindow( Display *dpy, GLXWindow window )
2040426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
20417d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable) window);
20427d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (b)
20437d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      XMesaDestroyBuffer(b);
20447d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   /* don't destroy X window */
2045426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2046426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2047426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
20487d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul/* XXX untested */
2049426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
2050426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
2051426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                      const int *attribList )
2052426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
20537d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaVisual v = (XMesaVisual) config;
20547d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaBuffer b;
20557d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
2056426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
2057426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
2058426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) pixmap;
20597d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   (void) attribList;  /* Ignored in GLX 1.3 */
20607d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20617d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!dpy || !config || !pixmap)
20627d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return 0;
20637d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20647d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
20657d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!b) {
20667d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return 0;
20677d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
20687d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20697d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   return pixmap;
2070426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2071426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2072426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2073426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2074426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
2075426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
20767d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable)pixmap);
20777d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (b)
20787d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      XMesaDestroyBuffer(b);
20797d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   /* don't destroy X pixmap */
2080426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2081426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2082426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2083426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPbuffer
2084426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
2085426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       const int *attribList )
2086426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
20873265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
20883265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaBuffer xmbuf;
20897d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   const int *attrib;
20907d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   int width = 0, height = 0;
20917d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
20927d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
2093426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
20947d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
20953265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   for (attrib = attribList; *attrib; attrib++) {
20967d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      switch (*attrib) {
20977d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         case GLX_PBUFFER_WIDTH:
20983265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
20993265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            width = *attrib;
21007d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            break;
21017d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         case GLX_PBUFFER_HEIGHT:
21023265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
21033265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            height = *attrib;
21047d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            break;
21057d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         case GLX_PRESERVED_CONTENTS:
21063265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
21073265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            preserveContents = *attrib; /* ignored */
21087d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            break;
21097d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         case GLX_LARGEST_PBUFFER:
21103265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
21113265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            useLargest = *attrib; /* ignored */
21127d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            break;
21137d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         default:
21147d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul            return 0;
21157d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      }
21167d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
21177d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
2118b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul   /* not used at this time */
2119b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul   (void) useLargest;
2120b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul   (void) preserveContents;
2121b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul
21227d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (width == 0 || height == 0)
21237d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return 0;
21247d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
21253265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
2126e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* A GLXPbuffer handle must be an X Drawable because that's what
2127e4656003caee346d9c4eb23256d73409271291a7Brian Paul    * glXMakeCurrent takes.
2128e4656003caee346d9c4eb23256d73409271291a7Brian Paul    */
2129dd1a9f75dc1d29e3383f27aaa1cf024c83e5c8e2Brian Paul   if (xmbuf)
2130dd1a9f75dc1d29e3383f27aaa1cf024c83e5c8e2Brian Paul      return (GLXPbuffer) xmbuf->frontxrb->pixmap;
2131dd1a9f75dc1d29e3383f27aaa1cf024c83e5c8e2Brian Paul   else
2132dd1a9f75dc1d29e3383f27aaa1cf024c83e5c8e2Brian Paul      return 0;
2133426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2134426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2135426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2136426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2137426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf )
2138426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2139e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer b = XMesaFindBuffer(dpy, pbuf);
2140e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (b) {
2141e4656003caee346d9c4eb23256d73409271291a7Brian Paul      XMesaDestroyBuffer(b);
2142e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2143426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2144426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2145426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2146426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2147426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
2148426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       unsigned int *value )
2149426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2150e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, draw);
2151e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmbuf)
2152e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return;
21537d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
21547d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   switch (attribute) {
21557d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_WIDTH:
215629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul         *value = xmbuf->mesa_buffer.Width;
2157e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
21587d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_HEIGHT:
215929926a11b16ec7a235947d95e9a46777605dd30eBrian Paul         *value = xmbuf->mesa_buffer.Height;
2160e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
21617d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_PRESERVED_CONTENTS:
2162e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = True;
2163e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
21647d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_LARGEST_PBUFFER:
216529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul         *value = xmbuf->mesa_buffer.Width * xmbuf->mesa_buffer.Height;
2166e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
21677d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      case GLX_FBCONFIG_ID:
2168f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul         *value = xmbuf->xm_visual->visinfo->visualid;
21697d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         return;
21707d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      default:
21717d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul         return;  /* GLX_BAD_ATTRIBUTE? */
21727d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
2173426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2174426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2175426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2176426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXContext
2177426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
2178426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                          int renderType, GLXContext shareList, Bool direct )
2179426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2180f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   struct fake_glx_context *glxCtx;
2181f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   struct fake_glx_context *shareCtx = (struct fake_glx_context *) shareList;
2182f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
21837d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
21847d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   if (!dpy || !config ||
21857d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul       (renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE))
21867d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return 0;
21877d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
2188f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   glxCtx = CALLOC_STRUCT(fake_glx_context);
2189f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   if (!glxCtx)
2190f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      return 0;
2191f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul
2192f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   /* deallocate unused windows/buffers */
2193f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   XMesaGarbageCollect();
2194f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul
2195f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   glxCtx->xmesaContext = XMesaCreateContext(xmvis,
2196f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul                                   shareCtx ? shareCtx->xmesaContext : NULL);
2197f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   if (!glxCtx->xmesaContext) {
2198f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      FREE(glxCtx);
2199f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      return NULL;
2200f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   }
2201f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul
2202f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   glxCtx->xmesaContext->direct = GL_FALSE;
2203f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   glxCtx->glxContext.isDirect = GL_FALSE;
2204f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   glxCtx->glxContext.currentDpy = dpy;
2205f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
2206f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul
2207f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
2208f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul
2209f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul   return (GLXContext) glxCtx;
2210426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2211426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2212426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2213426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
2214426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
2215426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2216e4656003caee346d9c4eb23256d73409271291a7Brian Paul   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;
2217e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaContext xmctx = glxCtx->xmesaContext;
2218e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2219426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
2220426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) ctx;
22217d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul
22227d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   switch (attribute) {
22237d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   case GLX_FBCONFIG_ID:
2224f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul      *value = xmctx->xm_visual->visinfo->visualid;
2225e4656003caee346d9c4eb23256d73409271291a7Brian Paul      break;
22267d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   case GLX_RENDER_TYPE:
2227e4656003caee346d9c4eb23256d73409271291a7Brian Paul      if (xmctx->xm_visual->mesa_visual.rgbMode)
2228e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = GLX_RGBA_BIT;
2229e4656003caee346d9c4eb23256d73409271291a7Brian Paul      else
2230e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = GLX_COLOR_INDEX_BIT;
2231e4656003caee346d9c4eb23256d73409271291a7Brian Paul      break;
22327d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   case GLX_SCREEN:
22337d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      *value = 0;
22347d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return Success;
22357d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   default:
22367d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul      return GLX_BAD_ATTRIBUTE;
22377d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul   }
2238e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return 0;
2239426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2240426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2241426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2242426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2243426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask )
2244426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2245e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2246e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf)
2247e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmbuf->selectedEvents = mask;
2248426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2249426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2250426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2251426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
2252426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
2253426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                          unsigned long *mask )
2254426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2255e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2256e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf)
2257e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *mask = xmbuf->selectedEvents;
2258e4656003caee346d9c4eb23256d73409271291a7Brian Paul   else
2259e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *mask = 0;
2260426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2261b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
2262b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
2263b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
2264b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_swap_control ***/
2265783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2266783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2267783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSwapIntervalSGI(int interval)
2268783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2269783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) interval;
2270783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2271783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2272783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2273783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2274783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2275b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_video_sync ***/
2276783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2277ee061060826df059f0ddb904a2160ed610423579Brian Paulstatic unsigned int FrameCounter = 0;
2278ee061060826df059f0ddb904a2160ed610423579Brian Paul
2279783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2280783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetVideoSyncSGI(unsigned int *count)
2281783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2282ee061060826df059f0ddb904a2160ed610423579Brian Paul   /* this is a bogus implementation */
2283ee061060826df059f0ddb904a2160ed610423579Brian Paul   *count = FrameCounter++;
2284783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2285783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2286783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2287783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2288783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
2289783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2290ee061060826df059f0ddb904a2160ed610423579Brian Paul   if (divisor <= 0 || remainder < 0)
2291ee061060826df059f0ddb904a2160ed610423579Brian Paul      return GLX_BAD_VALUE;
2292ee061060826df059f0ddb904a2160ed610423579Brian Paul   /* this is a bogus implementation */
2293ee061060826df059f0ddb904a2160ed610423579Brian Paul   FrameCounter++;
2294ee061060826df059f0ddb904a2160ed610423579Brian Paul   while (FrameCounter % divisor != remainder)
2295ee061060826df059f0ddb904a2160ed610423579Brian Paul      FrameCounter++;
2296ee061060826df059f0ddb904a2160ed610423579Brian Paul   *count = FrameCounter;
2297783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2298783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2299783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2300783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2301783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2302b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_make_current_read ***/
2303783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2304426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
2305783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXMakeCurrentReadSGI(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
2306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2307a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   return Fake_glXMakeContextCurrent( dpy, draw, read, ctx );
2308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2309783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
23107cf50e137da497a590ec9001a9918972a6246142Brian Paul/* not used
2311783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXDrawable
2312b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian PaulFake_glXGetCurrentReadDrawableSGI(void)
2313783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2314783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2315783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
23167cf50e137da497a590ec9001a9918972a6246142Brian Paul*/
2317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2319b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_source ***/
2320b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_VL_H)
23214c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul
2322783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXVideoSourceSGIX
2323783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode)
2324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2325783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2326783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2327783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) server;
2328783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) path;
2329783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) nodeClass;
2330783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) drainNode;
2331783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2332783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2333783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2334783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2335783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src)
2336783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2337783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2338783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) src;
2339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2340783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
23414c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul#endif
23424c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul
234389a42b7e736bd9b0ab090906cab0cd047a6ec12eBrian Paul
2344b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_EXT_import_context ***/
234589a42b7e736bd9b0ab090906cab0cd047a6ec12eBrian Paul
2346783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2347783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXFreeContextEXT(Display *dpy, GLXContext context)
2348783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2349783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2350783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) context;
2351783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2352426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2353783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContextID
2354783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetContextIDEXT(const GLXContext context)
2355783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2356783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) context;
2357783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2358783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2359783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2360783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContext
2361783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXImportContextEXT(Display *dpy, GLXContextID contextID)
2362783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2363783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2364783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) contextID;
2365783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2366783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2367426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2368426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
2369783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute, int *value)
2370426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2371783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2372783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) context;
2373783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) attribute;
2374783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) value;
2375426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
2376426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2377426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2378783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2379783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2380b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_fbconfig ***/
2381426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2382426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
2383783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value)
2384783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
23853265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return Fake_glXGetFBConfigAttrib(dpy, config, attribute, value);
2386783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2387783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2388783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXFBConfigSGIX *
2389783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChooseFBConfigSGIX(Display *dpy, int screen, int *attrib_list, int *nelements)
2390783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
23913265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return (GLXFBConfig *) Fake_glXChooseFBConfig(dpy, screen, attrib_list, nelements);
2392783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2393783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2394e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2395783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXPixmap
2396783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateGLXPixmapWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap)
2397783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2398e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
2399e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaCreatePixmapBuffer(xmvis, pixmap, 0);
2400e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return xmbuf->frontxrb->pixmap; /* need to return an X ID */
2401783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2402783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2403e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2404783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContext
2405783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct)
2406783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2407e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
2408e4656003caee346d9c4eb23256d73409271291a7Brian Paul   struct fake_glx_context *glxCtx;
2409e4656003caee346d9c4eb23256d73409271291a7Brian Paul   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;
2410e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2411e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx = CALLOC_STRUCT(fake_glx_context);
2412e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!glxCtx)
2413e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return 0;
2414e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2415e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* deallocate unused windows/buffers */
2416e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaGarbageCollect();
2417e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2418e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->xmesaContext = XMesaCreateContext(xmvis,
2419e4656003caee346d9c4eb23256d73409271291a7Brian Paul                                   shareCtx ? shareCtx->xmesaContext : NULL);
2420e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!glxCtx->xmesaContext) {
2421e4656003caee346d9c4eb23256d73409271291a7Brian Paul      FREE(glxCtx);
2422e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return NULL;
2423e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2424e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2425e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->xmesaContext->direct = GL_FALSE;
2426e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->glxContext.isDirect = GL_FALSE;
2427e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->glxContext.currentDpy = dpy;
2428e4656003caee346d9c4eb23256d73409271291a7Brian Paul   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */
2429e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2430e4656003caee346d9c4eb23256d73409271291a7Brian Paul   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));
2431e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2432e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return (GLXContext) glxCtx;
2433783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2434783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2435e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2436783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic XVisualInfo *
2437783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetVisualFromFBConfigSGIX(Display *dpy, GLXFBConfigSGIX config)
2438783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
24393265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   return Fake_glXGetVisualFromFBConfig(dpy, config);
2440783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2441783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2442e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2443783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXFBConfigSGIX
2444783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
2445426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2446e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaVisual xmvis = find_glx_visual(dpy, vis);
2447e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmvis) {
2448e4656003caee346d9c4eb23256d73409271291a7Brian Paul      /* This visual wasn't found with glXChooseVisual() */
2449e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmvis = create_glx_visual(dpy, vis);
2450e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2451e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2452e4656003caee346d9c4eb23256d73409271291a7Brian Paul   return (GLXFBConfigSGIX) xmvis;
2453426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2454426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2455426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2456426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2457b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_pbuffer ***/
2458783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2459783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXPbufferSGIX
24603265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config,
24613265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                             unsigned int width, unsigned int height,
24623265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                             int *attribList)
2463783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
24643265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaVisual xmvis = (XMesaVisual) config;
24653265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   XMesaBuffer xmbuf;
24663265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   const int *attrib;
24673265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
24683265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
2469783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
24703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
247111b3028e7ba2fc3b985ab84d7227c290608f83f6Brian Paul   for (attrib = attribList; attrib && *attrib; attrib++) {
24723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      switch (*attrib) {
24733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         case GLX_PRESERVED_CONTENTS_SGIX:
24743265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
24753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            preserveContents = *attrib; /* ignored */
24763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            break;
24773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         case GLX_LARGEST_PBUFFER_SGIX:
24783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            attrib++;
24793265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            useLargest = *attrib; /* ignored */
24803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            break;
24813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul         default:
24823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul            return 0;
24833265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul      }
24843265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   }
24853265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul
2486b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul   /* not used at this time */
2487b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul   (void) useLargest;
2488b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul   (void) preserveContents;
2489b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul
24903265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
2491e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* A GLXPbuffer handle must be an X Drawable because that's what
2492e4656003caee346d9c4eb23256d73409271291a7Brian Paul    * glXMakeCurrent takes.
2493e4656003caee346d9c4eb23256d73409271291a7Brian Paul    */
2494e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return (GLXPbuffer) xmbuf->frontxrb->pixmap;
2495783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2496783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2497e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2498783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2499783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXDestroyGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf)
2500783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2501e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf);
2502e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf) {
2503e4656003caee346d9c4eb23256d73409271291a7Brian Paul      XMesaDestroyBuffer(xmbuf);
2504e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2505783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2506783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2507e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2508783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2509783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value)
2510783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2511e4656003caee346d9c4eb23256d73409271291a7Brian Paul   const XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf);
2512e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2513e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (!xmbuf) {
2514e4656003caee346d9c4eb23256d73409271291a7Brian Paul      /* Generate GLXBadPbufferSGIX for bad pbuffer */
2515e4656003caee346d9c4eb23256d73409271291a7Brian Paul      return 0;
2516e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2517e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2518e4656003caee346d9c4eb23256d73409271291a7Brian Paul   switch (attribute) {
2519e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_PRESERVED_CONTENTS_SGIX:
2520e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = True;
2521e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2522e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_LARGEST_PBUFFER_SGIX:
252329926a11b16ec7a235947d95e9a46777605dd30eBrian Paul         *value = xmbuf->mesa_buffer.Width * xmbuf->mesa_buffer.Height;
2524e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2525e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_WIDTH_SGIX:
252629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul         *value = xmbuf->mesa_buffer.Width;
2527e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2528e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_HEIGHT_SGIX:
252929926a11b16ec7a235947d95e9a46777605dd30eBrian Paul         *value = xmbuf->mesa_buffer.Height;
2530e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2531e4656003caee346d9c4eb23256d73409271291a7Brian Paul      case GLX_EVENT_MASK_SGIX:
2532e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = 0;  /* XXX might be wrong */
2533e4656003caee346d9c4eb23256d73409271291a7Brian Paul         break;
2534e4656003caee346d9c4eb23256d73409271291a7Brian Paul      default:
2535e4656003caee346d9c4eb23256d73409271291a7Brian Paul         *value = 0;
2536e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2537783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2538783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2539783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2540e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2541783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2542783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSelectEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long mask)
2543783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2544e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2545e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf) {
2546e4656003caee346d9c4eb23256d73409271291a7Brian Paul      /* Note: we'll never generate clobber events */
2547e4656003caee346d9c4eb23256d73409271291a7Brian Paul      xmbuf->selectedEvents = mask;
2548e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2549783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2550783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2551e4656003caee346d9c4eb23256d73409271291a7Brian Paul
2552783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2553783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetSelectedEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long *mask)
2554783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2555e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable);
2556e4656003caee346d9c4eb23256d73409271291a7Brian Paul   if (xmbuf) {
2557e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *mask = xmbuf->selectedEvents;
2558e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2559e4656003caee346d9c4eb23256d73409271291a7Brian Paul   else {
2560e4656003caee346d9c4eb23256d73409271291a7Brian Paul      *mask = 0;
2561e4656003caee346d9c4eb23256d73409271291a7Brian Paul   }
2562783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2563783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2564783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2565783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2566b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_cushion ***/
2567783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2568783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2569783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCushionSGI(Display *dpy, Window win, float cushion)
2570783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2571783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2572783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) win;
2573783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) cushion;
2574783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2575783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2576783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2577783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2578b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_resize ***/
2579783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2580783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2581783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window window)
2582783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2583783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2584783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2585783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2586783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) window;
2587783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2588783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2589783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2590783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2591783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChannelRectSGIX(Display *dpy, int screen, int channel, int x, int y, int w, int h)
2592783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2593783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2594783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2595783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2596783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) x;
2597783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) y;
2598783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) w;
2599783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) h;
2600783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2601783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2602783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2603783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2604783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryChannelRectSGIX(Display *dpy, int screen, int channel, int *x, int *y, int *w, int *h)
2605783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2606783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2607783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2608783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2609783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) x;
2610783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) y;
2611783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) w;
2612783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) h;
2613783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2614783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2615783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2616783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2617783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel, int *dx, int *dy, int *dw, int *dh)
2618783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2619783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2620783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2621783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2622783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dx;
2623783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dy;
2624783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dw;
2625783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dh;
2626783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2627783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2628783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2629783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int
2630783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChannelRectSyncSGIX(Display *dpy, int screen, int channel, GLenum synctype)
2631783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2632783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2633783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2634783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) channel;
2635783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) synctype;
2636783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2637783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2638783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2639783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2640783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2641b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_dmbuffer **/
2642783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2643b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_DM_BUFFER_H_)
2644783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool
2645783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer)
2646783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2647783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2648783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) pbuffer;
2649783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) params;
2650783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dmbuffer;
2651783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return False;
2652783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2653783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif
2654783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2655783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2656b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_swap_group ***/
2657783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2658783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2659783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member)
2660783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2661783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2662783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) drawable;
2663783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) member;
2664783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2665783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2666783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2667783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2668b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_swap_barrier ***/
2669783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2670783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void
2671783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier)
2672783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2673783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2674783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) drawable;
2675783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) barrier;
2676783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2677783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2678783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool
2679783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max)
2680783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2681783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2682783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) screen;
2683783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) max;
2684783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return False;
2685783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2686783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2687783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2688783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2689b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SUN_get_transparent_index ***/
2690783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2691783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Status
2692783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, long *pTransparent)
2693783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2694783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) dpy;
2695783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) overlay;
2696783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) underlay;
2697783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   (void) pTransparent;
2698783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return 0;
2699783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2700783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2701783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2702783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2703b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_release_buffers ***/
2704b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul
2705783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul/*
2706783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul * Release the depth, stencil, accum buffers attached to a GLXDrawable
2707783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul * (a window or pixmap) prior to destroying the GLXDrawable.
2708783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul */
2709783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool
2710783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
2711783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2712783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   XMesaBuffer b = XMesaFindBuffer(dpy, d);
2713783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   if (b) {
2714783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul      XMesaDestroyBuffer(b);
2715783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul      return True;
2716783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   }
2717783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return False;
2718783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2719783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2720783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2721783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2722b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_set_3dfx_mode ***/
2723b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul
2724783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool
2725783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSet3DfxModeMESA( int mode )
2726783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{
2727783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   return XMesaSetFXmode( mode );
2728783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul}
2729783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2730783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2731783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
27323c5bfac63bcbc4028c552fe74d904e6a3416ff36Brian Paul/*** GLX_NV_vertex_array range ***/
27338fefafa2200d3ea44ec46592b190654a10685b46Brian Paulstatic void *
27348fefafa2200d3ea44ec46592b190654a10685b46Brian PaulFake_glXAllocateMemoryNV( GLsizei size,
27358fefafa2200d3ea44ec46592b190654a10685b46Brian Paul                          GLfloat readFrequency,
27368fefafa2200d3ea44ec46592b190654a10685b46Brian Paul                          GLfloat writeFrequency,
27378fefafa2200d3ea44ec46592b190654a10685b46Brian Paul                          GLfloat priority )
27388fefafa2200d3ea44ec46592b190654a10685b46Brian Paul{
27398fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) size;
27408fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) readFrequency;
27418fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) writeFrequency;
27428fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) priority;
27438fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   return NULL;
27448fefafa2200d3ea44ec46592b190654a10685b46Brian Paul}
27458fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
27468fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
27478fefafa2200d3ea44ec46592b190654a10685b46Brian Paulstatic void
27488fefafa2200d3ea44ec46592b190654a10685b46Brian PaulFake_glXFreeMemoryNV( GLvoid *pointer )
27498fefafa2200d3ea44ec46592b190654a10685b46Brian Paul{
27508fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   (void) pointer;
27518fefafa2200d3ea44ec46592b190654a10685b46Brian Paul}
27528fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
27538fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
27543c5bfac63bcbc4028c552fe74d904e6a3416ff36Brian Paul/*** GLX_MESA_agp_offset ***/
2755d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul
2756d6113fc20d68f5720740b89c594227d0312bab3eBrian Paulstatic GLuint
2757d6113fc20d68f5720740b89c594227d0312bab3eBrian PaulFake_glXGetAGPOffsetMESA( const GLvoid *pointer )
2758d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul{
2759d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul   (void) pointer;
2760d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul   return ~0;
2761d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul}
2762d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul
2763d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul
27647287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul/* silence warning */
2765e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paulextern struct _glxapi_table *_mesa_GetGLXDispatchTable(void);
27667287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul
27677287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul
27687287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul/**
27697287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul * Create a new GLX API dispatch table with its function pointers
27707287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul * initialized to point to Mesa's "fake" GLX API functions.
27717287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul * Note: there's a similar function (_real_GetGLXDispatchTable) that
27727287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul * returns a new dispatch table with all pointers initalized to point
27737287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul * to "real" GLX functions (which understand GLX wire protocol, etc).
27747287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul */
27757287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paulstruct _glxapi_table *
27767287bbf4fc7c52da2aa31cae897ed70deda645bbBrian Paul_mesa_GetGLXDispatchTable(void)
2777426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
2778426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   static struct _glxapi_table glx;
2779426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2780426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* be sure our dispatch table size <= libGL's table */
2781426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   {
278201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      GLuint size = sizeof(struct _glxapi_table) / sizeof(void *);
2783426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul      (void) size;
2784426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul      assert(_glxapi_get_dispatch_table_size() >= size);
2785426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   }
2786426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2787426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* initialize the whole table to no-ops */
2788426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   _glxapi_set_no_op_table(&glx);
2789426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2790426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* now initialize the table with the functions I implement */
2791426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ChooseVisual = Fake_glXChooseVisual;
2792426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CopyContext = Fake_glXCopyContext;
2793426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateContext = Fake_glXCreateContext;
2794426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateGLXPixmap = Fake_glXCreateGLXPixmap;
2795426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyContext = Fake_glXDestroyContext;
2796426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyGLXPixmap = Fake_glXDestroyGLXPixmap;
2797426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetConfig = Fake_glXGetConfig;
2798426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentContext = Fake_glXGetCurrentContext;*/
2799426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentDrawable = Fake_glXGetCurrentDrawable;*/
2800426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.IsDirect = Fake_glXIsDirect;
2801426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.MakeCurrent = Fake_glXMakeCurrent;
2802426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryExtension = Fake_glXQueryExtension;
2803426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryVersion = Fake_glXQueryVersion;
2804426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.SwapBuffers = Fake_glXSwapBuffers;
2805426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.UseXFont = Fake_glXUseXFont;
2806426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitGL = Fake_glXWaitGL;
2807426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitX = Fake_glXWaitX;
2808426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2809b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_VERSION_1_1 ***/
2810426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetClientString = Fake_glXGetClientString;
2811426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryExtensionsString = Fake_glXQueryExtensionsString;
2812426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryServerString = Fake_glXQueryServerString;
2813426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2814b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_VERSION_1_2 ***/
2815426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentDisplay = Fake_glXGetCurrentDisplay;*/
2816426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2817b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_VERSION_1_3 ***/
2818426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ChooseFBConfig = Fake_glXChooseFBConfig;
2819426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateNewContext = Fake_glXCreateNewContext;
2820426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreatePbuffer = Fake_glXCreatePbuffer;
2821426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreatePixmap = Fake_glXCreatePixmap;
2822426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateWindow = Fake_glXCreateWindow;
2823426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyPbuffer = Fake_glXDestroyPbuffer;
2824426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyPixmap = Fake_glXDestroyPixmap;
2825426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyWindow = Fake_glXDestroyWindow;
2826426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentReadDrawable = Fake_glXGetCurrentReadDrawable;*/
2827426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetFBConfigAttrib = Fake_glXGetFBConfigAttrib;
282871dea349d2be623b7819389428b0d6a124e8d184Brian Paul   glx.GetFBConfigs = Fake_glXGetFBConfigs;
2829426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetSelectedEvent = Fake_glXGetSelectedEvent;
2830426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetVisualFromFBConfig = Fake_glXGetVisualFromFBConfig;
2831426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.MakeContextCurrent = Fake_glXMakeContextCurrent;
2832426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryContext = Fake_glXQueryContext;
2833426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryDrawable = Fake_glXQueryDrawable;
2834426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.SelectEvent = Fake_glXSelectEvent;
2835426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2836b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGI_swap_control ***/
2837783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.SwapIntervalSGI = Fake_glXSwapIntervalSGI;
2838783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2839b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGI_video_sync ***/
2840426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetVideoSyncSGI = Fake_glXGetVideoSyncSGI;
2841426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitVideoSyncSGI = Fake_glXWaitVideoSyncSGI;
2842426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2843b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGI_make_current_read ***/
2844783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.MakeCurrentReadSGI = Fake_glXMakeCurrentReadSGI;
28457cf50e137da497a590ec9001a9918972a6246142Brian Paul   /*glx.GetCurrentReadDrawableSGI = Fake_glXGetCurrentReadDrawableSGI;*/
2846783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2847b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_source ***/
2848b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_VL_H)
2849783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CreateGLXVideoSourceSGIX = Fake_glXCreateGLXVideoSourceSGIX;
2850783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.DestroyGLXVideoSourceSGIX = Fake_glXDestroyGLXVideoSourceSGIX;
2851783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif
2852783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2853b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_EXT_import_context ***/
2854783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.FreeContextEXT = Fake_glXFreeContextEXT;
2855783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetContextIDEXT = Fake_glXGetContextIDEXT;
28567cf50e137da497a590ec9001a9918972a6246142Brian Paul   /*glx.GetCurrentDisplayEXT = Fake_glXGetCurrentDisplayEXT;*/
2857783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.ImportContextEXT = Fake_glXImportContextEXT;
2858783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryContextInfoEXT = Fake_glXQueryContextInfoEXT;
28594536021a62e02fceaa6e8eb889b0f61743109cc4Brian Paul
2860b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_fbconfig ***/
2861783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetFBConfigAttribSGIX = Fake_glXGetFBConfigAttribSGIX;
2862783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.ChooseFBConfigSGIX = Fake_glXChooseFBConfigSGIX;
2863783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CreateGLXPixmapWithConfigSGIX = Fake_glXCreateGLXPixmapWithConfigSGIX;
2864783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CreateContextWithConfigSGIX = Fake_glXCreateContextWithConfigSGIX;
2865783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetVisualFromFBConfigSGIX = Fake_glXGetVisualFromFBConfigSGIX;
2866783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetFBConfigFromVisualSGIX = Fake_glXGetFBConfigFromVisualSGIX;
2867783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2868b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_pbuffer ***/
2869783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CreateGLXPbufferSGIX = Fake_glXCreateGLXPbufferSGIX;
2870783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.DestroyGLXPbufferSGIX = Fake_glXDestroyGLXPbufferSGIX;
2871783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryGLXPbufferSGIX = Fake_glXQueryGLXPbufferSGIX;
2872783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.SelectEventSGIX = Fake_glXSelectEventSGIX;
2873783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetSelectedEventSGIX = Fake_glXGetSelectedEventSGIX;
2874783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2875b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGI_cushion ***/
2876783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.CushionSGI = Fake_glXCushionSGI;
2877783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2878b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_video_resize ***/
2879783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.BindChannelToWindowSGIX = Fake_glXBindChannelToWindowSGIX;
2880783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.ChannelRectSGIX = Fake_glXChannelRectSGIX;
2881783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryChannelRectSGIX = Fake_glXQueryChannelRectSGIX;
2882783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryChannelDeltasSGIX = Fake_glXQueryChannelDeltasSGIX;
2883783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.ChannelRectSyncSGIX = Fake_glXChannelRectSyncSGIX;
2884783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2885b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_dmbuffer **/
2886b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_DM_BUFFER_H_)
2887783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.AssociateDMPbufferSGIX = NULL;
2888783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif
2889783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2890b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_swap_group ***/
2891783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.JoinSwapGroupSGIX = Fake_glXJoinSwapGroupSGIX;
2892783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2893b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SGIX_swap_barrier ***/
2894783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.BindSwapBarrierSGIX = Fake_glXBindSwapBarrierSGIX;
2895783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.QueryMaxSwapBarriersSGIX = Fake_glXQueryMaxSwapBarriersSGIX;
2896783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul
2897b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_SUN_get_transparent_index ***/
2898783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul   glx.GetTransparentIndexSUN = Fake_glXGetTransparentIndexSUN;
28994536021a62e02fceaa6e8eb889b0f61743109cc4Brian Paul
2900b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_MESA_copy_sub_buffer ***/
2901426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CopySubBufferMESA = Fake_glXCopySubBufferMESA;
2902426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2903b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_MESA_release_buffers ***/
2904426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ReleaseBuffersMESA = Fake_glXReleaseBuffersMESA;
2905426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2906b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_MESA_pixmap_colormap ***/
2907426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateGLXPixmapMESA = Fake_glXCreateGLXPixmapMESA;
2908426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2909b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul   /*** GLX_MESA_set_3dfx_mode ***/
2910426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.Set3DfxModeMESA = Fake_glXSet3DfxModeMESA;
2911426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
2912d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul   /*** GLX_NV_vertex_array_range ***/
29138fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   glx.AllocateMemoryNV = Fake_glXAllocateMemoryNV;
29148fefafa2200d3ea44ec46592b190654a10685b46Brian Paul   glx.FreeMemoryNV = Fake_glXFreeMemoryNV;
29158fefafa2200d3ea44ec46592b190654a10685b46Brian Paul
2916d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul   /*** GLX_MESA_agp_offset ***/
2917d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul   glx.GetAGPOffsetMESA = Fake_glXGetAGPOffsetMESA;
2918d6113fc20d68f5720740b89c594227d0312bab3eBrian Paul
2919426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return &glx;
2920426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
2921