fakeglx.c revision 262f9e52d6a511fffd1e6746de9d83d89cca9e1a
1262f9e52d6a511fffd1e6746de9d83d89cca9e1aBrian Paul/* $Id: fakeglx.c,v 1.21 2000/01/27 16:45:50 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
5d0247f53aea8fa8677aadc8a00f75c8993be9ebcBrian Paul * Version:  3.3
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
7262f9e52d6a511fffd1e6746de9d83d89cca9e1aBrian Paul * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2936cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paul * This is an emulation of the GLX API which allows Mesa/GLX-based programs
3036cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paul * to run on X servers which do not have the real GLX extension.
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Thanks to the contributors:
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Initial version:  Philip Brown (philb@CSUA.Berkeley.EDU)
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Better glXGetConfig() support: Armin Liebchen (liebchen@asylum.cs.utah.edu)
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Further visual-handling refinements: Wolfram Gloger
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *    (wmglo@Dent.MED.Uni-Muenchen.DE).
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Notes:
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *   Don't be fooled, stereo isn't supported yet.
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
45fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glxheader.h"
46426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#include "glxapi.h"
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/xmesa.h"
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "config.h"
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "macros.h"
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "types.h"
52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "xmesaP.h"
53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This indicates the client-side GLX API and GLX encoder version. */
5678fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define CLIENT_MAJOR_VERSION 1
5778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define CLIENT_MINOR_VERSION 2
5878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
5978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This indicates the server-side GLX decoder version.
6078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul * GLX 1.3 indicates OpenGL 1.2 support
6178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul */
6278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define SERVER_MAJOR_VERSION 1
6378fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define SERVER_MINOR_VERSION 3
6478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
6578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This is appended onto the glXGetClient/ServerString version strings. */
66262f9e52d6a511fffd1e6746de9d83d89cca9e1aBrian Paul#define MESA_GLX_VERSION "Mesa 3.3"
6778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
6878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* Who implemented this GLX? */
6978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define VENDOR "Brian Paul"
7078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
7178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul/* Silence compiler warnings */
7443c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paulvoid Fake_glXDummyFunc( void )
7543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul{
7643c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   (void) kernel8;
7743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   (void) DitherValues;
7843c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   (void) HPCR_DRGB;
7943c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   (void) kernel1;
8043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul}
8143c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
8243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
8343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define DONT_CARE -1
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define MAX_VISUALS 100
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual VisualTable[MAX_VISUALS];
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int NumVisuals = 0;
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * This struct and some code fragments borrowed
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * from Mark Kilgard's GLUT library.
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgtypedef struct _OverlayInfo {
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  /* Avoid 64-bit portability problems by being careful to use
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     longs due to the way XGetWindowProperty is specified. Note
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     that these parameters are passed as CARD32s over X
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     protocol. */
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  unsigned long overlay_visual;
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long transparent_type;
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long value;
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg  long layer;
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} OverlayInfo;
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Macro to handle c_class vs class field name in XVisualInfo struct */
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#if defined(__cplusplus) || defined(c_plusplus)
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLASS c_class
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLASS class
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Test if the given XVisualInfo is usable for Mesa rendering.
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLboolean is_usable_visual( XVisualInfo *vinfo )
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (vinfo->CLASS) {
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case StaticGray:
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GrayScale:
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Any StaticGray/GrayScale visual works in RGB or CI mode */
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return GL_TRUE;
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case StaticColor:
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case PseudoColor:
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* Any StaticColor/PseudoColor visual of at least 4 bits */
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (vinfo->depth>=4) {
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return GL_TRUE;
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return GL_FALSE;
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case TrueColor:
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case DirectColor:
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* Any depth of TrueColor or DirectColor works in RGB mode */
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GL_TRUE;
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* This should never happen */
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GL_FALSE;
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the level (overlay, normal, underlay) of a given XVisualInfo.
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy - the X display
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         vinfo - the XVisualInfo to test
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  level of the visual:
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *             0 = normal planes
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *            >0 = overlay planes
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *            <0 = underlay planes
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int level_of_visual( Display *dpy, XVisualInfo *vinfo )
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom overlayVisualsAtom;
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OverlayInfo *overlay_info = NULL;
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int numOverlaysPerScreen;
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Status status;
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom actualType;
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int actualFormat;
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long sizeData, bytesLeft;
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * The SERVER_OVERLAY_VISUALS property on the root window contains
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * a list of overlay visuals.  Get that list now.
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (overlayVisualsAtom == None) {
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   status = XGetWindowProperty(dpy, RootWindow( dpy, vinfo->screen ),
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, 0L, (long) 10000, False,
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, &actualType, &actualFormat,
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               &sizeData, &bytesLeft,
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               (unsigned char **) &overlay_info );
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (status != Success || actualType != overlayVisualsAtom ||
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       actualFormat != 32 || sizeData < 4) {
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* something went wrong */
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XFree((void *) overlay_info);
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* search the overlay visual list for the visual ID of interest */
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   numOverlaysPerScreen = (int) (sizeData / 4);
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<numOverlaysPerScreen;i++) {
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OverlayInfo *ov;
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ov = overlay_info + i;
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ov->overlay_visual==vinfo->visualid) {
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* found the visual */
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (/*ov->transparent_type==1 &&*/ ov->layer!=0) {
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            int level = ov->layer;
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return level;
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return 0;
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* The visual ID was not found in the overlay list. */
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XFree((void *) overlay_info);
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return 0;
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Given an XVisualInfo and RGB, Double, and Depth buffer flags, save the
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * configuration in our list of GLX visuals.
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgsave_glx_visual( Display *dpy, XVisualInfo *vinfo,
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLboolean rgbFlag, GLboolean alphaFlag, GLboolean dbFlag,
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLboolean stereoFlag,
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLint depth_size, GLint stencil_size,
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                 GLint accum_size, GLint level )
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean ximageFlag = GL_TRUE;
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual xmvis;
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint i;
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean comparePointers;
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (dbFlag) {
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Check if the MESA_BACK_BUFFER env var is set */
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      char *backbuffer = getenv("MESA_BACK_BUFFER");
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (backbuffer) {
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (backbuffer[0]=='p' || backbuffer[0]=='P') {
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ximageFlag = GL_FALSE;
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else if (backbuffer[0]=='x' || backbuffer[0]=='X') {
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ximageFlag = GL_TRUE;
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            fprintf(stderr, "Mesa: invalid value for MESA_BACK_BUFFER ");
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            fprintf(stderr, "environment variable, using an XImage.\n");
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Comparing IDs uses less memory but sometimes fails. */
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* XXX revisit this after 3.0 is finished. */
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (getenv("MESA_GLX_VISUAL_HACK"))
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      comparePointers = GL_TRUE;
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      comparePointers = GL_FALSE;
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* First check if a matching visual is already in the list */
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0; i<NumVisuals; i++) {
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaVisual v = VisualTable[i];
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (v->display == dpy
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && v->level == level
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && v->ximage_flag == ximageFlag
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && v->gl_visual->RGBAflag == rgbFlag
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && v->gl_visual->DBflag == dbFlag
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && v->gl_visual->StereoFlag == stereoFlag
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && (v->gl_visual->AlphaBits > 0) == alphaFlag
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && (v->gl_visual->DepthBits >= depth_size || depth_size == 0)
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && (v->gl_visual->StencilBits >= stencil_size || stencil_size == 0)
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && (v->gl_visual->AccumBits >= accum_size || accum_size == 0)) {
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* now either compare XVisualInfo pointers or visual IDs */
275d0247f53aea8fa8677aadc8a00f75c8993be9ebcBrian Paul         if ((!comparePointers && v->visinfo->visualid == vinfo->visualid)
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg             || (comparePointers && v->vishandle == vinfo)) {
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return v;
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Create a new visual and add it to the list. */
283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (NumVisuals>=MAX_VISUALS) {
285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf( stderr, "GLX Error: maximum number of visuals exceeded\n");
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   xmvis = XMesaCreateVisual( dpy, vinfo, rgbFlag, alphaFlag, dbFlag,
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              stereoFlag, ximageFlag,
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              depth_size, stencil_size, accum_size, level );
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (xmvis) {
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      VisualTable[NumVisuals] = xmvis;
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      NumVisuals++;
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return xmvis;
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create a GLX visual from a regular XVisualInfo.
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgcreate_glx_visual( Display *dpy, XVisualInfo *visinfo )
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int vislevel;
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   vislevel = level_of_visual( dpy, visinfo );
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vislevel) {
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Configure this visual as a CI, single-buffered overlay */
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return save_glx_visual( dpy, visinfo,
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* rgb */
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* alpha */
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* double */
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* stereo */
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              0,         /* depth bits */
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              0,         /* stencil bits */
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              0,         /* accum bits */
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              vislevel   /* level */
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                            );
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (is_usable_visual( visinfo )) {
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Configure this visual as RGB, double-buffered, depth-buffered. */
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* This is surely wrong for some people's needs but what else */
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* can be done?  They should use glXChooseVisual(). */
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return save_glx_visual( dpy, visinfo,
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_TRUE,   /* rgb */
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* alpha */
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_TRUE,   /* double */
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GL_FALSE,  /* stereo */
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              8*sizeof(GLdepth),
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              8*sizeof(GLstencil),
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              8*sizeof(GLaccum),
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              0          /* level */
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                            );
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr,"Mesa: error in glXCreateContext: bad visual\n");
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Find the GLX visual associated with an XVisualInfo.
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgfind_glx_visual( Display *dpy, XVisualInfo *vinfo )
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* First try to match pointers */
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<NumVisuals;i++) {
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (VisualTable[i]->display==dpy && VisualTable[i]->vishandle==vinfo) {
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return VisualTable[i];
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* try to match visual id */
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<NumVisuals;i++) {
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (VisualTable[i]->display==dpy
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && VisualTable[i]->visinfo->visualid == vinfo->visualid) {
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return VisualTable[i];
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the transparent pixel value for a GLX visual.
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  glxvis - the glx_visual
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  a pixel value or -1 if no transparent pixel
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int transparent_pixel( XMesaVisual glxvis )
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Display *dpy = glxvis->display;
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vinfo = glxvis->visinfo;
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom overlayVisualsAtom;
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OverlayInfo *overlay_info = NULL;
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int numOverlaysPerScreen;
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Status status;
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom actualType;
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int actualFormat;
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long sizeData, bytesLeft;
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * The SERVER_OVERLAY_VISUALS property on the root window contains
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * a list of overlay visuals.  Get that list now.
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (overlayVisualsAtom == None) {
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return -1;
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   status = XGetWindowProperty(dpy, RootWindow( dpy, vinfo->screen ),
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, 0L, (long) 10000, False,
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, &actualType, &actualFormat,
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               &sizeData, &bytesLeft,
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               (unsigned char **) &overlay_info );
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (status != Success || actualType != overlayVisualsAtom ||
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       actualFormat != 32 || sizeData < 4) {
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* something went wrong */
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XFree((void *) overlay_info);
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return -1;
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* search the overlay visual list for the visual ID of interest */
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   numOverlaysPerScreen = (int) (sizeData / 4);
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<numOverlaysPerScreen;i++) {
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OverlayInfo *ov;
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ov = overlay_info + i;
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ov->overlay_visual==vinfo->visualid) {
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* found it! */
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (ov->transparent_type==0) {
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* type 0 indicates no transparency */
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return -1;
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* ov->value is the transparent pixel */
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            XFree((void *) overlay_info);
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return ov->value;
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* The visual ID was not found in the overlay list. */
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XFree((void *) overlay_info);
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return -1;
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return number of bits set in n.
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int bitcount( unsigned long n )
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int bits;
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (bits=0; n>0; n=n>>1) {
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (n&1) {
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bits++;
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return bits;
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Try to get an X visual which matches the given arguments.
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *get_visual( Display *dpy, int scr,
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg			        unsigned int depth, int xclass )
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo temp, *vis;
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   long mask;
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int n;
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned int default_depth;
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int default_class;
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   mask = VisualScreenMask | VisualDepthMask | VisualClassMask;
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.screen = scr;
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.depth = depth;
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   temp.CLASS = xclass;
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   default_depth = DefaultDepth(dpy,scr);
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   default_class = DefaultVisual(dpy,scr)->CLASS;
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (depth==default_depth && xclass==default_class) {
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* try to get root window's visual */
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      temp.visualid = DefaultVisual(dpy,scr)->visualid;
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      mask |= VisualIDMask;
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   vis = XGetVisualInfo( dpy, mask, &temp, &n );
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* In case bits/pixel > 24, make sure color channels are still <=8 bits.
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * An SGI Infinite Reality system, for example, can have 30bpp pixels:
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * 10 bits per color channel.  Mesa's limited to a max of 8 bits/channel.
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vis && depth > 24 && (xclass==TrueColor || xclass==DirectColor)) {
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (bitcount(vis->red_mask) <= 8
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && bitcount(vis->green_mask) <= 8
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && bitcount(vis->blue_mask) <= 8) {
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return vis;
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         XFree((void *) vis);
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return vis;
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Retrieve the value of the given environment variable and find
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the X visual which matches it.
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy - the display
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         screen - the screen number
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         varname - the name of the environment variable
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  an XVisualInfo pointer to NULL if error.
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *get_env_visual(Display *dpy, int scr, const char *varname)
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   char value[100], type[100];
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int depth, xclass = -1;
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!getenv( varname )) {
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   strncpy( value, getenv(varname), 100 );
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   value[99] = 0;
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   sscanf( value, "%s %d", type, &depth );
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (strcmp(type,"TrueColor")==0)          xclass = TrueColor;
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (strcmp(type,"DirectColor")==0)   xclass = DirectColor;
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (strcmp(type,"PseudoColor")==0)   xclass = PseudoColor;
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (strcmp(type,"StaticColor")==0)   xclass = StaticColor;
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (strcmp(type,"GrayScale")==0)     xclass = GrayScale;
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (strcmp(type,"StaticGray")==0)    xclass = StaticGray;
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (xclass>-1 && depth>0) {
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_visual( dpy, scr, depth, xclass );
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   fprintf( stderr, "Mesa: GLX unable to find visual class=%s, depth=%d.\n",
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    type, depth );
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Select an X visual which satisfies the RGBA/CI flag and minimum depth.
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy, screen - X display and screen number
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         rgba - GL_TRUE = RGBA mode, GL_FALSE = CI mode
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         min_depth - minimum visual depth
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         preferred_class - preferred GLX visual class or DONT_CARE
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  pointer to an XVisualInfo or NULL.
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *choose_x_visual( Display *dpy, int screen,
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				     GLboolean rgba, int min_depth,
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                     int preferred_class )
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int xclass, visclass;
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int depth;
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (rgba) {
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      Atom hp_cr_maps = XInternAtom(dpy, "_HP_RGB_SMOOTH_MAP_LIST", True);
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* First see if the MESA_RGB_VISUAL env var is defined */
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_env_visual( dpy, screen, "MESA_RGB_VISUAL" );
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Otherwise, search for a suitable visual */
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class==DONT_CARE) {
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (xclass=0;xclass<6;xclass++) {
573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            switch (xclass) {
574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 0:  visclass = TrueColor;    break;
575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 1:  visclass = DirectColor;  break;
576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 2:  visclass = PseudoColor;  break;
577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 3:  visclass = StaticColor;  break;
578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 4:  visclass = GrayScale;    break;
579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 5:  visclass = StaticGray;   break;
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (min_depth==0) {
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               /* start with shallowest */
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (depth=0;depth<=32;depth++) {
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (visclass==TrueColor && depth==8 && !hp_cr_maps) {
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* Special case:  try to get 8-bit PseudoColor before */
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* 8-bit TrueColor */
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     vis = get_visual( dpy, screen, 8, PseudoColor );
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     if (vis) {
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                        return vis;
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     }
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  vis = get_visual( dpy, screen, depth, visclass );
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (vis) {
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     return vis;
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            else {
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               /* start with deepest */
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (depth=32;depth>=min_depth;depth--) {
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (visclass==TrueColor && depth==8 && !hp_cr_maps) {
602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* Special case:  try to get 8-bit PseudoColor before */
603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     /* 8-bit TrueColor */
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     vis = get_visual( dpy, screen, 8, PseudoColor );
605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     if (vis) {
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                        return vis;
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     }
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  vis = get_visual( dpy, screen, depth, visclass );
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  if (vis) {
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                     return vis;
612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  }
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* search for a specific visual class */
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         switch (preferred_class) {
620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_TRUE_COLOR_EXT:    visclass = TrueColor;    break;
621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_DIRECT_COLOR_EXT:  visclass = DirectColor;  break;
622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_PSEUDO_COLOR_EXT:  visclass = PseudoColor;  break;
623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_COLOR_EXT:  visclass = StaticColor;  break;
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_GRAY_SCALE_EXT:    visclass = GrayScale;    break;
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_GRAY_EXT:   visclass = StaticGray;   break;
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            default:   return NULL;
627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (min_depth==0) {
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* start with shallowest */
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=0;depth<=32;depth++) {
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* start with deepest */
639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=32;depth>=min_depth;depth--) {
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* First see if the MESA_CI_VISUAL env var is defined */
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vis = get_env_visual( dpy, screen, "MESA_CI_VISUAL" );
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (vis) {
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return vis;
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Otherwise, search for a suitable visual, starting with shallowest */
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class==DONT_CARE) {
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (xclass=0;xclass<4;xclass++) {
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            switch (xclass) {
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 0:  visclass = PseudoColor;  break;
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 1:  visclass = StaticColor;  break;
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 2:  visclass = GrayScale;    break;
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               case 3:  visclass = StaticGray;   break;
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* try 8-bit up through 16-bit */
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=8;depth<=16;depth++) {
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* try min_depth up to 8-bit */
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (depth=min_depth;depth<8;depth++) {
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               vis = get_visual( dpy, screen, depth, visclass );
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               if (vis) {
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  return vis;
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* search for a specific visual class */
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         switch (preferred_class) {
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_TRUE_COLOR_EXT:    visclass = TrueColor;    break;
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_DIRECT_COLOR_EXT:  visclass = DirectColor;  break;
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_PSEUDO_COLOR_EXT:  visclass = PseudoColor;  break;
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_COLOR_EXT:  visclass = StaticColor;  break;
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_GRAY_SCALE_EXT:    visclass = GrayScale;    break;
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GLX_STATIC_GRAY_EXT:   visclass = StaticGray;   break;
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            default:   return NULL;
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* try 8-bit up through 16-bit */
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (depth=8;depth<=16;depth++) {
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            vis = get_visual( dpy, screen, depth, visclass );
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (vis) {
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               return vis;
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* try min_depth up to 8-bit */
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (depth=min_depth;depth<8;depth++) {
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            vis = get_visual( dpy, screen, depth, visclass );
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (vis) {
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               return vis;
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* didn't find a visual */
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Find the deepest X over/underlay visual of at least min_depth.
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  dpy, screen - X display and screen number
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         level - the over/underlay level
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         trans_type - transparent pixel type: GLX_NONE_EXT,
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                      GLX_TRANSPARENT_RGB_EXT, GLX_TRANSPARENT_INDEX_EXT,
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                      or DONT_CARE
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         trans_value - transparent pixel value or DONT_CARE
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         min_depth - minimum visual depth
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         preferred_class - preferred GLX visual class or DONT_CARE
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  pointer to an XVisualInfo or NULL.
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *choose_x_overlay_visual( Display *dpy, int scr,
72642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul                                             GLboolean rgbFlag,
727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                             int level, int trans_type,
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                             int trans_value,
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                             int min_depth,
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                             int preferred_class )
731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom overlayVisualsAtom;
733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OverlayInfo *overlay_info;
734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int numOverlaysPerScreen;
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Status status;
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   Atom actualType;
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int actualFormat;
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long sizeData, bytesLeft;
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int i;
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *deepvis;
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int deepest;
742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*DEBUG int tt, tv; */
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (preferred_class) {
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRUE_COLOR_EXT:    preferred_class = TrueColor;    break;
747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DIRECT_COLOR_EXT:  preferred_class = DirectColor;  break;
748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_PSEUDO_COLOR_EXT:  preferred_class = PseudoColor;  break;
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STATIC_COLOR_EXT:  preferred_class = StaticColor;  break;
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_GRAY_SCALE_EXT:    preferred_class = GrayScale;    break;
751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STATIC_GRAY_EXT:   preferred_class = StaticGray;   break;
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:                    preferred_class = DONT_CARE;
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * The SERVER_OVERLAY_VISUALS property on the root window contains
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * a list of overlay visuals.  Get that list now.
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True);
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (overlayVisualsAtom == (Atom) None) {
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   status = XGetWindowProperty(dpy, RootWindow( dpy, scr ),
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, 0L, (long) 10000, False,
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               overlayVisualsAtom, &actualType, &actualFormat,
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               &sizeData, &bytesLeft,
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               (unsigned char **) &overlay_info );
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (status != Success || actualType != overlayVisualsAtom ||
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       actualFormat != 32 || sizeData < 4) {
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* something went wrong */
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Search for the deepest overlay which satisifies all criteria. */
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   deepest = min_depth;
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   deepvis = NULL;
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   numOverlaysPerScreen = (int) (sizeData / 4);
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<numOverlaysPerScreen;i++) {
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XVisualInfo *vislist, vistemplate;
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      int count;
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      OverlayInfo *ov;
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ov = overlay_info + i;
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ov->layer!=level) {
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed overlay level criteria */
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!(trans_type==DONT_CARE
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            || (trans_type==GLX_TRANSPARENT_INDEX_EXT
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                && ov->transparent_type>0)
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            || (trans_type==GLX_NONE_EXT && ov->transparent_type==0))) {
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed transparent pixel type criteria */
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (trans_value!=DONT_CARE && trans_value!=ov->value) {
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* failed transparent pixel value criteria */
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* get XVisualInfo and check the depth */
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vistemplate.visualid = ov->overlay_visual;
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vistemplate.screen = scr;
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      vislist = XGetVisualInfo( dpy, VisualIDMask | VisualScreenMask,
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                &vistemplate, &count );
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (count!=1) {
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* something went wrong */
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (preferred_class!=DONT_CARE && preferred_class!=vislist->CLASS) {
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* wrong visual class */
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         continue;
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
81842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      /* if RGB was requested, make sure we have True/DirectColor */
81942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (rgbFlag && vislist->CLASS != TrueColor
82042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul          && vislist->CLASS != DirectColor)
82142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         continue;
82242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul
82342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      /* if CI was requested, make sure we have a color indexed visual */
82442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (!rgbFlag
82542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul          && (vislist->CLASS == TrueColor || vislist->CLASS == DirectColor))
82642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         continue;
82742f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (deepvis==NULL || vislist->depth > deepest) {
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* YES!  found a satisfactory visual */
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (deepvis) {
83180af3614d88c0cac160e787de7f34b37e96cb626Brian Paul            XFree( deepvis );
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         deepest = vislist->depth;
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         deepvis = vislist;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* DEBUG  tt = ov->transparent_type;*/
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* DEBUG  tv = ov->value; */
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*DEBUG
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (deepvis) {
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      printf("chose 0x%x:  layer=%d depth=%d trans_type=%d trans_value=%d\n",
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg             deepvis->visualid, level, deepvis->depth, tt, tv );
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg*/
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return deepvis;
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
851426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic XVisualInfo *
852426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXChooseVisual( Display *dpy, int screen, int *list )
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int *parselist;
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XVisualInfo *vis;
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int min_ci = 0;
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int min_red=0, min_green=0, min_blue=0;
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean rgb_flag = GL_FALSE;
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean alpha_flag = GL_FALSE;
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean double_flag = GL_FALSE;
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean stereo_flag = GL_FALSE;
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint depth_size = 0;
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint stencil_size = 0;
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint accum_size = 0;
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int level = 0;
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int visual_type = DONT_CARE;
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int trans_type = DONT_CARE;
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   int trans_value = DONT_CARE;
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   parselist = list;
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   while (*parselist) {
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      switch (*parselist) {
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_USE_GL:
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* ignore */
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_BUFFER_SIZE:
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_ci = *parselist++;
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_LEVEL:
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            level = *parselist++;
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_RGBA:
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    rgb_flag = GL_TRUE;
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_DOUBLEBUFFER:
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    double_flag = GL_TRUE;
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_STEREO:
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            stereo_flag = GL_TRUE;
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return NULL;
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_AUX_BUFFERS:
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* ignore */
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_RED_SIZE:
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_red = *parselist++;
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_GREEN_SIZE:
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_green = *parselist++;
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_BLUE_SIZE:
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    min_blue = *parselist++;
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ALPHA_SIZE:
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            {
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLint size = *parselist++;
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               alpha_flag = size>0 ? 1 : 0;
920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_DEPTH_SIZE:
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    depth_size = *parselist++;
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_STENCIL_SIZE:
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    stencil_size = *parselist++;
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_RED_SIZE:
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_GREEN_SIZE:
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_BLUE_SIZE:
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case GLX_ACCUM_ALPHA_SIZE:
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            {
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLint size = *parselist++;
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               accum_size = MAX2( accum_size, size );
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /*
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          * GLX_EXT_visual_info extension
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          */
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_X_VISUAL_TYPE_EXT:
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            visual_type = *parselist++;
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_TYPE_EXT:
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            trans_type = *parselist++;
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_INDEX_VALUE_EXT:
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            parselist++;
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            trans_value = *parselist++;
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            break;
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_RED_VALUE_EXT:
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_GREEN_VALUE_EXT:
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_BLUE_VALUE_EXT:
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         case GLX_TRANSPARENT_ALPHA_VALUE_EXT:
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* ignore */
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    parselist++;
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 case None:
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    break;
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 default:
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /* undefined attribute */
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return NULL;
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /*
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * Since we're only simulating the GLX extension this function will never
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * find any real GL visuals.  Instead, all we can do is try to find an RGB
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * or CI visual of appropriate depth.  Other requested attributes such as
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * double buffering, depth buffer, etc. will be associated with the X
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    * visual and stored in the VisualTable[].
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg    */
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (level==0) {
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* normal color planes */
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (rgb_flag) {
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Get an RGB visual */
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         int min_rgb = min_red + min_green + min_blue;
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (min_rgb>1 && min_rgb<8) {
986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* a special case to be sure we can get a monochrome visual */
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            min_rgb = 1;
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         vis = choose_x_visual( dpy, screen, rgb_flag, min_rgb, visual_type );
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* Get a color index visual */
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         vis = choose_x_visual( dpy, screen, rgb_flag, min_ci, visual_type );
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         accum_size = 0;
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* over/underlay planes */
99942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      if (rgb_flag) {
100042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         /* rgba overlay */
100142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         int min_rgb = min_red + min_green + min_blue;
100242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         if (min_rgb>1 && min_rgb<8) {
100342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul            /* a special case to be sure we can get a monochrome visual */
100442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul            min_rgb = 1;
100542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         }
100642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level,
100742f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul                              trans_type, trans_value, min_rgb, visual_type );
100842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      }
100942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      else {
101042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         /* color index overlay */
101142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul         vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level,
101242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul                              trans_type, trans_value, min_ci, visual_type );
101342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul      }
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (vis) {
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                            stereo_flag,
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                            depth_size, stencil_size, accum_size, level ))
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return vis;
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1029426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXContext
1030426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateContext( Display *dpy, XVisualInfo *visinfo,
1031426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       GLXContext share_list, Bool direct )
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual glxvis;
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xmctx;
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* deallocate unused windows/buffers */
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaGarbageCollect();
1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   glxvis = find_glx_visual( dpy, visinfo );
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!glxvis) {
1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* This visual wasn't found with glXChooseVisual() */
1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      glxvis = create_glx_visual( dpy, visinfo );
1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!glxvis) {
1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   xmctx = XMesaCreateContext( glxvis, (XMesaContext) share_list );
1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (xmctx) {
1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* set the direct/indirect flag */
1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      xmctx->direct = direct;
1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return (GLXContext) xmctx;
1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLXContext MakeCurrent_PrevContext = 0;
1059086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic GLXDrawable MakeCurrent_PrevDrawable = 0;
1060086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic GLXDrawable MakeCurrent_PrevReadable = 0;
1061086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic XMesaBuffer MakeCurrent_PrevDrawBuffer = 0;
1062086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic XMesaBuffer MakeCurrent_PrevReadBuffer = 0;
1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1064086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul/* GLX 1.3 and later */
1065426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1066426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,
1067426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                            GLXDrawable read, GLXContext ctx )
1068086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul{
1069086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   if (ctx && draw && read) {
1070086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      XMesaBuffer drawBuffer, readBuffer;
1071086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      XMesaContext xmctx = (XMesaContext) ctx;
1072086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1073086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'draw' */
1074086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      if (ctx == MakeCurrent_PrevContext
1075086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul          && draw == MakeCurrent_PrevDrawable) {
1076086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         drawBuffer = MakeCurrent_PrevDrawBuffer;
1077086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1078086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      else {
1079086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         drawBuffer = XMesaFindBuffer( dpy, draw );
1080086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1081086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      if (!drawBuffer) {
1082086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         /* drawable must be a new window! */
1083086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         drawBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, draw, ctx );
1084086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         if (!drawBuffer) {
1085086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            /* Out of memory, or context/drawable depth mismatch */
1086086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            return False;
1087086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         }
1088086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1089086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1090086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'read' */
1091086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      if (ctx == MakeCurrent_PrevContext
1092086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul          && read == MakeCurrent_PrevReadable) {
1093086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         readBuffer = MakeCurrent_PrevReadBuffer;
1094086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1095086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      else {
1096086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         readBuffer = XMesaFindBuffer( dpy, read );
1097086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1098086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      if (!readBuffer) {
1099086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         /* drawable must be a new window! */
1100086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         readBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, read, ctx );
1101086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         if (!readBuffer) {
1102086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            /* Out of memory, or context/drawable depth mismatch */
1103086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul            return False;
1104086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul         }
1105086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      }
1106086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1107086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevContext = ctx;
1108086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawable = draw;
1109086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadable = read;
1110086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawBuffer = drawBuffer;
1111086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadBuffer = readBuffer;
1112086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1113086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* Now make current! */
1114086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      return (Bool) XMesaMakeCurrent2((XMesaContext) ctx, drawBuffer, readBuffer);
1115086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
1116086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   else if (!ctx && !draw && !read) {
1117086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* release current context w/out assigning new one. */
1118086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      XMesaMakeCurrent( NULL, NULL );
1119086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevContext = 0;
1120086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawable = 0;
1121086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadable = 0;
1122086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevDrawBuffer = 0;
1123086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      MakeCurrent_PrevReadBuffer = 0;
1124086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      return True;
1125086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
1126086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   else {
1127086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      /* The args must either all be non-zero or all zero.
1128086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul       * This is an error.
1129086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul       */
1130086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul      return False;
1131086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   }
1132086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul}
1133086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1134086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul
1135426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1136426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1137426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
1138426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1139426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return Fake_glXMakeContextCurrent( dpy, drawable, drawable, ctx );
1140426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1141426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1142426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1143426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1144426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
1145426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap )
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual v;
1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b;
1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   v = find_glx_visual( dpy, visinfo );
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!v) {
1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      v = create_glx_visual( dpy, visinfo );
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!v) {
1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!b) {
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return b->frontbuffer;
1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef GLX_MESA_pixmap_colormap
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1169426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
1170426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
1171426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                             Pixmap pixmap, Colormap cmap )
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual v;
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b;
1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   v = find_glx_visual( dpy, visinfo );
1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!v) {
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      v = create_glx_visual( dpy, visinfo );
1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!v) {
1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* unusable visual */
1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   b = XMesaCreatePixmapBuffer( v, pixmap, cmap );
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!b) {
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return 0;
1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return b->frontbuffer;
1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1195426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1196426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b = XMesaFindBuffer(dpy, pixmap);
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (b) {
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaDestroyBuffer(b);
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (getenv("MESA_DEBUG")) {
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf( stderr, "Mesa: glXDestroyGLXPixmap: invalid pixmap\n");
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1208426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1209426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
1210426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                     GLuint mask )
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xm_src = (XMesaContext) src;
1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xm_dst = (XMesaContext) dst;
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   gl_copy_context( xm_src->gl_ctx, xm_dst->gl_ctx, mask );
1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1220426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1221426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryExtension( Display *dpy, int *errorb, int *event )
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Mesa's GLX isn't really an X extension but we try to act like one. */
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) errorb;
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) event;
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return True;
1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid _kw_ungrab_all( Display *dpy )
1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XUngrabPointer( dpy, CurrentTime );
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XUngrabKeyboard( dpy, CurrentTime );
1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1238426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1239426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyContext( Display *dpy, GLXContext ctx )
1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   MakeCurrent_PrevContext = 0;
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   MakeCurrent_PrevDrawable = 0;
1244086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevReadable = 0;
1245086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevDrawBuffer = 0;
1246086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul   MakeCurrent_PrevReadBuffer = 0;
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaDestroyContext( (XMesaContext) ctx );
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaGarbageCollect();
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1253426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1254426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXIsDirect( Display *dpy, GLXContext ctx )
1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return ((XMesaContext) ctx)->direct;
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1262426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1263426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSwapBuffers( Display *dpy, GLXDrawable drawable )
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (buffer) {
1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaSwapBuffers(buffer);
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (getenv("MESA_DEBUG")) {
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr, "Mesa Warning: glXSwapBuffers: invalid drawable\n");
1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1276426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1277426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
1278426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                           int x, int y, int width, int height )
1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable );
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (buffer) {
1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaCopySubBuffer(buffer, x, y, width, height);
1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (getenv("MESA_DEBUG")) {
1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr, "Mesa Warning: glXCopySubBufferMESA: invalid drawable\n");
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1291426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1292426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryVersion( Display *dpy, int *maj, int *min )
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Return GLX version, not Mesa version */
129678fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   assert(CLIENT_MAJOR_VERSION == SERVER_MAJOR_VERSION);
129778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   *maj = CLIENT_MAJOR_VERSION;
129878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   *min = MIN2( CLIENT_MINOR_VERSION, SERVER_MINOR_VERSION );
1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return True;
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Query the GLX attributes of the given XVisualInfo.
1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1307426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1308426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
1309426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                   int attrib, int *value )
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaVisual glxvis;
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   glxvis = find_glx_visual( dpy, visinfo );
1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!glxvis) {
1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* this visual wasn't obtained with glXChooseVisual */
1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      glxvis = create_glx_visual( dpy, visinfo );
1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!glxvis) {
1318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 /* this visual can't be used for GL rendering */
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (attrib==GLX_USE_GL) {
1320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    *value = (int) False;
1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return 0;
1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    /*fprintf( stderr, "Mesa: Error in glXGetConfig: bad visual\n");*/
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    return GLX_BAD_VISUAL;
1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch(attrib) {
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_USE_GL:
1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = (int) True;
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_BUFFER_SIZE:
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 *value = visinfo->depth;
1336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_LEVEL:
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 *value = glxvis->level;
1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_RGBA:
1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 if (glxvis->gl_visual->RGBAflag) {
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    *value = True;
1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 else {
1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	    *value = False;
1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 }
1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DOUBLEBUFFER:
1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 *value = (int) glxvis->gl_visual->DBflag;
1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STEREO:
1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 *value = (int) glxvis->gl_visual->StereoFlag;
1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_AUX_BUFFERS:
1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 *value = (int) False;
1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_RED_SIZE:
1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = glxvis->gl_visual->RedBits;
1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_GREEN_SIZE:
1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = glxvis->gl_visual->GreenBits;
1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_BLUE_SIZE:
1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = glxvis->gl_visual->BlueBits;
1365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ALPHA_SIZE:
1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = glxvis->gl_visual->AlphaBits;
1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_DEPTH_SIZE:
1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = glxvis->gl_visual->DepthBits;
1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_STENCIL_SIZE:
1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 *value = glxvis->gl_visual->StencilBits;
1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_RED_SIZE:
1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_GREEN_SIZE:
1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_BLUE_SIZE:
1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 *value = glxvis->gl_visual->AccumBits;
1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_ACCUM_ALPHA_SIZE:
1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (glxvis->gl_visual->AlphaBits > 0)
1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *value = glxvis->gl_visual->AccumBits;
1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else
1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *value = 0;
1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return 0;
1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /*
1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       * GLX_EXT_visual_info extension
1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       */
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_X_VISUAL_TYPE_EXT:
1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         switch (glxvis->visinfo->CLASS) {
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case StaticGray:   *value = GLX_STATIC_GRAY_EXT;   return 0;
1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case GrayScale:    *value = GLX_GRAY_SCALE_EXT;    return 0;
1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case StaticColor:  *value = GLX_STATIC_GRAY_EXT;   return 0;
1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case PseudoColor:  *value = GLX_PSEUDO_COLOR_EXT;  return 0;
1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case TrueColor:    *value = GLX_TRUE_COLOR_EXT;    return 0;
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            case DirectColor:  *value = GLX_DIRECT_COLOR_EXT;  return 0;
1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_TYPE_EXT:
1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (glxvis->level==0) {
1402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* normal planes */
1403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *value = GLX_NONE_EXT;
1404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else if (glxvis->level>0) {
1406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* overlay */
1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (glxvis->gl_visual->RGBAflag) {
1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = GLX_TRANSPARENT_RGB_EXT;
1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            else {
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = GLX_TRANSPARENT_INDEX_EXT;
1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else if (glxvis->level<0) {
1415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* underlay */
1416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *value = GLX_NONE_EXT;
1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_INDEX_VALUE_EXT:
1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         {
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            int pixel = transparent_pixel( glxvis );
1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            if (pixel>=0) {
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               *value = pixel;
1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* else undefined */
1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_RED_VALUE_EXT:
1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_GREEN_VALUE_EXT:
1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_BLUE_VALUE_EXT:
1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_TRANSPARENT_ALPHA_VALUE_EXT:
1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* undefined */
1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return 0;
1440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /*
1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       * Extensions
1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       */
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return GLX_BAD_ATTRIBUTE;
1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1451426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1452426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitGL( void )
1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xmesa = XMesaGetCurrentContext();
1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaFlush( xmesa );
1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1460426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1461426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitX( void )
1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaContext xmesa = XMesaGetCurrentContext();
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaFlush( xmesa );
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
146843c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul/*
146943c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul * Return the extensions string, which is 3Dfx-dependant.
147043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul */
147143c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paulstatic const char *get_extensions( void )
147243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul{
147343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul#ifdef FX
147443c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   const char *fx = getenv("MESA_GLX_FX");
147543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   if (fx && fx[0] != 'd') {
147697febca0f3b589fb8c245640ac4a5dd45633784cBrian Paul      return "GLX_MESA_pixmap_colormap GLX_EXT_visual_info GLX_MESA_release_buffers GLX_MESA_copy_sub_buffer GLX_SGI_video_sync GLX_MESA_set_3dfx_mode GLX_ARB_get_proc_address";
147743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   }
147843c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul#endif
147997febca0f3b589fb8c245640ac4a5dd45633784cBrian Paul   return "GLX_MESA_pixmap_colormap GLX_EXT_visual_info GLX_MESA_release_buffers GLX_MESA_copy_sub_buffer GLX_SGI_video_sync GLX_ARB_get_proc_address";
148043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul}
1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1485426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1486426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryExtensionsString( Display *dpy, int screen )
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) screen;
149043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   return get_extensions();
1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1496426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1497426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryServerString( Display *dpy, int screen, int name )
1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
149978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   static char version[1000];
150078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   sprintf(version, "%d.%d %s", SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION,
150178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul           MESA_GLX_VERSION);
1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) screen;
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_EXTENSIONS:
150843c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul         return get_extensions();
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VENDOR:
151078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul	 return VENDOR;
1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VERSION:
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return version;
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */
1521426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char *
1522426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetClientString( Display *dpy, int name )
1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
152478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   static char version[1000];
152578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul   sprintf(version, "%d.%d %s", CLIENT_MAJOR_VERSION, CLIENT_MINOR_VERSION,
152678fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul           MESA_GLX_VERSION);
1527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) dpy;
1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_EXTENSIONS:
153243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul         return get_extensions();
1533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VENDOR:
153478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul	 return VENDOR;
1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GLX_VERSION:
1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	 return version;
1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1544426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul/*
1545426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul * GLX 1.3 and later
1546426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul */
1547426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1548426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXFBConfig
1549426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXChooseFBConfig( Display *dpy, int screen,
1550426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                        const int *attribList, int *nitems )
1551426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1552426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1553426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) screen;
1554426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) attribList;
1555426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) nitems;
1556426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1557426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1558426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1559426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1560426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1561426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
1562426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                           int attribute, int *value )
1563426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1564426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1565426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
1566426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) attribute;
1567426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) value;
1568426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1569426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1570426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1571426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1572426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic XVisualInfo *
1573426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
1574426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1575426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1576426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
1577426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1578426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1579426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1580426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1581426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXWindow
1582426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
1583426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                      const int *attribList )
1584426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1585426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1586426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
1587426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) win;
1588426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) attribList;
1589426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1590426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1591426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1592426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1593426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1594426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyWindow( Display *dpy, GLXWindow window )
1595426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1596426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1597426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) window;
1598426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return;
1599426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1600426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1601426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1602426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap
1603426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
1604426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                      const int *attribList )
1605426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1606426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1607426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
1608426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) pixmap;
1609426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) attribList;
1610426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1611426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1612426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1613426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1614426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1615426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
1616426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1617426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1618426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) pixmap;
1619426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return;
1620426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1621426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1622426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1623426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPbuffer
1624426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
1625426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       const int *attribList )
1626426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1627426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1628426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
1629426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) attribList;
1630426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1631426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1632426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1633426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1634426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1635426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf )
1636426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1637426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1638426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) pbuf;
1639426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1640426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1641426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1642426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1643426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
1644426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                       unsigned int *value )
1645426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1646426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1647426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) draw;
1648426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) attribute;
1649426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) value;
1650426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1651426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1652426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1653426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXContext
1654426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
1655426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                          int renderType, GLXContext shareList, Bool direct )
1656426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1657426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1658426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) config;
1659426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) renderType;
1660426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) shareList;
1661426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) direct;
1662426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1663426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1664426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1665426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1666426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1667426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
1668426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1669426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1670426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) ctx;
1671426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) attribute;
1672426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) value;
1673426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1674426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1675426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1676426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1677426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1678426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask )
1679426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1680426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1681426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) drawable;
1682426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) mask;
1683426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1684426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1685426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1686426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void
1687426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
1688426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul                          unsigned long *mask )
1689426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1690426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) dpy;
1691426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) drawable;
1692426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   (void) mask;
1693426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1694b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
1695b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
1696b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul
1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Release the depth, stencil, accum buffers attached to a GLXDrawable
1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (a window or pixmap) prior to destroying the GLXDrawable.
1700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1701426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool
1702426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXReleaseBuffersMESA( Display *dpy, GLXDrawable d )
1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   XMesaBuffer b = XMesaFindBuffer(dpy, d);
1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (b) {
1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      XMesaDestroyBuffer(b);
1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return True;
1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return False;
1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
171343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul/*
171443c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul * GLX_MESA_set_3dfx_mode
171543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul */
1716426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLboolean
1717426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSet3DfxModeMESA( GLint mode )
1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
171943c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul   return XMesaSetFXmode( mode );
1720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
172189a42b7e736bd9b0ab090906cab0cd047a6ec12eBrian Paul
172289a42b7e736bd9b0ab090906cab0cd047a6ec12eBrian Paul
1723426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul/*
1724426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul * GLX_SGI_video_sync
1725426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul */
1726426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1727426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef GLX_SGI_video_sync
1728426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1729426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1730426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetVideoSyncSGI(unsigned int *count)
1731426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1732426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1733426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1734426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1735426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1736426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int
1737426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
1738426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1739426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return 0;
1740426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1741426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1742426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1743426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1744426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
174543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul
1746426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulextern void Fake_glXUseXFont( Font font, int first, int count, int listbase );
1747426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1748426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1749426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstruct _glxapi_table *_mesa_GetGLXDispatchTable(void)
1750426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{
1751426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   static struct _glxapi_table glx;
1752426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1753426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* be sure our dispatch table size <= libGL's table */
1754426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   {
1755426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul      int size = sizeof(struct _glxapi_table) / sizeof(void *);
1756426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul      (void) size;
1757426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul      assert(_glxapi_get_dispatch_table_size() >= size);
1758426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   }
1759426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1760426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* initialize the whole table to no-ops */
1761426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   _glxapi_set_no_op_table(&glx);
1762426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1763426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /* now initialize the table with the functions I implement */
1764426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ChooseVisual = Fake_glXChooseVisual;
1765426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CopyContext = Fake_glXCopyContext;
1766426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateContext = Fake_glXCreateContext;
1767426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateGLXPixmap = Fake_glXCreateGLXPixmap;
1768426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyContext = Fake_glXDestroyContext;
1769426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyGLXPixmap = Fake_glXDestroyGLXPixmap;
1770426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetConfig = Fake_glXGetConfig;
1771426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentContext = Fake_glXGetCurrentContext;*/
1772426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentDrawable = Fake_glXGetCurrentDrawable;*/
1773426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.IsDirect = Fake_glXIsDirect;
1774426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.MakeCurrent = Fake_glXMakeCurrent;
1775426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryExtension = Fake_glXQueryExtension;
1776426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryVersion = Fake_glXQueryVersion;
1777426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.SwapBuffers = Fake_glXSwapBuffers;
1778426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.UseXFont = Fake_glXUseXFont;
1779426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitGL = Fake_glXWaitGL;
1780426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitX = Fake_glXWaitX;
1781426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1782426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef _GLXAPI_VERSION_1_1
1783426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetClientString = Fake_glXGetClientString;
1784426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryExtensionsString = Fake_glXQueryExtensionsString;
1785426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryServerString = Fake_glXQueryServerString;
1786426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1787426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1788426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef _GLXAPI_VERSION_1_2
1789426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentDisplay = Fake_glXGetCurrentDisplay;*/
1790426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1791426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1792426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef _GLXAPI_VERSION_1_3
1793426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ChooseFBConfig = Fake_glXChooseFBConfig;
1794426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateNewContext = Fake_glXCreateNewContext;
1795426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreatePbuffer = Fake_glXCreatePbuffer;
1796426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreatePixmap = Fake_glXCreatePixmap;
1797426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateWindow = Fake_glXCreateWindow;
1798426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyPbuffer = Fake_glXDestroyPbuffer;
1799426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyPixmap = Fake_glXDestroyPixmap;
1800426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.DestroyWindow = Fake_glXDestroyWindow;
1801426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   /*glx.GetCurrentReadDrawable = Fake_glXGetCurrentReadDrawable;*/
1802426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetFBConfigAttrib = Fake_glXGetFBConfigAttrib;
1803426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetSelectedEvent = Fake_glXGetSelectedEvent;
1804426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetVisualFromFBConfig = Fake_glXGetVisualFromFBConfig;
1805426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.MakeContextCurrent = Fake_glXMakeContextCurrent;
1806426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryContext = Fake_glXQueryContext;
1807426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.QueryDrawable = Fake_glXQueryDrawable;
1808426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.SelectEvent = Fake_glXSelectEvent;
1809426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1810426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1811426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef _GLXAPI_SGI_video_sync
1812426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.GetVideoSyncSGI = Fake_glXGetVideoSyncSGI;
1813426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.WaitVideoSyncSGI = Fake_glXWaitVideoSyncSGI;
1814426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1815426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1816426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef _GLXAPI_MESA_copy_sub_buffer
1817426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CopySubBufferMESA = Fake_glXCopySubBufferMESA;
1818426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1819426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1820426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef _GLXAPI_MESA_release_buffers
1821426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.ReleaseBuffersMESA = Fake_glXReleaseBuffersMESA;
1822426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1823426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1824426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef _GLXAPI_MESA_pixmap_colormap
1825426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.CreateGLXPixmapMESA = Fake_glXCreateGLXPixmapMESA;
1826426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1827426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1828426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#ifdef _GLXAPI_MESA_set_3dfx_mode
1829426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   glx.Set3DfxModeMESA = Fake_glXSet3DfxModeMESA;
1830426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#endif
1831426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul
1832426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul   return &glx;
1833426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul}
1834