fakeglx.c revision f104619b8f6ece7a60aa365c859b03fbc1d74592
1f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul/* $Id: fakeglx.c,v 1.75 2002/11/10 17:07:06 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 53160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul * Version: 5.0 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 78d687e7e58a148f3f16573636023e54755372010Brian Paul * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. 85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 2936cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paul * This is an emulation of the GLX API which allows Mesa/GLX-based programs 3036cfa38760cc2bd91c08b66bb62c4b6cf9eb5454Brian Paul * to run on X servers which do not have the real GLX extension. 31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Thanks to the contributors: 33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 34ddf69f247fdb246b99ef6525fcfa6eda7b2e2aa7Brian Paul * Initial version: Philip Brown (phil@bolthole.com) 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Better glXGetConfig() support: Armin Liebchen (liebchen@asylum.cs.utah.edu) 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Further visual-handling refinements: Wolfram Gloger 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (wmglo@Dent.MED.Uni-Muenchen.DE). 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Notes: 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Don't be fooled, stereo isn't supported yet. 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 45fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glxheader.h" 46426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul#include "glxapi.h" 47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/xmesa.h" 48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "config.h" 50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "macros.h" 513c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 5271dea349d2be623b7819389428b0d6a124e8d184Brian Paul#include "mmath.h" 535e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 5471dea349d2be623b7819389428b0d6a124e8d184Brian Paul#include "xfonts.h" 55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "xmesaP.h" 56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This indicates the client-side GLX API and GLX encoder version. */ 5978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define CLIENT_MAJOR_VERSION 1 60a573803ed3fe9ef6489f45bd4c5455b77cb33a43Brian Paul#define CLIENT_MINOR_VERSION 4 /* but don't have 1.3's pbuffers, etc yet */ 6178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul 6278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This indicates the server-side GLX decoder version. 63ba57e5297d60eef37e43dd4d7f10d1e62f5e97ceBrian Paul * GLX 1.4 indicates OpenGL 1.3 support 6478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul */ 6578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define SERVER_MAJOR_VERSION 1 66ba57e5297d60eef37e43dd4d7f10d1e62f5e97ceBrian Paul#define SERVER_MINOR_VERSION 4 6778fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul 6878fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* This is appended onto the glXGetClient/ServerString version strings. */ 693160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul#define MESA_GLX_VERSION "Mesa 5.0" 7078fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul 7178fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul/* Who implemented this GLX? */ 7278fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul#define VENDOR "Brian Paul" 7378fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul 74e4656003caee346d9c4eb23256d73409271291a7Brian Paul#define EXTENSIONS \ 75e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_MESA_set_3dfx_mode " \ 76e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_MESA_copy_sub_buffer " \ 77e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_MESA_pixmap_colormap " \ 78e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_MESA_release_buffers " \ 79e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_ARB_get_proc_address " \ 80e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_EXT_visual_info " \ 81e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_EXT_visual_rating " \ 82e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_SGI_video_sync " \ 83e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_SGIX_fbconfig " \ 84e4656003caee346d9c4eb23256d73409271291a7Brian Paul "GLX_SGIX_pbuffer" 8578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 8743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul/* Silence compiler warnings */ 88e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paulextern void Fake_glXDummyFunc( void ); 8943c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paulvoid Fake_glXDummyFunc( void ) 9043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul{ 9143c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul (void) kernel8; 9243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul (void) DitherValues; 9343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul (void) HPCR_DRGB; 9443c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul (void) kernel1; 9543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul} 9643c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul 9743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul 987cf50e137da497a590ec9001a9918972a6246142Brian Paul/* 997cf50e137da497a590ec9001a9918972a6246142Brian Paul * Our fake GLX context will contain a "real" GLX context and an XMesa context. 1007cf50e137da497a590ec9001a9918972a6246142Brian Paul * 1017cf50e137da497a590ec9001a9918972a6246142Brian Paul * Note that a pointer to a __GLXcontext is a pointer to a fake_glx_context, 1027cf50e137da497a590ec9001a9918972a6246142Brian Paul * and vice versa. 1037cf50e137da497a590ec9001a9918972a6246142Brian Paul * 1047cf50e137da497a590ec9001a9918972a6246142Brian Paul * We really just need this structure in order to make the libGL functions 1057cf50e137da497a590ec9001a9918972a6246142Brian Paul * glXGetCurrentContext(), glXGetCurrentDrawable() and glXGetCurrentDisplay() 1067cf50e137da497a590ec9001a9918972a6246142Brian Paul * work correctly. 1077cf50e137da497a590ec9001a9918972a6246142Brian Paul */ 1087cf50e137da497a590ec9001a9918972a6246142Brian Paulstruct fake_glx_context { 1097cf50e137da497a590ec9001a9918972a6246142Brian Paul __GLXcontext glxContext; /* this MUST be first! */ 1107cf50e137da497a590ec9001a9918972a6246142Brian Paul XMesaContext xmesaContext; 1117cf50e137da497a590ec9001a9918972a6246142Brian Paul}; 11243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1157cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/ 1167cf50e137da497a590ec9001a9918972a6246142Brian Paul/*** GLX Visual Code ***/ 1177cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/ 1187cf50e137da497a590ec9001a9918972a6246142Brian Paul 1197cf50e137da497a590ec9001a9918972a6246142Brian Paul#define DONT_CARE -1 1207cf50e137da497a590ec9001a9918972a6246142Brian Paul 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define MAX_VISUALS 100 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual VisualTable[MAX_VISUALS]; 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int NumVisuals = 0; 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * This struct and some code fragments borrowed 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * from Mark Kilgard's GLUT library. 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgtypedef struct _OverlayInfo { 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Avoid 64-bit portability problems by being careful to use 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg longs due to the way XGetWindowProperty is specified. Note 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg that these parameters are passed as CARD32s over X 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg protocol. */ 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned long overlay_visual; 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg long transparent_type; 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg long value; 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg long layer; 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} OverlayInfo; 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Macro to handle c_class vs class field name in XVisualInfo struct */ 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#if defined(__cplusplus) || defined(c_plusplus) 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLASS c_class 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLASS class 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Test if the given XVisualInfo is usable for Mesa rendering. 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLboolean is_usable_visual( XVisualInfo *vinfo ) 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (vinfo->CLASS) { 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case StaticGray: 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GrayScale: 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Any StaticGray/GrayScale visual works in RGB or CI mode */ 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case StaticColor: 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case PseudoColor: 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Any StaticColor/PseudoColor visual of at least 4 bits */ 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vinfo->depth>=4) { 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case TrueColor: 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case DirectColor: 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Any depth of TrueColor or DirectColor works in RGB mode */ 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* This should never happen */ 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the level (overlay, normal, underlay) of a given XVisualInfo. 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: dpy - the X display 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * vinfo - the XVisualInfo to test 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: level of the visual: 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 0 = normal planes 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * >0 = overlay planes 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * <0 = underlay planes 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int level_of_visual( Display *dpy, XVisualInfo *vinfo ) 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Atom overlayVisualsAtom; 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverlayInfo *overlay_info = NULL; 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int numOverlaysPerScreen; 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Status status; 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Atom actualType; 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int actualFormat; 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned long sizeData, bytesLeft; 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int i; 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The SERVER_OVERLAY_VISUALS property on the root window contains 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * a list of overlay visuals. Get that list now. 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True); 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (overlayVisualsAtom == None) { 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg status = XGetWindowProperty(dpy, RootWindow( dpy, vinfo->screen ), 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom, 0L, (long) 10000, False, 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom, &actualType, &actualFormat, 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg &sizeData, &bytesLeft, 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (unsigned char **) &overlay_info ); 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (status != Success || actualType != overlayVisualsAtom || 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg actualFormat != 32 || sizeData < 4) { 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* something went wrong */ 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) overlay_info); 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* search the overlay visual list for the visual ID of interest */ 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg numOverlaysPerScreen = (int) (sizeData / 4); 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<numOverlaysPerScreen;i++) { 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverlayInfo *ov; 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ov = overlay_info + i; 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ov->overlay_visual==vinfo->visualid) { 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* found the visual */ 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (/*ov->transparent_type==1 &&*/ ov->layer!=0) { 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int level = ov->layer; 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) overlay_info); 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return level; 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) overlay_info); 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* The visual ID was not found in the overlay list. */ 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) overlay_info); 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Given an XVisualInfo and RGB, Double, and Depth buffer flags, save the 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * configuration in our list of GLX visuals. 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual 259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgsave_glx_visual( Display *dpy, XVisualInfo *vinfo, 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean rgbFlag, GLboolean alphaFlag, GLboolean dbFlag, 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean stereoFlag, 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint depth_size, GLint stencil_size, 263b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint accumRedSize, GLint accumGreenSize, 264b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint accumBlueSize, GLint accumAlphaSize, 265b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint level ) 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean ximageFlag = GL_TRUE; 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaVisual xmvis; 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean comparePointers; 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (dbFlag) { 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Check if the MESA_BACK_BUFFER env var is set */ 274367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul char *backbuffer = _mesa_getenv("MESA_BACK_BUFFER"); 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (backbuffer) { 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (backbuffer[0]=='p' || backbuffer[0]=='P') { 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ximageFlag = GL_FALSE; 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (backbuffer[0]=='x' || backbuffer[0]=='X') { 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ximageFlag = GL_TRUE; 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 283d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_warning(NULL, "Mesa: invalid value for MESA_BACK_BUFFER environment variable, using an XImage."); 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Comparing IDs uses less memory but sometimes fails. */ 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* XXX revisit this after 3.0 is finished. */ 290367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (_mesa_getenv("MESA_GLX_VISUAL_HACK")) 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg comparePointers = GL_TRUE; 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg comparePointers = GL_FALSE; 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* First check if a matching visual is already in the list */ 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0; i<NumVisuals; i++) { 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaVisual v = VisualTable[i]; 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (v->display == dpy 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && v->level == level 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && v->ximage_flag == ximageFlag 3011832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && v->mesa_visual.rgbMode == rgbFlag 3021832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && v->mesa_visual.doubleBufferMode == dbFlag 3031832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && v->mesa_visual.stereoMode == stereoFlag 3041832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && (v->mesa_visual.alphaBits > 0) == alphaFlag 3051832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && (v->mesa_visual.depthBits >= depth_size || depth_size == 0) 3061832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && (v->mesa_visual.stencilBits >= stencil_size || stencil_size == 0) 3071832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && (v->mesa_visual.accumRedBits >= accumRedSize || accumRedSize == 0) 3081832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && (v->mesa_visual.accumGreenBits >= accumGreenSize || accumGreenSize == 0) 3091832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && (v->mesa_visual.accumBlueBits >= accumBlueSize || accumBlueSize == 0) 3101832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul && (v->mesa_visual.accumAlphaBits >= accumAlphaSize || accumAlphaSize == 0)) { 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* now either compare XVisualInfo pointers or visual IDs */ 312d0247f53aea8fa8677aadc8a00f75c8993be9ebcBrian Paul if ((!comparePointers && v->visinfo->visualid == vinfo->visualid) 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg || (comparePointers && v->vishandle == vinfo)) { 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return v; 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Create a new visual and add it to the list. */ 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 321d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul if (NumVisuals >= MAX_VISUALS) { 322d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_problem(NULL, "GLX Error: maximum number of visuals exceeded"); 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 326c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul xmvis = XMesaCreateVisual( dpy, vinfo, rgbFlag, alphaFlag, dbFlag, 327c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul stereoFlag, ximageFlag, 328c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul depth_size, stencil_size, 329c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul accumRedSize, accumBlueSize, 330c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul accumBlueSize, accumAlphaSize, 0, level, 331c8735e8f8299676e443e6ca0ffd339ab94e013f9Brian Paul GLX_NONE_EXT ); 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (xmvis) { 333f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul /* Save a copy of the pointer now so we can find this visual again 334f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul * if we need to search for it in find_glx_visual(). 335f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul */ 336f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul xmvis->vishandle = vinfo; 337f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul /* add xmvis to the list */ 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg VisualTable[NumVisuals] = xmvis; 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg NumVisuals++; 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return xmvis; 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create a GLX visual from a regular XVisualInfo. 348ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * This is called when Fake GLX is given an XVisualInfo which wasn't 349ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * returned by glXChooseVisual. Since this is the first time we're 350ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * considering this visual we'll take a guess at reasonable values 351ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * for depth buffer size, stencil size, accum size, etc. 352ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * This is the best we can do with a client-side emulation of GLX. 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgcreate_glx_visual( Display *dpy, XVisualInfo *visinfo ) 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int vislevel; 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vislevel = level_of_visual( dpy, visinfo ); 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vislevel) { 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Configure this visual as a CI, single-buffered overlay */ 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return save_glx_visual( dpy, visinfo, 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GL_FALSE, /* rgb */ 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GL_FALSE, /* alpha */ 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GL_FALSE, /* double */ 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GL_FALSE, /* stereo */ 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 0, /* depth bits */ 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 0, /* stencil bits */ 369b2e460018375f699198073a6167e0ee96ba1d267Brian Paul 0,0,0,0, /* accum bits */ 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vislevel /* level */ 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ); 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (is_usable_visual( visinfo )) { 374367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (_mesa_getenv("MESA_GLX_FORCE_CI")) { 3758f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul /* Configure this visual as a COLOR INDEX visual. */ 3768f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul return save_glx_visual( dpy, visinfo, 3778f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul GL_FALSE, /* rgb */ 3788f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul GL_FALSE, /* alpha */ 3798f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul GL_TRUE, /* double */ 3808f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul GL_FALSE, /* stereo */ 3818f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul DEFAULT_SOFTWARE_DEPTH_BITS, 3828f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 8 * sizeof(GLstencil), 3838f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 0 * sizeof(GLaccum), /* r */ 3848f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 0 * sizeof(GLaccum), /* g */ 3858f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 0 * sizeof(GLaccum), /* b */ 3868f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 0 * sizeof(GLaccum), /* a */ 3878f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 0 /* level */ 3888f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul ); 3898f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul } 3908f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul else { 3918f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul /* Configure this visual as RGB, double-buffered, depth-buffered. */ 3928f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul /* This is surely wrong for some people's needs but what else */ 3938f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul /* can be done? They should use glXChooseVisual(). */ 3948f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul return save_glx_visual( dpy, visinfo, 3958f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul GL_TRUE, /* rgb */ 3968f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul GL_FALSE, /* alpha */ 3978f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul GL_TRUE, /* double */ 3988f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul GL_FALSE, /* stereo */ 3998f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul DEFAULT_SOFTWARE_DEPTH_BITS, 4008f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 8 * sizeof(GLstencil), 4018f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 8 * sizeof(GLaccum), /* r */ 4028f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 8 * sizeof(GLaccum), /* g */ 4038f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 8 * sizeof(GLaccum), /* b */ 4048f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 8 * sizeof(GLaccum), /* a */ 4058f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul 0 /* level */ 4068f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul ); 4078f9a594ac8116ed5cab7f8eca14c17ec3e250dadBrian Paul } 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 410d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_warning(NULL, "Mesa: error in glXCreateContext: bad visual\n"); 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Find the GLX visual associated with an XVisualInfo. 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XMesaVisual 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgfind_glx_visual( Display *dpy, XVisualInfo *vinfo ) 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int i; 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 425f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul /* try to match visual id */ 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<NumVisuals;i++) { 427f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul if (VisualTable[i]->display==dpy 428f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul && VisualTable[i]->visinfo->visualid == vinfo->visualid) { 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return VisualTable[i]; 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 432f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul 433f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul /* if that fails, try to match pointers */ 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<NumVisuals;i++) { 435f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul if (VisualTable[i]->display==dpy && VisualTable[i]->vishandle==vinfo) { 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return VisualTable[i]; 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 439f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the transparent pixel value for a GLX visual. 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: glxvis - the glx_visual 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: a pixel value or -1 if no transparent pixel 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic int transparent_pixel( XMesaVisual glxvis ) 451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Display *dpy = glxvis->display; 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XVisualInfo *vinfo = glxvis->visinfo; 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Atom overlayVisualsAtom; 455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverlayInfo *overlay_info = NULL; 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int numOverlaysPerScreen; 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Status status; 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Atom actualType; 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int actualFormat; 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned long sizeData, bytesLeft; 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int i; 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The SERVER_OVERLAY_VISUALS property on the root window contains 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * a list of overlay visuals. Get that list now. 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True); 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (overlayVisualsAtom == None) { 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg status = XGetWindowProperty(dpy, RootWindow( dpy, vinfo->screen ), 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom, 0L, (long) 10000, False, 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom, &actualType, &actualFormat, 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg &sizeData, &bytesLeft, 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (unsigned char **) &overlay_info ); 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (status != Success || actualType != overlayVisualsAtom || 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg actualFormat != 32 || sizeData < 4) { 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* something went wrong */ 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) overlay_info); 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* search the overlay visual list for the visual ID of interest */ 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg numOverlaysPerScreen = (int) (sizeData / 4); 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<numOverlaysPerScreen;i++) { 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverlayInfo *ov; 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ov = overlay_info + i; 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ov->overlay_visual==vinfo->visualid) { 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* found it! */ 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ov->transparent_type==0) { 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* type 0 indicates no transparency */ 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) overlay_info); 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* ov->value is the transparent pixel */ 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) overlay_info); 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return ov->value; 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* The visual ID was not found in the overlay list. */ 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) overlay_info); 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Try to get an X visual which matches the given arguments. 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *get_visual( Display *dpy, int scr, 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned int depth, int xclass ) 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XVisualInfo temp, *vis; 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg long mask; 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int n; 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned int default_depth; 522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int default_class; 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg mask = VisualScreenMask | VisualDepthMask | VisualClassMask; 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg temp.screen = scr; 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg temp.depth = depth; 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg temp.CLASS = xclass; 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default_depth = DefaultDepth(dpy,scr); 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default_class = DefaultVisual(dpy,scr)->CLASS; 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (depth==default_depth && xclass==default_class) { 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* try to get root window's visual */ 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg temp.visualid = DefaultVisual(dpy,scr)->visualid; 535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg mask |= VisualIDMask; 536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = XGetVisualInfo( dpy, mask, &temp, &n ); 539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* In case bits/pixel > 24, make sure color channels are still <=8 bits. 541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * An SGI Infinite Reality system, for example, can have 30bpp pixels: 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 10 bits per color channel. Mesa's limited to a max of 8 bits/channel. 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis && depth > 24 && (xclass==TrueColor || xclass==DirectColor)) { 54571dea349d2be623b7819389428b0d6a124e8d184Brian Paul if (_mesa_bitcount((GLuint) vis->red_mask ) <= 8 && 54671dea349d2be623b7819389428b0d6a124e8d184Brian Paul _mesa_bitcount((GLuint) vis->green_mask) <= 8 && 54771dea349d2be623b7819389428b0d6a124e8d184Brian Paul _mesa_bitcount((GLuint) vis->blue_mask ) <= 8) { 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XFree((void *) vis); 552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Retrieve the value of the given environment variable and find 563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the X visual which matches it. 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: dpy - the display 565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * screen - the screen number 566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * varname - the name of the environment variable 567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: an XVisualInfo pointer to NULL if error. 568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *get_env_visual(Display *dpy, int scr, const char *varname) 570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg char value[100], type[100]; 572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int depth, xclass = -1; 573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XVisualInfo *vis; 574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 575367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (!_mesa_getenv( varname )) { 576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 579367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul _mesa_strncpy( value, _mesa_getenv(varname), 100 ); 580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg value[99] = 0; 581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg sscanf( value, "%s %d", type, &depth ); 583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 584367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (_mesa_strcmp(type,"TrueColor")==0) xclass = TrueColor; 585367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul else if (_mesa_strcmp(type,"DirectColor")==0) xclass = DirectColor; 586367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul else if (_mesa_strcmp(type,"PseudoColor")==0) xclass = PseudoColor; 587367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul else if (_mesa_strcmp(type,"StaticColor")==0) xclass = StaticColor; 588367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul else if (_mesa_strcmp(type,"GrayScale")==0) xclass = GrayScale; 589367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul else if (_mesa_strcmp(type,"StaticGray")==0) xclass = StaticGray; 590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (xclass>-1 && depth>0) { 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, scr, depth, xclass ); 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5982ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "GLX unable to find visual class=%s, depth=%d.", 5992ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul type, depth); 600d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul 601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Select an X visual which satisfies the RGBA/CI flag and minimum depth. 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: dpy, screen - X display and screen number 609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * rgba - GL_TRUE = RGBA mode, GL_FALSE = CI mode 610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * min_depth - minimum visual depth 611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * preferred_class - preferred GLX visual class or DONT_CARE 612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: pointer to an XVisualInfo or NULL. 613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *choose_x_visual( Display *dpy, int screen, 615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean rgba, int min_depth, 616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int preferred_class ) 617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XVisualInfo *vis; 619db6aa58267cad3f502f03ab80b9deb6b75320a91Brian Paul int xclass, visclass = 0; 620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int depth; 621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (rgba) { 623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Atom hp_cr_maps = XInternAtom(dpy, "_HP_RGB_SMOOTH_MAP_LIST", True); 624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* First see if the MESA_RGB_VISUAL env var is defined */ 625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_env_visual( dpy, screen, "MESA_RGB_VISUAL" ); 626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Otherwise, search for a suitable visual */ 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (preferred_class==DONT_CARE) { 631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (xclass=0;xclass<6;xclass++) { 632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (xclass) { 633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 0: visclass = TrueColor; break; 634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 1: visclass = DirectColor; break; 635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 2: visclass = PseudoColor; break; 636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 3: visclass = StaticColor; break; 637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 4: visclass = GrayScale; break; 638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 5: visclass = StaticGray; break; 639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (min_depth==0) { 641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* start with shallowest */ 642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (depth=0;depth<=32;depth++) { 643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (visclass==TrueColor && depth==8 && !hp_cr_maps) { 644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Special case: try to get 8-bit PseudoColor before */ 645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 8-bit TrueColor */ 646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, 8, PseudoColor ); 647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, depth, visclass ); 652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* start with deepest */ 659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (depth=32;depth>=min_depth;depth--) { 660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (visclass==TrueColor && depth==8 && !hp_cr_maps) { 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Special case: try to get 8-bit PseudoColor before */ 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 8-bit TrueColor */ 663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, 8, PseudoColor ); 664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, depth, visclass ); 669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* search for a specific visual class */ 678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (preferred_class) { 679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRUE_COLOR_EXT: visclass = TrueColor; break; 680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_DIRECT_COLOR_EXT: visclass = DirectColor; break; 681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_PSEUDO_COLOR_EXT: visclass = PseudoColor; break; 682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STATIC_COLOR_EXT: visclass = StaticColor; break; 683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_GRAY_SCALE_EXT: visclass = GrayScale; break; 684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STATIC_GRAY_EXT: visclass = StaticGray; break; 685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: return NULL; 686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (min_depth==0) { 688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* start with shallowest */ 689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (depth=0;depth<=32;depth++) { 690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, depth, visclass ); 691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* start with deepest */ 698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (depth=32;depth>=min_depth;depth--) { 699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, depth, visclass ); 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* First see if the MESA_CI_VISUAL env var is defined */ 709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_env_visual( dpy, screen, "MESA_CI_VISUAL" ); 710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Otherwise, search for a suitable visual, starting with shallowest */ 714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (preferred_class==DONT_CARE) { 715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (xclass=0;xclass<4;xclass++) { 716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (xclass) { 717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 0: visclass = PseudoColor; break; 718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 1: visclass = StaticColor; break; 719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 2: visclass = GrayScale; break; 720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 3: visclass = StaticGray; break; 721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* try 8-bit up through 16-bit */ 723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (depth=8;depth<=16;depth++) { 724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, depth, visclass ); 725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* try min_depth up to 8-bit */ 730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (depth=min_depth;depth<8;depth++) { 731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, depth, visclass ); 732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* search for a specific visual class */ 740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (preferred_class) { 741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRUE_COLOR_EXT: visclass = TrueColor; break; 742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_DIRECT_COLOR_EXT: visclass = DirectColor; break; 743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_PSEUDO_COLOR_EXT: visclass = PseudoColor; break; 744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STATIC_COLOR_EXT: visclass = StaticColor; break; 745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_GRAY_SCALE_EXT: visclass = GrayScale; break; 746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STATIC_GRAY_EXT: visclass = StaticGray; break; 747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: return NULL; 748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* try 8-bit up through 16-bit */ 750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (depth=8;depth<=16;depth++) { 751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, depth, visclass ); 752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* try min_depth up to 8-bit */ 757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (depth=min_depth;depth<8;depth++) { 758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = get_visual( dpy, screen, depth, visclass ); 759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return vis; 761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* didn't find a visual */ 767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Find the deepest X over/underlay visual of at least min_depth. 774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: dpy, screen - X display and screen number 775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * level - the over/underlay level 776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * trans_type - transparent pixel type: GLX_NONE_EXT, 777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * GLX_TRANSPARENT_RGB_EXT, GLX_TRANSPARENT_INDEX_EXT, 778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * or DONT_CARE 779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * trans_value - transparent pixel value or DONT_CARE 780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * min_depth - minimum visual depth 781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * preferred_class - preferred GLX visual class or DONT_CARE 782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: pointer to an XVisualInfo or NULL. 783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic XVisualInfo *choose_x_overlay_visual( Display *dpy, int scr, 78542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul GLboolean rgbFlag, 786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int level, int trans_type, 787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int trans_value, 788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int min_depth, 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int preferred_class ) 790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Atom overlayVisualsAtom; 792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverlayInfo *overlay_info; 793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int numOverlaysPerScreen; 794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Status status; 795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg Atom actualType; 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int actualFormat; 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned long sizeData, bytesLeft; 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int i; 799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XVisualInfo *deepvis; 800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int deepest; 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /*DEBUG int tt, tv; */ 803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (preferred_class) { 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRUE_COLOR_EXT: preferred_class = TrueColor; break; 806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_DIRECT_COLOR_EXT: preferred_class = DirectColor; break; 807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_PSEUDO_COLOR_EXT: preferred_class = PseudoColor; break; 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STATIC_COLOR_EXT: preferred_class = StaticColor; break; 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_GRAY_SCALE_EXT: preferred_class = GrayScale; break; 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STATIC_GRAY_EXT: preferred_class = StaticGray; break; 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: preferred_class = DONT_CARE; 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The SERVER_OVERLAY_VISUALS property on the root window contains 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * a list of overlay visuals. Get that list now. 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom = XInternAtom(dpy,"SERVER_OVERLAY_VISUALS", True); 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (overlayVisualsAtom == (Atom) None) { 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg status = XGetWindowProperty(dpy, RootWindow( dpy, scr ), 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom, 0L, (long) 10000, False, 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg overlayVisualsAtom, &actualType, &actualFormat, 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg &sizeData, &bytesLeft, 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (unsigned char **) &overlay_info ); 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (status != Success || actualType != overlayVisualsAtom || 830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg actualFormat != 32 || sizeData < 4) { 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* something went wrong */ 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Search for the deepest overlay which satisifies all criteria. */ 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg deepest = min_depth; 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg deepvis = NULL; 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg numOverlaysPerScreen = (int) (sizeData / 4); 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<numOverlaysPerScreen;i++) { 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XVisualInfo *vislist, vistemplate; 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int count; 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OverlayInfo *ov; 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ov = overlay_info + i; 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ov->layer!=level) { 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* failed overlay level criteria */ 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg continue; 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!(trans_type==DONT_CARE 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg || (trans_type==GLX_TRANSPARENT_INDEX_EXT 852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ov->transparent_type>0) 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg || (trans_type==GLX_NONE_EXT && ov->transparent_type==0))) { 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* failed transparent pixel type criteria */ 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg continue; 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (trans_value!=DONT_CARE && trans_value!=ov->value) { 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* failed transparent pixel value criteria */ 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg continue; 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* get XVisualInfo and check the depth */ 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vistemplate.visualid = ov->overlay_visual; 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vistemplate.screen = scr; 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vislist = XGetVisualInfo( dpy, VisualIDMask | VisualScreenMask, 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg &vistemplate, &count ); 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (count!=1) { 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* something went wrong */ 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg continue; 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (preferred_class!=DONT_CARE && preferred_class!=vislist->CLASS) { 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* wrong visual class */ 874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg continue; 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 87742f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul /* if RGB was requested, make sure we have True/DirectColor */ 87842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul if (rgbFlag && vislist->CLASS != TrueColor 87942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul && vislist->CLASS != DirectColor) 88042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul continue; 88142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul 88242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul /* if CI was requested, make sure we have a color indexed visual */ 88342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul if (!rgbFlag 88442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul && (vislist->CLASS == TrueColor || vislist->CLASS == DirectColor)) 88542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul continue; 88642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (deepvis==NULL || vislist->depth > deepest) { 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* YES! found a satisfactory visual */ 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (deepvis) { 89080af3614d88c0cac160e787de7f34b37e96cb626Brian Paul XFree( deepvis ); 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg deepest = vislist->depth; 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg deepvis = vislist; 894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* DEBUG tt = ov->transparent_type;*/ 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* DEBUG tv = ov->value; */ 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*DEBUG 900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (deepvis) { 901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg printf("chose 0x%x: layer=%d depth=%d trans_type=%d trans_value=%d\n", 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg deepvis->visualid, level, deepvis->depth, tt, tv ); 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg*/ 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return deepvis; 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9097cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/ 9107cf50e137da497a590ec9001a9918972a6246142Brian Paul/*** Begin Fake GLX API Functions ***/ 9117cf50e137da497a590ec9001a9918972a6246142Brian Paul/**********************************************************************/ 9127cf50e137da497a590ec9001a9918972a6246142Brian Paul 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9143265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paulstatic XMesaVisual choose_visual( Display *dpy, int screen, const int *list ) 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 9163265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul const int *parselist; 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XVisualInfo *vis; 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int min_ci = 0; 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int min_red=0, min_green=0, min_blue=0; 920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean rgb_flag = GL_FALSE; 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean alpha_flag = GL_FALSE; 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean double_flag = GL_FALSE; 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean stereo_flag = GL_FALSE; 924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint depth_size = 0; 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint stencil_size = 0; 926b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint accumRedSize = 0; 927b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint accumGreenSize = 0; 928b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint accumBlueSize = 0; 929b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint accumAlphaSize = 0; 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int level = 0; 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int visual_type = DONT_CARE; 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int trans_type = DONT_CARE; 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int trans_value = DONT_CARE; 934e1210b176926349b258c7ec77b7f36716025c82aBrian Paul GLint caveat = DONT_CARE; 9353265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaVisual xmvis = NULL; 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist = list; 938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg while (*parselist) { 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (*parselist) { 942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_USE_GL: 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* ignore */ 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_BUFFER_SIZE: 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg min_ci = *parselist++; 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_LEVEL: 951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg level = *parselist++; 953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_RGBA: 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgb_flag = GL_TRUE; 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_DOUBLEBUFFER: 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg double_flag = GL_TRUE; 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STEREO: 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg stereo_flag = GL_TRUE; 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_AUX_BUFFERS: 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* ignore */ 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_RED_SIZE: 971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg min_red = *parselist++; 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_GREEN_SIZE: 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg min_green = *parselist++; 977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_BLUE_SIZE: 979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg min_blue = *parselist++; 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ALPHA_SIZE: 983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg { 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint size = *parselist++; 986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alpha_flag = size>0 ? 1 : 0; 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_DEPTH_SIZE: 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg depth_size = *parselist++; 992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STENCIL_SIZE: 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg stencil_size = *parselist++; 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ACCUM_RED_SIZE: 998b2e460018375f699198073a6167e0ee96ba1d267Brian Paul parselist++; 999b2e460018375f699198073a6167e0ee96ba1d267Brian Paul { 1000b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint size = *parselist++; 1001b2e460018375f699198073a6167e0ee96ba1d267Brian Paul accumRedSize = MAX2( accumRedSize, size ); 1002b2e460018375f699198073a6167e0ee96ba1d267Brian Paul } 1003b2e460018375f699198073a6167e0ee96ba1d267Brian Paul break; 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ACCUM_GREEN_SIZE: 1005b2e460018375f699198073a6167e0ee96ba1d267Brian Paul parselist++; 1006b2e460018375f699198073a6167e0ee96ba1d267Brian Paul { 1007b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint size = *parselist++; 1008b2e460018375f699198073a6167e0ee96ba1d267Brian Paul accumGreenSize = MAX2( accumGreenSize, size ); 1009b2e460018375f699198073a6167e0ee96ba1d267Brian Paul } 1010b2e460018375f699198073a6167e0ee96ba1d267Brian Paul break; 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ACCUM_BLUE_SIZE: 1012b2e460018375f699198073a6167e0ee96ba1d267Brian Paul parselist++; 1013b2e460018375f699198073a6167e0ee96ba1d267Brian Paul { 1014b2e460018375f699198073a6167e0ee96ba1d267Brian Paul GLint size = *parselist++; 1015b2e460018375f699198073a6167e0ee96ba1d267Brian Paul accumBlueSize = MAX2( accumBlueSize, size ); 1016b2e460018375f699198073a6167e0ee96ba1d267Brian Paul } 1017b2e460018375f699198073a6167e0ee96ba1d267Brian Paul break; 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ACCUM_ALPHA_SIZE: 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg { 1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint size = *parselist++; 1022b2e460018375f699198073a6167e0ee96ba1d267Brian Paul accumAlphaSize = MAX2( accumAlphaSize, size ); 1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * GLX_EXT_visual_info extension 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_X_VISUAL_TYPE_EXT: 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg visual_type = *parselist++; 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_TYPE_EXT: 1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg trans_type = *parselist++; 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_INDEX_VALUE_EXT: 1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg trans_value = *parselist++; 1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_RED_VALUE_EXT: 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_GREEN_VALUE_EXT: 1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_BLUE_VALUE_EXT: 1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_ALPHA_VALUE_EXT: 1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* ignore */ 1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg parselist++; 1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 10495e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 1050e1210b176926349b258c7ec77b7f36716025c82aBrian Paul /* 1051e1210b176926349b258c7ec77b7f36716025c82aBrian Paul * GLX_EXT_visual_info extension 1052e1210b176926349b258c7ec77b7f36716025c82aBrian Paul */ 1053e1210b176926349b258c7ec77b7f36716025c82aBrian Paul case GLX_VISUAL_CAVEAT_EXT: 1054e1210b176926349b258c7ec77b7f36716025c82aBrian Paul parselist++; 1055e1210b176926349b258c7ec77b7f36716025c82aBrian Paul caveat = *parselist++; /* ignored for now */ 1056e1210b176926349b258c7ec77b7f36716025c82aBrian Paul break; 1057e1210b176926349b258c7ec77b7f36716025c82aBrian Paul 10583265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul /* 105966ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul * GLX_ARB_multisample 106066ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul */ 106166ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul case GLX_SAMPLE_BUFFERS_ARB: 106266ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul /* ms not supported */ 106366ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul return NULL; 106466ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul case GLX_SAMPLES_ARB: 106566ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul /* ms not supported */ 106666ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul return NULL; 106766ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul 106866ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul /* 10693265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul * FBConfig attribs. 10703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul */ 10713265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_RENDER_TYPE: 10723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul parselist++; 10733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (*parselist == GLX_RGBA_BIT) { 10743265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul rgb_flag = GL_TRUE; 10753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 10763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul else if (*parselist == GLX_COLOR_INDEX_BIT) { 10773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul rgb_flag = GL_FALSE; 10783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 10793265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul else if (*parselist == 0) { 10803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul rgb_flag = GL_TRUE; 10813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 10823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul parselist++; 10833265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 10843265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_DRAWABLE_TYPE: 10853265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul parselist++; 10863265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (*parselist & ~(GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT)) { 10873265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return NULL; /* bad bit */ 10883265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 10893265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul parselist++; 10903265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 10913265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case None: 1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 10943265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* undefined attribute */ 10972ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "unexpected attrib 0x%x in choose_visual()", 10982ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul *parselist); 1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since we're only simulating the GLX extension this function will never 1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * find any real GL visuals. Instead, all we can do is try to find an RGB 1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * or CI visual of appropriate depth. Other requested attributes such as 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * double buffering, depth buffer, etc. will be associated with the X 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * visual and stored in the VisualTable[]. 1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (level==0) { 1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* normal color planes */ 1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (rgb_flag) { 1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Get an RGB visual */ 1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg int min_rgb = min_red + min_green + min_blue; 1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (min_rgb>1 && min_rgb<8) { 1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* a special case to be sure we can get a monochrome visual */ 1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg min_rgb = 1; 1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = choose_x_visual( dpy, screen, rgb_flag, min_rgb, visual_type ); 1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Get a color index visual */ 1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg vis = choose_x_visual( dpy, screen, rgb_flag, min_ci, visual_type ); 1124b2e460018375f699198073a6167e0ee96ba1d267Brian Paul accumRedSize = accumGreenSize = accumBlueSize = accumAlphaSize = 0; 1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* over/underlay planes */ 112942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul if (rgb_flag) { 113042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul /* rgba overlay */ 113142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul int min_rgb = min_red + min_green + min_blue; 113242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul if (min_rgb>1 && min_rgb<8) { 113342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul /* a special case to be sure we can get a monochrome visual */ 113442f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul min_rgb = 1; 113542f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul } 113642f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level, 113742f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul trans_type, trans_value, min_rgb, visual_type ); 113842f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul } 113942f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul else { 114042f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul /* color index overlay */ 114142f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level, 114242f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul trans_type, trans_value, min_ci, visual_type ); 114342f252fc06e6fd0bb8c95cb9d238c1416b5d50e7Brian Paul } 1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (vis) { 1147ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul /* Note: we're not exactly obeying the glXChooseVisual rules here. 1148ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * When GLX_DEPTH_SIZE = 1 is specified we're supposed to choose the 11492c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul * largest depth buffer size, which is 32bits/value. Instead, we 1150ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul * return 16 to maintain performance with earlier versions of Mesa. 1151ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul */ 11522c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul if (depth_size > 24) 11532c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul depth_size = 31; /* 32 causes int overflow problems */ 1154ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul else if (depth_size > 16) 1155ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul depth_size = 24; 11562c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul else if (depth_size > 0) 11572c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul depth_size = DEFAULT_SOFTWARE_DEPTH_BITS; /*16*/ 11582c7e6334ec81c2fab2cce9e0fe52cd30256e37eaBrian Paul 1159ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul /* we only support one size of stencil and accum buffers. */ 1160ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul if (stencil_size > 0) 1161ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul stencil_size = STENCIL_BITS; 11626d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul if (accumRedSize > 0 || accumGreenSize > 0 || accumBlueSize > 0 || 11636d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul accumAlphaSize > 0) { 1164b2e460018375f699198073a6167e0ee96ba1d267Brian Paul accumRedSize = ACCUM_BITS; 1165b2e460018375f699198073a6167e0ee96ba1d267Brian Paul accumGreenSize = ACCUM_BITS; 1166b2e460018375f699198073a6167e0ee96ba1d267Brian Paul accumBlueSize = ACCUM_BITS; 11676d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul accumAlphaSize = alpha_flag ? ACCUM_BITS : 0; 11686d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul } 11696d62d7f32189d6a7b053420d16495217dc62f66fBrian Paul 11703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul xmvis = save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag, 11713265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul stereo_flag, depth_size, stencil_size, 11723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul accumRedSize, accumGreenSize, 11733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul accumBlueSize, accumAlphaSize, level ); 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 11763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return xmvis; 1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 11803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paulstatic XVisualInfo * 11813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXChooseVisual( Display *dpy, int screen, int *list ) 11823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul{ 11833265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaVisual xmvis = choose_visual(dpy, screen, list); 1184f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul if (xmvis) { 1185f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#if 0 1186f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul return xmvis->vishandle; 1187f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#else 1188f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul /* create a new vishandle - the cached one may be stale */ 1189f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul xmvis->vishandle = _mesa_malloc(sizeof(XVisualInfo)); 1190f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul if (xmvis->vishandle) { 1191f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul _mesa_memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo)); 1192f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul } 11933265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return xmvis->vishandle; 1194f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#endif 1195f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul } 11963265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul else 11973265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return NULL; 11983265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul} 1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1201426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXContext 1202426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateContext( Display *dpy, XVisualInfo *visinfo, 1203426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul GLXContext share_list, Bool direct ) 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1205e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaVisual xmvis; 12067cf50e137da497a590ec9001a9918972a6246142Brian Paul struct fake_glx_context *glxCtx; 12075e1680ce1d8296b2182e8909856927bbeddf3b95Brian Paul struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list; 120899aab341998e84d9fa208c525cae8021b3845812Brian Paul 120999aab341998e84d9fa208c525cae8021b3845812Brian Paul if (!dpy || !visinfo) 121099aab341998e84d9fa208c525cae8021b3845812Brian Paul return 0; 121199aab341998e84d9fa208c525cae8021b3845812Brian Paul 12127cf50e137da497a590ec9001a9918972a6246142Brian Paul glxCtx = CALLOC_STRUCT(fake_glx_context); 12137cf50e137da497a590ec9001a9918972a6246142Brian Paul if (!glxCtx) 12147cf50e137da497a590ec9001a9918972a6246142Brian Paul return 0; 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* deallocate unused windows/buffers */ 1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaGarbageCollect(); 1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1219e4656003caee346d9c4eb23256d73409271291a7Brian Paul xmvis = find_glx_visual( dpy, visinfo ); 1220e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!xmvis) { 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* This visual wasn't found with glXChooseVisual() */ 1222e4656003caee346d9c4eb23256d73409271291a7Brian Paul xmvis = create_glx_visual( dpy, visinfo ); 1223e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!xmvis) { 1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* unusable visual */ 12257cf50e137da497a590ec9001a9918972a6246142Brian Paul FREE(glxCtx); 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1230e4656003caee346d9c4eb23256d73409271291a7Brian Paul glxCtx->xmesaContext = XMesaCreateContext(xmvis, 12315e1680ce1d8296b2182e8909856927bbeddf3b95Brian Paul shareCtx ? shareCtx->xmesaContext : NULL); 12327cf50e137da497a590ec9001a9918972a6246142Brian Paul if (!glxCtx->xmesaContext) { 12337cf50e137da497a590ec9001a9918972a6246142Brian Paul FREE(glxCtx); 12347cf50e137da497a590ec9001a9918972a6246142Brian Paul return NULL; 1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 12367cf50e137da497a590ec9001a9918972a6246142Brian Paul 12377cf50e137da497a590ec9001a9918972a6246142Brian Paul glxCtx->xmesaContext->direct = GL_FALSE; 12387cf50e137da497a590ec9001a9918972a6246142Brian Paul glxCtx->glxContext.isDirect = GL_FALSE; 12397cf50e137da497a590ec9001a9918972a6246142Brian Paul glxCtx->glxContext.currentDpy = dpy; 12407cf50e137da497a590ec9001a9918972a6246142Brian Paul glxCtx->glxContext.xid = (XID) glxCtx; /* self pointer */ 12417cf50e137da497a590ec9001a9918972a6246142Brian Paul 12427cf50e137da497a590ec9001a9918972a6246142Brian Paul assert((void *) glxCtx == (void *) &(glxCtx->glxContext)); 12437cf50e137da497a590ec9001a9918972a6246142Brian Paul 12447cf50e137da497a590ec9001a9918972a6246142Brian Paul return (GLXContext) glxCtx; 1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 12487cf50e137da497a590ec9001a9918972a6246142Brian Paul/* XXX these may have to be removed due to thread-safety issues. */ 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLXContext MakeCurrent_PrevContext = 0; 1250086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic GLXDrawable MakeCurrent_PrevDrawable = 0; 1251086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic GLXDrawable MakeCurrent_PrevReadable = 0; 1252086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic XMesaBuffer MakeCurrent_PrevDrawBuffer = 0; 1253086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paulstatic XMesaBuffer MakeCurrent_PrevReadBuffer = 0; 1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 12557cf50e137da497a590ec9001a9918972a6246142Brian Paul 1256086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul/* GLX 1.3 and later */ 1257426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool 1258426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw, 12597a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell GLXDrawable read, GLXContext ctx ) 1260086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul{ 12617cf50e137da497a590ec9001a9918972a6246142Brian Paul struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx; 12627cf50e137da497a590ec9001a9918972a6246142Brian Paul 12637a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell if (ctx && draw && read) { 1264086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul XMesaBuffer drawBuffer, readBuffer; 12657cf50e137da497a590ec9001a9918972a6246142Brian Paul XMesaContext xmctx = glxCtx->xmesaContext; 1266086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul 1267086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* Find the XMesaBuffer which corresponds to the GLXDrawable 'draw' */ 12687a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell if (ctx == MakeCurrent_PrevContext 12697a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell && draw == MakeCurrent_PrevDrawable) { 1270086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul drawBuffer = MakeCurrent_PrevDrawBuffer; 1271086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1272086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul else { 1273086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul drawBuffer = XMesaFindBuffer( dpy, draw ); 1274086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1275086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul if (!drawBuffer) { 1276086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* drawable must be a new window! */ 12777cf50e137da497a590ec9001a9918972a6246142Brian Paul drawBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, draw, xmctx); 1278086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul if (!drawBuffer) { 1279086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* Out of memory, or context/drawable depth mismatch */ 1280086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul return False; 1281086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1282086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1283086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul 1284086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* Find the XMesaBuffer which corresponds to the GLXDrawable 'read' */ 12857a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell if (ctx == MakeCurrent_PrevContext 1286086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul && read == MakeCurrent_PrevReadable) { 1287086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul readBuffer = MakeCurrent_PrevReadBuffer; 1288086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1289086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul else { 1290086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul readBuffer = XMesaFindBuffer( dpy, read ); 1291086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1292086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul if (!readBuffer) { 1293086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* drawable must be a new window! */ 12947cf50e137da497a590ec9001a9918972a6246142Brian Paul readBuffer = XMesaCreateWindowBuffer2(glxCtx->xmesaContext->xm_visual, 12957cf50e137da497a590ec9001a9918972a6246142Brian Paul read, xmctx); 1296086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul if (!readBuffer) { 1297086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* Out of memory, or context/drawable depth mismatch */ 1298086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul return False; 1299086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1300086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1301086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul 13027a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell MakeCurrent_PrevContext = ctx; 1303086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevDrawable = draw; 1304086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevReadable = read; 1305086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevDrawBuffer = drawBuffer; 1306086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevReadBuffer = readBuffer; 1307086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul 1308086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* Now make current! */ 13097cf50e137da497a590ec9001a9918972a6246142Brian Paul if (XMesaMakeCurrent2(xmctx, drawBuffer, readBuffer)) { 131012c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul ((__GLXcontext *) ctx)->currentDpy = dpy; 131112c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul ((__GLXcontext *) ctx)->currentDrawable = draw; 13128d687e7e58a148f3f16573636023e54755372010Brian Paul#ifndef GLX_BUILT_IN_XMESA 131312c1bee87fcc3a0912685bb6e83447972e5de64eBrian Paul ((__GLXcontext *) ctx)->currentReadable = read; 13148d687e7e58a148f3f16573636023e54755372010Brian Paul#else 13157cf50e137da497a590ec9001a9918972a6246142Brian Paul __glXSetCurrentContext(ctx); 13167cf50e137da497a590ec9001a9918972a6246142Brian Paul#endif 13177cf50e137da497a590ec9001a9918972a6246142Brian Paul return True; 13187cf50e137da497a590ec9001a9918972a6246142Brian Paul } 13197cf50e137da497a590ec9001a9918972a6246142Brian Paul else { 13207cf50e137da497a590ec9001a9918972a6246142Brian Paul return False; 13217cf50e137da497a590ec9001a9918972a6246142Brian Paul } 1322086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 13237a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell else if (!ctx && !draw && !read) { 1324086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* release current context w/out assigning new one. */ 1325086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul XMesaMakeCurrent( NULL, NULL ); 1326086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevContext = 0; 1327086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevDrawable = 0; 1328086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevReadable = 0; 1329086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevDrawBuffer = 0; 1330086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevReadBuffer = 0; 133184cac8441fcf5f692cd220e9fa86cab398a4c159Brian Paul#ifdef GLX_BUILT_IN_XMESA 1332b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /* XXX bind dummy context with __glXSetCurrentContext(ctx); */ 1333b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#endif 1334086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul return True; 1335086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1336086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul else { 1337086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul /* The args must either all be non-zero or all zero. 1338086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul * This is an error. 1339086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul */ 1340086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul return False; 1341086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul } 1342086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul} 1343086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul 1344086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul 1345426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1346426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool 1347426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx ) 1348426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 1349426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul return Fake_glXMakeContextCurrent( dpy, drawable, drawable, ctx ); 1350426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 1351426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1352426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1353426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1354426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap 1355426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo, Pixmap pixmap ) 1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaVisual v; 1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaBuffer b; 1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg v = find_glx_visual( dpy, visinfo ); 1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!v) { 1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg v = create_glx_visual( dpy, visinfo ); 1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!v) { 1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* unusable visual */ 1365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg b = XMesaCreatePixmapBuffer( v, pixmap, 0 ); 1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!b) { 1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return b->frontbuffer; 1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1377b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_pixmap_colormap ***/ 1378b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul 1379426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap 1380426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo, 1381426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul Pixmap pixmap, Colormap cmap ) 1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaVisual v; 1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaBuffer b; 1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg v = find_glx_visual( dpy, visinfo ); 1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!v) { 1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg v = create_glx_visual( dpy, visinfo ); 1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!v) { 1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* unusable visual */ 1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg b = XMesaCreatePixmapBuffer( v, pixmap, cmap ); 1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!b) { 1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return b->frontbuffer; 1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1403426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1404426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap ) 1405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaBuffer b = XMesaFindBuffer(dpy, pixmap); 1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (b) { 1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaDestroyBuffer(b); 1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1410367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul else if (_mesa_getenv("MESA_DEBUG")) { 1411d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_warning(NULL, "Mesa: glXDestroyGLXPixmap: invalid pixmap\n"); 1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14164c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul 1417426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1418426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCopyContext( Display *dpy, GLXContext src, GLXContext dst, 14193994b77bab8c62a4c1a4dffdfba233ef46662b99Brian Paul unsigned long mask ) 1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 142183b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul struct fake_glx_context *fakeSrc = (struct fake_glx_context *) src; 142283b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul struct fake_glx_context *fakeDst = (struct fake_glx_context *) dst; 142383b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul XMesaContext xm_src = fakeSrc->xmesaContext; 142483b820aa98931ef30fa73c72b2a96fe23885955eBrian Paul XMesaContext xm_dst = fakeDst->xmesaContext; 1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) dpy; 14267a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell _mesa_copy_context( xm_src->gl_ctx, xm_dst->gl_ctx, (GLuint) mask ); 1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1431426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool 1432426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryExtension( Display *dpy, int *errorb, int *event ) 1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Mesa's GLX isn't really an X extension but we try to act like one. */ 1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) dpy; 1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) errorb; 1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) event; 1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return True; 1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1442e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paulextern void _kw_ungrab_all( Display *dpy ); 1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid _kw_ungrab_all( Display *dpy ) 1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XUngrabPointer( dpy, CurrentTime ); 1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XUngrabKeyboard( dpy, CurrentTime ); 1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1450426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1451426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyContext( Display *dpy, GLXContext ctx ) 1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 14537cf50e137da497a590ec9001a9918972a6246142Brian Paul struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx; 1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) dpy; 1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MakeCurrent_PrevContext = 0; 1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MakeCurrent_PrevDrawable = 0; 1457086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevReadable = 0; 1458086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevDrawBuffer = 0; 1459086a151f942b2bcd8b9fbc56255e45b8c89b705eBrian Paul MakeCurrent_PrevReadBuffer = 0; 14607cf50e137da497a590ec9001a9918972a6246142Brian Paul XMesaDestroyContext( glxCtx->xmesaContext ); 1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaGarbageCollect(); 1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1466426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool 1467426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXIsDirect( Display *dpy, GLXContext ctx ) 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 14697cf50e137da497a590ec9001a9918972a6246142Brian Paul struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx; 1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) dpy; 14717cf50e137da497a590ec9001a9918972a6246142Brian Paul return glxCtx->xmesaContext->direct; 1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1476426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1477426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSwapBuffers( Display *dpy, GLXDrawable drawable ) 1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable ); 1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (buffer) { 1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaSwapBuffers(buffer); 1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1484367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul else if (_mesa_getenv("MESA_DEBUG")) { 1485d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_warning(NULL, "Mesa: glXSwapBuffers: invalid drawable\n"); 1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14904c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul 1491b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_copy_sub_buffer ***/ 1492b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul 1493426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1494426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable, 1495426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul int x, int y, int width, int height ) 1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaBuffer buffer = XMesaFindBuffer( dpy, drawable ); 1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (buffer) { 1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaCopySubBuffer(buffer, x, y, width, height); 1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1501367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul else if (_mesa_getenv("MESA_DEBUG")) { 1502d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_warning(NULL, "Mesa: glXCopySubBufferMESA: invalid drawable\n"); 1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1508426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool 1509426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryVersion( Display *dpy, int *maj, int *min ) 1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) dpy; 1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Return GLX version, not Mesa version */ 151378fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul assert(CLIENT_MAJOR_VERSION == SERVER_MAJOR_VERSION); 151478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul *maj = CLIENT_MAJOR_VERSION; 151578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul *min = MIN2( CLIENT_MINOR_VERSION, SERVER_MINOR_VERSION ); 1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return True; 1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Query the GLX attributes of the given XVisualInfo. 1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1524426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int 1525e4656003caee346d9c4eb23256d73409271291a7Brian Paulget_config( XMesaVisual xmvis, int attrib, int *value, GLboolean fbconfig ) 1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1527e4656003caee346d9c4eb23256d73409271291a7Brian Paul ASSERT(xmvis); 1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch(attrib) { 1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_USE_GL: 1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = (int) True; 1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_BUFFER_SIZE: 1533e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->visinfo->depth; 1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_LEVEL: 1536e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->level; 1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_RGBA: 1539e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmvis->mesa_visual.rgbMode) { 1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = True; 1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = False; 1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_DOUBLEBUFFER: 1547e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = (int) xmvis->mesa_visual.doubleBufferMode; 1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STEREO: 1550e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = (int) xmvis->mesa_visual.stereoMode; 1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_AUX_BUFFERS: 1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = (int) False; 1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_RED_SIZE: 1556e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.redBits; 1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_GREEN_SIZE: 1559e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.greenBits; 1560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_BLUE_SIZE: 1562e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.blueBits; 1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ALPHA_SIZE: 1565e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.alphaBits; 1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_DEPTH_SIZE: 1568e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.depthBits; 1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_STENCIL_SIZE: 1571e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.stencilBits; 1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ACCUM_RED_SIZE: 1574e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.accumRedBits; 1575b2e460018375f699198073a6167e0ee96ba1d267Brian Paul return 0; 1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ACCUM_GREEN_SIZE: 1577e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.accumGreenBits; 1578b2e460018375f699198073a6167e0ee96ba1d267Brian Paul return 0; 1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ACCUM_BLUE_SIZE: 1580e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.accumBlueBits; 1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_ACCUM_ALPHA_SIZE: 1583e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->mesa_visual.accumAlphaBits; 1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * GLX_EXT_visual_info extension 1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_X_VISUAL_TYPE_EXT: 1590e4656003caee346d9c4eb23256d73409271291a7Brian Paul switch (xmvis->visinfo->CLASS) { 1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case StaticGray: *value = GLX_STATIC_GRAY_EXT; return 0; 1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GrayScale: *value = GLX_GRAY_SCALE_EXT; return 0; 1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case StaticColor: *value = GLX_STATIC_GRAY_EXT; return 0; 1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case PseudoColor: *value = GLX_PSEUDO_COLOR_EXT; return 0; 1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case TrueColor: *value = GLX_TRUE_COLOR_EXT; return 0; 1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case DirectColor: *value = GLX_DIRECT_COLOR_EXT; return 0; 1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_TYPE_EXT: 1600e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmvis->level==0) { 1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* normal planes */ 1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = GLX_NONE_EXT; 1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1604e4656003caee346d9c4eb23256d73409271291a7Brian Paul else if (xmvis->level>0) { 1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* overlay */ 1606e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmvis->mesa_visual.rgbMode) { 1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = GLX_TRANSPARENT_RGB_EXT; 1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = GLX_TRANSPARENT_INDEX_EXT; 1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1613e4656003caee346d9c4eb23256d73409271291a7Brian Paul else if (xmvis->level<0) { 1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* underlay */ 1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = GLX_NONE_EXT; 1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_INDEX_VALUE_EXT: 1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg { 1620e4656003caee346d9c4eb23256d73409271291a7Brian Paul int pixel = transparent_pixel( xmvis ); 1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (pixel>=0) { 1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = pixel; 1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* else undefined */ 1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_RED_VALUE_EXT: 1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* undefined */ 1629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_GREEN_VALUE_EXT: 1631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* undefined */ 1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_BLUE_VALUE_EXT: 1634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* undefined */ 1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_TRANSPARENT_ALPHA_VALUE_EXT: 1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* undefined */ 1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 0; 1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 1641b2e460018375f699198073a6167e0ee96ba1d267Brian Paul * GLX_EXT_visual_info extension 1642b2e460018375f699198073a6167e0ee96ba1d267Brian Paul */ 1643b2e460018375f699198073a6167e0ee96ba1d267Brian Paul case GLX_VISUAL_CAVEAT_EXT: 1644fc68be6b111473a0bf8f991468f973bb9dd275f4Brian Paul /* test for zero, just in case */ 1645e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmvis->VisualCaveat > 0) 1646e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->VisualCaveat; 1647962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul else 1648962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul *value = GLX_NONE_EXT; 1649962f4269153ba954e137aab94ff4eaad4a7b02aeBrian Paul return 0; 1650b2e460018375f699198073a6167e0ee96ba1d267Brian Paul 1651b2e460018375f699198073a6167e0ee96ba1d267Brian Paul /* 165266ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul * GLX_ARB_multisample 1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 165466ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul case GLX_SAMPLE_BUFFERS_ARB: 16553265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *value = 0; 16563265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return 0; 165766ab7271016615cf485fb0b71832833d2e0f99a7Brian Paul case GLX_SAMPLES_ARB: 16583265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *value = 0; 16593265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return 0; 16603265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 16613265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul /* 16623265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul * For FBConfigs: 16633265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul */ 16643265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_SCREEN_EXT: 16653265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 16663265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 1667e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmvis->visinfo->screen; 16683265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 16693265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_DRAWABLE_TYPE: /*SGIX too */ 16703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 16713265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 16723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *value = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; 16733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 16743265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_RENDER_TYPE_SGIX: 16753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 16763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 1677e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmvis->mesa_visual.rgbMode) 16783265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *value = GLX_RGBA_BIT; 16793265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul else 16803265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *value = GLX_COLOR_INDEX_BIT; 16813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 16823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_X_RENDERABLE_SGIX: 16833265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 16843265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 16853265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *value = True; /* XXX really? */ 16863265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 16873265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_FBCONFIG_ID_SGIX: 16883265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 16893265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 1690f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul *value = xmvis->visinfo->visualid; 16913265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 16923265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_MAX_PBUFFER_WIDTH: 16933265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 16943265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 16953265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul /* XXX or MAX_WIDTH? */ 1696f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul *value = DisplayWidth(xmvis->display, xmvis->visinfo->screen); 16973265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 16983265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_MAX_PBUFFER_HEIGHT: 16993265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 17003265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 1701f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul *value = DisplayHeight(xmvis->display, xmvis->visinfo->screen); 17023265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 17033265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_MAX_PBUFFER_PIXELS: 17043265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 17053265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 1706f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul *value = DisplayWidth(xmvis->display, xmvis->visinfo->screen) * 1707f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul DisplayHeight(xmvis->display, xmvis->visinfo->screen); 17083265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 17093265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_VISUAL_ID: 17103265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!fbconfig) 17113265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_ATTRIBUTE; 1712f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul *value = xmvis->visinfo->visualid; 17133265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 17143265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 1715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GLX_BAD_ATTRIBUTE; 1717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 17183265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return Success; 1719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17223265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paulstatic int 17233265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXGetConfig( Display *dpy, XVisualInfo *visinfo, 17243265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul int attrib, int *value ) 17253265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul{ 1726e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaVisual xmvis; 17273265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 1728e4656003caee346d9c4eb23256d73409271291a7Brian Paul xmvis = find_glx_visual( dpy, visinfo ); 1729e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!xmvis) { 17303265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul /* this visual wasn't obtained with glXChooseVisual */ 1731e4656003caee346d9c4eb23256d73409271291a7Brian Paul xmvis = create_glx_visual( dpy, visinfo ); 1732e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!xmvis) { 17333265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul /* this visual can't be used for GL rendering */ 17343265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (attrib==GLX_USE_GL) { 17353265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *value = (int) False; 17363265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return 0; 17373265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 17383265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul else { 17393265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return GLX_BAD_VISUAL; 17403265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 17413265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 17423265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 17433265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 1744e4656003caee346d9c4eb23256d73409271291a7Brian Paul return get_config(xmvis, attrib, value, GL_FALSE); 17453265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul} 17463265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 1747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1748426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1749426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitGL( void ) 1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaContext xmesa = XMesaGetCurrentContext(); 1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaFlush( xmesa ); 1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1757426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1758426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXWaitX( void ) 1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaContext xmesa = XMesaGetCurrentContext(); 1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg XMesaFlush( xmesa ); 1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1765e4656003caee346d9c4eb23256d73409271291a7Brian Paulstatic const char * 1766e4656003caee346d9c4eb23256d73409271291a7Brian Paulget_extensions( void ) 176743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul{ 176843c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul#ifdef FX 1769367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul const char *fx = _mesa_getenv("MESA_GLX_FX"); 177043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul if (fx && fx[0] != 'd') { 1771e4656003caee346d9c4eb23256d73409271291a7Brian Paul return EXTENSIONS; 177243c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul } 177343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul#endif 1774e4656003caee346d9c4eb23256d73409271291a7Brian Paul return EXTENSIONS + 23; /* skip "GLX_MESA_set_3dfx_mode" */ 177543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul} 1776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */ 1780426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char * 1781426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryExtensionsString( Display *dpy, int screen ) 1782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) dpy; 1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) screen; 178543c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul return get_extensions(); 1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */ 1791426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char * 1792426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryServerString( Display *dpy, int screen, int name ) 1793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 179478fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul static char version[1000]; 17952ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_sprintf(version, "%d.%d %s", 17962ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul SERVER_MAJOR_VERSION, SERVER_MINOR_VERSION, MESA_GLX_VERSION); 1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) dpy; 1799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) screen; 1800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (name) { 1802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_EXTENSIONS: 180343c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul return get_extensions(); 1804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_VENDOR: 180578fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul return VENDOR; 1806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_VERSION: 1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return version; 1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* GLX 1.1 and later */ 1816426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic const char * 1817426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetClientString( Display *dpy, int name ) 1818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 181978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul static char version[1000]; 18202ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_sprintf(version, "%d.%d %s", CLIENT_MAJOR_VERSION, 18212ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul CLIENT_MINOR_VERSION, MESA_GLX_VERSION); 1822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) dpy; 1824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (name) { 1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_EXTENSIONS: 182743c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul return get_extensions(); 1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_VENDOR: 182978fc78e0f68a20ae90f3d4aaf361751a9185a0b9Brian Paul return VENDOR; 1830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GLX_VERSION: 1831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return version; 1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1839426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul/* 1840426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul * GLX 1.3 and later 1841426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul */ 1842426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 18437d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 18445605798e56ca6e9f968623f33b58ee7ca90594afBrian Paulstatic GLXFBConfig * 1845426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXChooseFBConfig( Display *dpy, int screen, 1846426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul const int *attribList, int *nitems ) 1847426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 18483265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaVisual xmvis = choose_visual(dpy, screen, attribList); 18493265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (xmvis) { 18503c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul GLXFBConfig *config = _mesa_malloc(sizeof(XMesaVisual)); 18513265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!config) { 18523265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *nitems = 0; 18533265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return NULL; 18543265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 18553265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *nitems = 1; 18563265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul config[0] = (GLXFBConfig) xmvis; 18573265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return (GLXFBConfig *) config; 18583265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 18593265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul else { 18603265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *nitems = 0; 18613265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return NULL; 18623265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 1863426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 1864426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1865426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1866426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int 1867426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config, 1868426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul int attribute, int *value ) 1869426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 18703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaVisual v = (XMesaVisual) config; 1871426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) dpy; 1872426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) config; 18737d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 18747d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul if (!dpy || !config || !value) 18757d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return -1; 18767d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 18773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return get_config(v, attribute, value, GL_TRUE); 1878426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 1879426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1880426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 18815605798e56ca6e9f968623f33b58ee7ca90594afBrian Paulstatic GLXFBConfig * 18825605798e56ca6e9f968623f33b58ee7ca90594afBrian PaulFake_glXGetFBConfigs( Display *dpy, int screen, int *nelements ) 18835605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul{ 18843265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XVisualInfo *visuals, visTemplate; 18853265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul const long visMask = VisualScreenMask; 18863265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul int i; 18873265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 18883265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul /* Get list of all X visuals */ 18893265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul visTemplate.screen = screen; 18903265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul visuals = XGetVisualInfo(dpy, visMask, &visTemplate, nelements); 18913265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (*nelements > 0) { 18923265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaVisual *results; 18933c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul results = _mesa_malloc(*nelements * sizeof(XMesaVisual)); 18943265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul if (!results) { 18953265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul *nelements = 0; 18963265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return NULL; 18973265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 18983265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul for (i = 0; i < *nelements; i++) { 18993265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul results[i] = create_glx_visual(dpy, visuals + i); 19003265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 19013265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return (GLXFBConfig *) results; 19023265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 19033265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return NULL; 19045605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul} 19055605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul 19065605798e56ca6e9f968623f33b58ee7ca90594afBrian Paul 1907426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic XVisualInfo * 1908426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config ) 1909426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 19107d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul if (dpy && config) { 1911f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul XMesaVisual xmvis = (XMesaVisual) config; 1912f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#if 0 1913f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul return xmvis->vishandle; 1914f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#else 1915f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul /* create a new vishandle - the cached one may be stale */ 1916f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul xmvis->vishandle = _mesa_malloc(sizeof(XVisualInfo)); 1917f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul if (xmvis->vishandle) { 1918f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul _mesa_memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo)); 1919f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul } 1920f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul return xmvis->vishandle; 1921f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul#endif 19227d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul } 19237d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul else { 19247d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return NULL; 19257d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul } 1926426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 1927426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1928426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1929426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXWindow 1930426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win, 1931426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul const int *attribList ) 1932426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 1933426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) dpy; 1934426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) config; 1935426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) win; 19367d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul (void) attribList; /* Ignored in GLX 1.3 */ 19377d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 19387d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return win; /* A hack for now */ 1939426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 1940426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1941426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1942426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1943426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyWindow( Display *dpy, GLXWindow window ) 1944426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 19457d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable) window); 19467d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul if (b) 19477d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul XMesaDestroyBuffer(b); 19487d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul /* don't destroy X window */ 1949426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 1950426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1951426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 19527d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul/* XXX untested */ 1953426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPixmap 1954426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap, 1955426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul const int *attribList ) 1956426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 19577d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul XMesaVisual v = (XMesaVisual) config; 19587d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul XMesaBuffer b; 19597d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 1960426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) dpy; 1961426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) config; 1962426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) pixmap; 19637d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul (void) attribList; /* Ignored in GLX 1.3 */ 19647d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 19657d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul if (!dpy || !config || !pixmap) 19667d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return 0; 19677d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 19687d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul b = XMesaCreatePixmapBuffer( v, pixmap, 0 ); 19697d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul if (!b) { 19707d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return 0; 19717d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul } 19727d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 19737d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return pixmap; 1974426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 1975426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1976426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1977426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 1978426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap ) 1979426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 19807d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable)pixmap); 19817d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul if (b) 19827d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul XMesaDestroyBuffer(b); 19837d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul /* don't destroy X pixmap */ 1984426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 1985426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1986426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 1987426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXPbuffer 1988426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreatePbuffer( Display *dpy, GLXFBConfig config, 1989426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul const int *attribList ) 1990426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 19913265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaVisual xmvis = (XMesaVisual) config; 19923265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaBuffer xmbuf; 19937d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul const int *attrib; 19947d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul int width = 0, height = 0; 19957d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE; 19967d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 1997426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) dpy; 19987d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 19993265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul for (attrib = attribList; *attrib; attrib++) { 20007d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul switch (*attrib) { 20017d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_PBUFFER_WIDTH: 20023265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul attrib++; 20033265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul width = *attrib; 20047d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul break; 20057d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_PBUFFER_HEIGHT: 20063265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul attrib++; 20073265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul height = *attrib; 20087d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul break; 20097d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_PRESERVED_CONTENTS: 20103265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul attrib++; 20113265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul preserveContents = *attrib; /* ignored */ 20127d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul break; 20137d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_LARGEST_PBUFFER: 20143265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul attrib++; 20153265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul useLargest = *attrib; /* ignored */ 20167d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul break; 20177d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul default: 20187d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return 0; 20197d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul } 20207d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul } 20217d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 20227d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul if (width == 0 || height == 0) 20237d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return 0; 20247d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 20253265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height); 2026e4656003caee346d9c4eb23256d73409271291a7Brian Paul /* A GLXPbuffer handle must be an X Drawable because that's what 2027e4656003caee346d9c4eb23256d73409271291a7Brian Paul * glXMakeCurrent takes. 2028e4656003caee346d9c4eb23256d73409271291a7Brian Paul */ 2029e4656003caee346d9c4eb23256d73409271291a7Brian Paul return (GLXPbuffer) xmbuf->frontbuffer; 2030426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2031426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2032426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2033426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 2034426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf ) 2035426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2036e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaBuffer b = XMesaFindBuffer(dpy, pbuf); 2037e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (b) { 2038e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaDestroyBuffer(b); 2039e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2040426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2041426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2042426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2043426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 2044426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute, 2045426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul unsigned int *value ) 2046426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2047e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaBuffer xmbuf = XMesaFindBuffer(dpy, draw); 2048e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!xmbuf) 2049e4656003caee346d9c4eb23256d73409271291a7Brian Paul return; 20507d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 20517d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul switch (attribute) { 20527d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_WIDTH: 2053e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmbuf->width; 2054e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 20557d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_HEIGHT: 2056e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmbuf->height; 2057e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 20587d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_PRESERVED_CONTENTS: 2059e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = True; 2060e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 20617d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_LARGEST_PBUFFER: 2062e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmbuf->width * xmbuf->height; 2063e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 20647d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_FBCONFIG_ID: 2065f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul *value = xmbuf->xm_visual->visinfo->visualid; 20667d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return; 20677d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul default: 20687d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return; /* GLX_BAD_ATTRIBUTE? */ 20697d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul } 2070426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2071426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2072426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2073426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic GLXContext 2074426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXCreateNewContext( Display *dpy, GLXFBConfig config, 2075426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul int renderType, GLXContext shareList, Bool direct ) 2076426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2077f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul struct fake_glx_context *glxCtx; 2078f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul struct fake_glx_context *shareCtx = (struct fake_glx_context *) shareList; 2079f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul XMesaVisual xmvis = (XMesaVisual) config; 20807d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 20817d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul if (!dpy || !config || 20827d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul (renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE)) 20837d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return 0; 20847d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 2085f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul glxCtx = CALLOC_STRUCT(fake_glx_context); 2086f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul if (!glxCtx) 2087f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul return 0; 2088f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul 2089f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul /* deallocate unused windows/buffers */ 2090f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul XMesaGarbageCollect(); 2091f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul 2092f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul glxCtx->xmesaContext = XMesaCreateContext(xmvis, 2093f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul shareCtx ? shareCtx->xmesaContext : NULL); 2094f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul if (!glxCtx->xmesaContext) { 2095f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul FREE(glxCtx); 2096f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul return NULL; 2097f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul } 2098f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul 2099f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul glxCtx->xmesaContext->direct = GL_FALSE; 2100f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul glxCtx->glxContext.isDirect = GL_FALSE; 2101f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul glxCtx->glxContext.currentDpy = dpy; 2102f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul glxCtx->glxContext.xid = (XID) glxCtx; /* self pointer */ 2103f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul 2104f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul assert((void *) glxCtx == (void *) &(glxCtx->glxContext)); 2105f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul 2106f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul return (GLXContext) glxCtx; 2107426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2108426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2109426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2110426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int 2111426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value ) 2112426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2113e4656003caee346d9c4eb23256d73409271291a7Brian Paul struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx; 2114e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaContext xmctx = glxCtx->xmesaContext; 2115e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2116426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) dpy; 2117426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) ctx; 21187d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul 21197d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul switch (attribute) { 21207d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_FBCONFIG_ID: 2121f104619b8f6ece7a60aa365c859b03fbc1d74592Brian Paul *value = xmctx->xm_visual->visinfo->visualid; 2122e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 21237d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_RENDER_TYPE: 2124e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmctx->xm_visual->mesa_visual.rgbMode) 2125e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = GLX_RGBA_BIT; 2126e4656003caee346d9c4eb23256d73409271291a7Brian Paul else 2127e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = GLX_COLOR_INDEX_BIT; 2128e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 21297d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul case GLX_SCREEN: 21307d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul *value = 0; 21317d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return Success; 21327d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul default: 21337d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul return GLX_BAD_ATTRIBUTE; 21347d5656bee7d3e0c4ba54005c7af6f59f4bf8aea0Brian Paul } 2135e4656003caee346d9c4eb23256d73409271291a7Brian Paul return 0; 2136426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2137426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2138426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2139426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 2140426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask ) 2141426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2142e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable); 2143e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmbuf) 2144e4656003caee346d9c4eb23256d73409271291a7Brian Paul xmbuf->selectedEvents = mask; 2145426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2146426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2147426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2148426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic void 2149426cb9f58f194a1e30e0908e8fc971bdcae06960Brian PaulFake_glXGetSelectedEvent( Display *dpy, GLXDrawable drawable, 2150426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul unsigned long *mask ) 2151426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2152e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable); 2153e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmbuf) 2154e4656003caee346d9c4eb23256d73409271291a7Brian Paul *mask = xmbuf->selectedEvents; 2155e4656003caee346d9c4eb23256d73409271291a7Brian Paul else 2156e4656003caee346d9c4eb23256d73409271291a7Brian Paul *mask = 0; 2157426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2158b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul 2159b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul 2160b82d993b03320818f88f792a9e713f7ed491bfcbBrian Paul 2161b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_swap_control ***/ 2162783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2163783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2164783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSwapIntervalSGI(int interval) 2165783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2166783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) interval; 2167783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2168783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2169783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2170783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2171783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2172b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_video_sync ***/ 2173783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2174783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2175783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetVideoSyncSGI(unsigned int *count) 2176783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2177783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) count; 2178783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2179783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2180783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2181783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2182783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count) 2183783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2184783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) divisor; 2185783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) remainder; 2186783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) count; 2187783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2188783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2189783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2190783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2191783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2192b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_make_current_read ***/ 2193783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2194426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic Bool 2195783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXMakeCurrentReadSGI(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx) 2196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2197a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul return Fake_glXMakeContextCurrent( dpy, draw, read, ctx ); 2198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2199783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 22007cf50e137da497a590ec9001a9918972a6246142Brian Paul/* not used 2201783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXDrawable 2202b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian PaulFake_glXGetCurrentReadDrawableSGI(void) 2203783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2204783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2205783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 22067cf50e137da497a590ec9001a9918972a6246142Brian Paul*/ 2207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2209b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_source ***/ 2210b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_VL_H) 22114c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul 2212783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXVideoSourceSGIX 2213783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateGLXVideoSourceSGIX(Display *dpy, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode) 2214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2215783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2216783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) screen; 2217783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) server; 2218783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) path; 2219783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) nodeClass; 2220783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) drainNode; 2221783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2222783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2223783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2224783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void 2225783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXDestroyGLXVideoSourceSGIX(Display *dpy, GLXVideoSourceSGIX src) 2226783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2227783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2228783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) src; 2229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2230783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 22314c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul#endif 22324c07bd5709830bd11cb29d4d8b8a56e757dc0365Brian Paul 223389a42b7e736bd9b0ab090906cab0cd047a6ec12eBrian Paul 2234b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_EXT_import_context ***/ 223589a42b7e736bd9b0ab090906cab0cd047a6ec12eBrian Paul 2236783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void 2237783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXFreeContextEXT(Display *dpy, GLXContext context) 2238783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2239783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2240783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) context; 2241783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2242426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2243783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContextID 2244783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetContextIDEXT(const GLXContext context) 2245783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2246783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) context; 2247783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2248783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2249783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2250783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContext 2251783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXImportContextEXT(Display *dpy, GLXContextID contextID) 2252783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2253783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2254783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) contextID; 2255783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2256783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2257426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2258426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int 2259783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute, int *value) 2260426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2261783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2262783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) context; 2263783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) attribute; 2264783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) value; 2265426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul return 0; 2266426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2267426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2268783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2269783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2270b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_fbconfig ***/ 2271426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2272426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstatic int 2273783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value) 2274783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 22753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return Fake_glXGetFBConfigAttrib(dpy, config, attribute, value); 2276783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2277783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2278783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXFBConfigSGIX * 2279783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChooseFBConfigSGIX(Display *dpy, int screen, int *attrib_list, int *nelements) 2280783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 22813265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return (GLXFBConfig *) Fake_glXChooseFBConfig(dpy, screen, attrib_list, nelements); 2282783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2283783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2284e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2285783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXPixmap 2286783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateGLXPixmapWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap) 2287783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2288e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaVisual xmvis = (XMesaVisual) config; 2289e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaBuffer xmbuf = XMesaCreatePixmapBuffer(xmvis, pixmap, 0); 2290e4656003caee346d9c4eb23256d73409271291a7Brian Paul return xmbuf->frontbuffer; /* need to return an X ID */ 2291783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2292783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2293e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2294783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXContext 2295783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct) 2296783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2297e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaVisual xmvis = (XMesaVisual) config; 2298e4656003caee346d9c4eb23256d73409271291a7Brian Paul struct fake_glx_context *glxCtx; 2299e4656003caee346d9c4eb23256d73409271291a7Brian Paul struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list; 2300e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2301e4656003caee346d9c4eb23256d73409271291a7Brian Paul glxCtx = CALLOC_STRUCT(fake_glx_context); 2302e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!glxCtx) 2303e4656003caee346d9c4eb23256d73409271291a7Brian Paul return 0; 2304e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2305e4656003caee346d9c4eb23256d73409271291a7Brian Paul /* deallocate unused windows/buffers */ 2306e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaGarbageCollect(); 2307e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2308e4656003caee346d9c4eb23256d73409271291a7Brian Paul glxCtx->xmesaContext = XMesaCreateContext(xmvis, 2309e4656003caee346d9c4eb23256d73409271291a7Brian Paul shareCtx ? shareCtx->xmesaContext : NULL); 2310e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!glxCtx->xmesaContext) { 2311e4656003caee346d9c4eb23256d73409271291a7Brian Paul FREE(glxCtx); 2312e4656003caee346d9c4eb23256d73409271291a7Brian Paul return NULL; 2313e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2314e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2315e4656003caee346d9c4eb23256d73409271291a7Brian Paul glxCtx->xmesaContext->direct = GL_FALSE; 2316e4656003caee346d9c4eb23256d73409271291a7Brian Paul glxCtx->glxContext.isDirect = GL_FALSE; 2317e4656003caee346d9c4eb23256d73409271291a7Brian Paul glxCtx->glxContext.currentDpy = dpy; 2318e4656003caee346d9c4eb23256d73409271291a7Brian Paul glxCtx->glxContext.xid = (XID) glxCtx; /* self pointer */ 2319e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2320e4656003caee346d9c4eb23256d73409271291a7Brian Paul assert((void *) glxCtx == (void *) &(glxCtx->glxContext)); 2321e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2322e4656003caee346d9c4eb23256d73409271291a7Brian Paul return (GLXContext) glxCtx; 2323783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2324783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2325e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2326783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic XVisualInfo * 2327783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetVisualFromFBConfigSGIX(Display *dpy, GLXFBConfigSGIX config) 2328783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 23293265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return Fake_glXGetVisualFromFBConfig(dpy, config); 2330783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2331783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2332e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2333783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXFBConfigSGIX 2334783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis) 2335426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2336e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaVisual xmvis = find_glx_visual(dpy, vis); 2337e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!xmvis) { 2338e4656003caee346d9c4eb23256d73409271291a7Brian Paul /* This visual wasn't found with glXChooseVisual() */ 2339e4656003caee346d9c4eb23256d73409271291a7Brian Paul xmvis = create_glx_visual(dpy, vis); 2340e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2341e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2342e4656003caee346d9c4eb23256d73409271291a7Brian Paul return (GLXFBConfigSGIX) xmvis; 2343426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2344426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2345426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2346426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2347b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_pbuffer ***/ 2348783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2349783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic GLXPbufferSGIX 23503265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian PaulFake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config, 23513265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul unsigned int width, unsigned int height, 23523265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul int *attribList) 2353783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 23543265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaVisual xmvis = (XMesaVisual) config; 23553265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaBuffer xmbuf; 23563265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul const int *attrib; 23573265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE; 23583265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 2359783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 23603265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 23613265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul for (attrib = attribList; *attrib; attrib++) { 23623265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul switch (*attrib) { 23633265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_PRESERVED_CONTENTS_SGIX: 23643265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul attrib++; 23653265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul preserveContents = *attrib; /* ignored */ 23663265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 23673265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul case GLX_LARGEST_PBUFFER_SGIX: 23683265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul attrib++; 23693265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul useLargest = *attrib; /* ignored */ 23703265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul break; 23713265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul default: 23723265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul return 0; 23733265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 23743265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul } 23753265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul 23763265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height); 2377e4656003caee346d9c4eb23256d73409271291a7Brian Paul /* A GLXPbuffer handle must be an X Drawable because that's what 2378e4656003caee346d9c4eb23256d73409271291a7Brian Paul * glXMakeCurrent takes. 2379e4656003caee346d9c4eb23256d73409271291a7Brian Paul */ 2380e4656003caee346d9c4eb23256d73409271291a7Brian Paul return (GLXPbuffer) xmbuf->frontbuffer; 2381783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2382783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2383e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2384783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void 2385783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXDestroyGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf) 2386783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2387e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf); 2388e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmbuf) { 2389e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaDestroyBuffer(xmbuf); 2390e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2391783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2392783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2393e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2394783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2395783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryGLXPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value) 2396783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2397e4656003caee346d9c4eb23256d73409271291a7Brian Paul const XMesaBuffer xmbuf = XMesaFindBuffer(dpy, pbuf); 2398e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2399e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (!xmbuf) { 2400e4656003caee346d9c4eb23256d73409271291a7Brian Paul /* Generate GLXBadPbufferSGIX for bad pbuffer */ 2401e4656003caee346d9c4eb23256d73409271291a7Brian Paul return 0; 2402e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2403e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2404e4656003caee346d9c4eb23256d73409271291a7Brian Paul switch (attribute) { 2405e4656003caee346d9c4eb23256d73409271291a7Brian Paul case GLX_PRESERVED_CONTENTS_SGIX: 2406e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = True; 2407e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 2408e4656003caee346d9c4eb23256d73409271291a7Brian Paul case GLX_LARGEST_PBUFFER_SGIX: 2409e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmbuf->width * xmbuf->height; 2410e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 2411e4656003caee346d9c4eb23256d73409271291a7Brian Paul case GLX_WIDTH_SGIX: 2412e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmbuf->width; 2413e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 2414e4656003caee346d9c4eb23256d73409271291a7Brian Paul case GLX_HEIGHT_SGIX: 2415e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = xmbuf->height; 2416e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 2417e4656003caee346d9c4eb23256d73409271291a7Brian Paul case GLX_EVENT_MASK_SGIX: 2418e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = 0; /* XXX might be wrong */ 2419e4656003caee346d9c4eb23256d73409271291a7Brian Paul break; 2420e4656003caee346d9c4eb23256d73409271291a7Brian Paul default: 2421e4656003caee346d9c4eb23256d73409271291a7Brian Paul *value = 0; 2422e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2423783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2424783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2425783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2426e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2427783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void 2428783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSelectEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long mask) 2429783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2430e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable); 2431e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmbuf) { 2432e4656003caee346d9c4eb23256d73409271291a7Brian Paul /* Note: we'll never generate clobber events */ 2433e4656003caee346d9c4eb23256d73409271291a7Brian Paul xmbuf->selectedEvents = mask; 2434e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2435783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2436783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2437e4656003caee346d9c4eb23256d73409271291a7Brian Paul 2438783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void 2439783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetSelectedEventSGIX(Display *dpy, GLXDrawable drawable, unsigned long *mask) 2440783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2441e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaBuffer xmbuf = XMesaFindBuffer(dpy, drawable); 2442e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (xmbuf) { 2443e4656003caee346d9c4eb23256d73409271291a7Brian Paul *mask = xmbuf->selectedEvents; 2444e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2445e4656003caee346d9c4eb23256d73409271291a7Brian Paul else { 2446e4656003caee346d9c4eb23256d73409271291a7Brian Paul *mask = 0; 2447e4656003caee346d9c4eb23256d73409271291a7Brian Paul } 2448783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2449783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2450783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2451783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2452b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGI_cushion ***/ 2453783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2454783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void 2455783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXCushionSGI(Display *dpy, Window win, float cushion) 2456783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2457783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2458783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) win; 2459783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) cushion; 2460783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2461783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2462783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2463783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2464b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_resize ***/ 2465783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2466783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2467783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXBindChannelToWindowSGIX(Display *dpy, int screen, int channel , Window window) 2468783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2469783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2470783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) screen; 2471783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) channel; 2472783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) window; 2473783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2474783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2475783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2476783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2477783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChannelRectSGIX(Display *dpy, int screen, int channel, int x, int y, int w, int h) 2478783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2479783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2480783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) screen; 2481783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) channel; 2482783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) x; 2483783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) y; 2484783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) w; 2485783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) h; 2486783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2487783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2488783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2489783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2490783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryChannelRectSGIX(Display *dpy, int screen, int channel, int *x, int *y, int *w, int *h) 2491783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2492783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2493783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) screen; 2494783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) channel; 2495783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) x; 2496783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) y; 2497783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) w; 2498783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) h; 2499783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2500783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2501783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2502783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2503783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel, int *dx, int *dy, int *dw, int *dh) 2504783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2505783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2506783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) screen; 2507783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) channel; 2508783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dx; 2509783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dy; 2510783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dw; 2511783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dh; 2512783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2513783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2514783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2515783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic int 2516783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXChannelRectSyncSGIX(Display *dpy, int screen, int channel, GLenum synctype) 2517783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2518783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2519783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) screen; 2520783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) channel; 2521783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) synctype; 2522783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2523783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2524783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2525783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2526783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2527b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_dmbuffer **/ 2528783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2529b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_DM_BUFFER_H_) 2530783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool 2531783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXAssociateDMPbufferSGIX(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer) 2532783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2533783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2534783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) pbuffer; 2535783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) params; 2536783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dmbuffer; 2537783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return False; 2538783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2539783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif 2540783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2541783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2542b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_swap_group ***/ 2543783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2544783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void 2545783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXJoinSwapGroupSGIX(Display *dpy, GLXDrawable drawable, GLXDrawable member) 2546783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2547783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2548783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) drawable; 2549783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) member; 2550783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2551783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2552783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2553783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2554b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_swap_barrier ***/ 2555783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2556783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic void 2557783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXBindSwapBarrierSGIX(Display *dpy, GLXDrawable drawable, int barrier) 2558783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2559783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2560783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) drawable; 2561783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) barrier; 2562783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2563783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2564783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool 2565783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXQueryMaxSwapBarriersSGIX(Display *dpy, int screen, int *max) 2566783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2567783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2568783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) screen; 2569783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) max; 2570783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return False; 2571783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2572783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2573783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2574783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2575b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SUN_get_transparent_index ***/ 2576783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2577783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Status 2578783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXGetTransparentIndexSUN(Display *dpy, Window overlay, Window underlay, long *pTransparent) 2579783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2580783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) dpy; 2581783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) overlay; 2582783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) underlay; 2583783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul (void) pTransparent; 2584783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return 0; 2585783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2586783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2587783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2588783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2589b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_release_buffers ***/ 2590b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul 2591783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul/* 2592783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul * Release the depth, stencil, accum buffers attached to a GLXDrawable 2593783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul * (a window or pixmap) prior to destroying the GLXDrawable. 2594783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul */ 2595783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool 2596783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXReleaseBuffersMESA( Display *dpy, GLXDrawable d ) 2597783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2598783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul XMesaBuffer b = XMesaFindBuffer(dpy, d); 2599783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul if (b) { 2600783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul XMesaDestroyBuffer(b); 2601783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return True; 2602783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul } 2603783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return False; 2604783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2605783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2606783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2607783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2608b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_MESA_set_3dfx_mode ***/ 2609b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul 2610783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paulstatic Bool 2611783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian PaulFake_glXSet3DfxModeMESA( int mode ) 2612783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul{ 2613783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul return XMesaSetFXmode( mode ); 2614783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul} 2615783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2616783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2617783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 26188fefafa2200d3ea44ec46592b190654a10685b46Brian Paul/*** AGP memory allocation ***/ 26198fefafa2200d3ea44ec46592b190654a10685b46Brian Paulstatic void * 26208fefafa2200d3ea44ec46592b190654a10685b46Brian PaulFake_glXAllocateMemoryNV( GLsizei size, 26218fefafa2200d3ea44ec46592b190654a10685b46Brian Paul GLfloat readFrequency, 26228fefafa2200d3ea44ec46592b190654a10685b46Brian Paul GLfloat writeFrequency, 26238fefafa2200d3ea44ec46592b190654a10685b46Brian Paul GLfloat priority ) 26248fefafa2200d3ea44ec46592b190654a10685b46Brian Paul{ 26258fefafa2200d3ea44ec46592b190654a10685b46Brian Paul (void) size; 26268fefafa2200d3ea44ec46592b190654a10685b46Brian Paul (void) readFrequency; 26278fefafa2200d3ea44ec46592b190654a10685b46Brian Paul (void) writeFrequency; 26288fefafa2200d3ea44ec46592b190654a10685b46Brian Paul (void) priority; 26298fefafa2200d3ea44ec46592b190654a10685b46Brian Paul return NULL; 26308fefafa2200d3ea44ec46592b190654a10685b46Brian Paul} 26318fefafa2200d3ea44ec46592b190654a10685b46Brian Paul 26328fefafa2200d3ea44ec46592b190654a10685b46Brian Paul 26338fefafa2200d3ea44ec46592b190654a10685b46Brian Paulstatic void 26348fefafa2200d3ea44ec46592b190654a10685b46Brian PaulFake_glXFreeMemoryNV( GLvoid *pointer ) 26358fefafa2200d3ea44ec46592b190654a10685b46Brian Paul{ 26368fefafa2200d3ea44ec46592b190654a10685b46Brian Paul (void) pointer; 26378fefafa2200d3ea44ec46592b190654a10685b46Brian Paul} 26388fefafa2200d3ea44ec46592b190654a10685b46Brian Paul 26398fefafa2200d3ea44ec46592b190654a10685b46Brian Paul 264043c9c2cfae458cf0d7618af5f25d57c0a5ebae08Brian Paul 2641e7b16b74bf5d13331b5a88bbbbb9096560297b63Brian Paulextern struct _glxapi_table *_mesa_GetGLXDispatchTable(void); 2642426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paulstruct _glxapi_table *_mesa_GetGLXDispatchTable(void) 2643426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul{ 2644426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul static struct _glxapi_table glx; 2645426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2646426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul /* be sure our dispatch table size <= libGL's table */ 2647426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul { 264801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul GLuint size = sizeof(struct _glxapi_table) / sizeof(void *); 2649426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul (void) size; 2650426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul assert(_glxapi_get_dispatch_table_size() >= size); 2651426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul } 2652426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2653426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul /* initialize the whole table to no-ops */ 2654426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul _glxapi_set_no_op_table(&glx); 2655426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2656426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul /* now initialize the table with the functions I implement */ 2657426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.ChooseVisual = Fake_glXChooseVisual; 2658426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CopyContext = Fake_glXCopyContext; 2659426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CreateContext = Fake_glXCreateContext; 2660426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CreateGLXPixmap = Fake_glXCreateGLXPixmap; 2661426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.DestroyContext = Fake_glXDestroyContext; 2662426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.DestroyGLXPixmap = Fake_glXDestroyGLXPixmap; 2663426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.GetConfig = Fake_glXGetConfig; 2664426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul /*glx.GetCurrentContext = Fake_glXGetCurrentContext;*/ 2665426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul /*glx.GetCurrentDrawable = Fake_glXGetCurrentDrawable;*/ 2666426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.IsDirect = Fake_glXIsDirect; 2667426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.MakeCurrent = Fake_glXMakeCurrent; 2668426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.QueryExtension = Fake_glXQueryExtension; 2669426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.QueryVersion = Fake_glXQueryVersion; 2670426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.SwapBuffers = Fake_glXSwapBuffers; 2671426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.UseXFont = Fake_glXUseXFont; 2672426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.WaitGL = Fake_glXWaitGL; 2673426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.WaitX = Fake_glXWaitX; 2674426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2675b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_VERSION_1_1 ***/ 2676426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.GetClientString = Fake_glXGetClientString; 2677426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.QueryExtensionsString = Fake_glXQueryExtensionsString; 2678426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.QueryServerString = Fake_glXQueryServerString; 2679426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2680b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_VERSION_1_2 ***/ 2681426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul /*glx.GetCurrentDisplay = Fake_glXGetCurrentDisplay;*/ 2682426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2683b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_VERSION_1_3 ***/ 2684426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.ChooseFBConfig = Fake_glXChooseFBConfig; 2685426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CreateNewContext = Fake_glXCreateNewContext; 2686426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CreatePbuffer = Fake_glXCreatePbuffer; 2687426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CreatePixmap = Fake_glXCreatePixmap; 2688426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CreateWindow = Fake_glXCreateWindow; 2689426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.DestroyPbuffer = Fake_glXDestroyPbuffer; 2690426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.DestroyPixmap = Fake_glXDestroyPixmap; 2691426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.DestroyWindow = Fake_glXDestroyWindow; 2692426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul /*glx.GetCurrentReadDrawable = Fake_glXGetCurrentReadDrawable;*/ 2693426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.GetFBConfigAttrib = Fake_glXGetFBConfigAttrib; 269471dea349d2be623b7819389428b0d6a124e8d184Brian Paul glx.GetFBConfigs = Fake_glXGetFBConfigs; 2695426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.GetSelectedEvent = Fake_glXGetSelectedEvent; 2696426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.GetVisualFromFBConfig = Fake_glXGetVisualFromFBConfig; 2697426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.MakeContextCurrent = Fake_glXMakeContextCurrent; 2698426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.QueryContext = Fake_glXQueryContext; 2699426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.QueryDrawable = Fake_glXQueryDrawable; 2700426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.SelectEvent = Fake_glXSelectEvent; 2701426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2702b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGI_swap_control ***/ 2703783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.SwapIntervalSGI = Fake_glXSwapIntervalSGI; 2704783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2705b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGI_video_sync ***/ 2706426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.GetVideoSyncSGI = Fake_glXGetVideoSyncSGI; 2707426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.WaitVideoSyncSGI = Fake_glXWaitVideoSyncSGI; 2708426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2709b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGI_make_current_read ***/ 2710783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.MakeCurrentReadSGI = Fake_glXMakeCurrentReadSGI; 27117cf50e137da497a590ec9001a9918972a6246142Brian Paul /*glx.GetCurrentReadDrawableSGI = Fake_glXGetCurrentReadDrawableSGI;*/ 2712783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2713b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul/*** GLX_SGIX_video_source ***/ 2714b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_VL_H) 2715783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.CreateGLXVideoSourceSGIX = Fake_glXCreateGLXVideoSourceSGIX; 2716783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.DestroyGLXVideoSourceSGIX = Fake_glXDestroyGLXVideoSourceSGIX; 2717783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif 2718783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2719b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_EXT_import_context ***/ 2720783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.FreeContextEXT = Fake_glXFreeContextEXT; 2721783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.GetContextIDEXT = Fake_glXGetContextIDEXT; 27227cf50e137da497a590ec9001a9918972a6246142Brian Paul /*glx.GetCurrentDisplayEXT = Fake_glXGetCurrentDisplayEXT;*/ 2723783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.ImportContextEXT = Fake_glXImportContextEXT; 2724783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.QueryContextInfoEXT = Fake_glXQueryContextInfoEXT; 27254536021a62e02fceaa6e8eb889b0f61743109cc4Brian Paul 2726b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGIX_fbconfig ***/ 2727783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.GetFBConfigAttribSGIX = Fake_glXGetFBConfigAttribSGIX; 2728783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.ChooseFBConfigSGIX = Fake_glXChooseFBConfigSGIX; 2729783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.CreateGLXPixmapWithConfigSGIX = Fake_glXCreateGLXPixmapWithConfigSGIX; 2730783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.CreateContextWithConfigSGIX = Fake_glXCreateContextWithConfigSGIX; 2731783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.GetVisualFromFBConfigSGIX = Fake_glXGetVisualFromFBConfigSGIX; 2732783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.GetFBConfigFromVisualSGIX = Fake_glXGetFBConfigFromVisualSGIX; 2733783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2734b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGIX_pbuffer ***/ 2735783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.CreateGLXPbufferSGIX = Fake_glXCreateGLXPbufferSGIX; 2736783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.DestroyGLXPbufferSGIX = Fake_glXDestroyGLXPbufferSGIX; 2737783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.QueryGLXPbufferSGIX = Fake_glXQueryGLXPbufferSGIX; 2738783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.SelectEventSGIX = Fake_glXSelectEventSGIX; 2739783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.GetSelectedEventSGIX = Fake_glXGetSelectedEventSGIX; 2740783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2741b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGI_cushion ***/ 2742783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.CushionSGI = Fake_glXCushionSGI; 2743783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2744b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGIX_video_resize ***/ 2745783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.BindChannelToWindowSGIX = Fake_glXBindChannelToWindowSGIX; 2746783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.ChannelRectSGIX = Fake_glXChannelRectSGIX; 2747783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.QueryChannelRectSGIX = Fake_glXQueryChannelRectSGIX; 2748783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.QueryChannelDeltasSGIX = Fake_glXQueryChannelDeltasSGIX; 2749783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.ChannelRectSyncSGIX = Fake_glXChannelRectSyncSGIX; 2750783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2751b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGIX_dmbuffer **/ 2752b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul#if defined(_DM_BUFFER_H_) 2753783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.AssociateDMPbufferSGIX = NULL; 2754783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul#endif 2755783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2756b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGIX_swap_group ***/ 2757783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.JoinSwapGroupSGIX = Fake_glXJoinSwapGroupSGIX; 2758783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2759b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SGIX_swap_barrier ***/ 2760783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.BindSwapBarrierSGIX = Fake_glXBindSwapBarrierSGIX; 2761783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.QueryMaxSwapBarriersSGIX = Fake_glXQueryMaxSwapBarriersSGIX; 2762783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul 2763b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_SUN_get_transparent_index ***/ 2764783d7dfcbf40f727c85915b3e5ea5ff6682eaa48Brian Paul glx.GetTransparentIndexSUN = Fake_glXGetTransparentIndexSUN; 27654536021a62e02fceaa6e8eb889b0f61743109cc4Brian Paul 2766b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_MESA_copy_sub_buffer ***/ 2767426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CopySubBufferMESA = Fake_glXCopySubBufferMESA; 2768426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2769b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_MESA_release_buffers ***/ 2770426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.ReleaseBuffersMESA = Fake_glXReleaseBuffersMESA; 2771426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2772b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_MESA_pixmap_colormap ***/ 2773426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.CreateGLXPixmapMESA = Fake_glXCreateGLXPixmapMESA; 2774426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 2775b0bb4f6226a18e0a6eb40046c7f7b5a841c75edaBrian Paul /*** GLX_MESA_set_3dfx_mode ***/ 2776426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul glx.Set3DfxModeMESA = Fake_glXSet3DfxModeMESA; 2777426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul 27788fefafa2200d3ea44ec46592b190654a10685b46Brian Paul /*** GLX AGP memory allocation ***/ 27798fefafa2200d3ea44ec46592b190654a10685b46Brian Paul glx.AllocateMemoryNV = Fake_glXAllocateMemoryNV; 27808fefafa2200d3ea44ec46592b190654a10685b46Brian Paul glx.FreeMemoryNV = Fake_glXFreeMemoryNV; 27818fefafa2200d3ea44ec46592b190654a10685b46Brian Paul 2782426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul return &glx; 2783426cb9f58f194a1e30e0908e8fc971bdcae06960Brian Paul} 2784