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