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