1693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa 3-D graphics library 3fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * Version: 7.1 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 5fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 7693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 8693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * copy of this software and associated documentation files (the "Software"), 9693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * to deal in the Software without restriction, including without limitation 10693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and/or sell copies of the Software, and to permit persons to whom the 12693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Software is furnished to do so, subject to the following conditions: 135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 14693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The above copyright notice and this permission notice shall be included 15693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in all copies or substantial portions of the Software. 165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 17693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 24693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 25d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 26d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \file xm_api.c 27d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * 28d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * All the XMesa* API functions. 29693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 30693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 31693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * NOTES: 32693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 33693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The window coordinate system origin (0,0) is in the lower-left corner 34693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * of the window. X11's window coordinate origin is in the upper-left 35693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * corner of the window. Therefore, most drawing functions in this 36693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * file have to flip Y coordinates. 37693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 38693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile 39693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in support for the MIT Shared Memory extension. If enabled, when you 40693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * use an Ximage for the back buffer in double buffered mode, the "swap" 41693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * operation will be faster. You must also link with -lXext. 42693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 43693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Byte swapping: If the Mesa host and the X display use a different 44693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * byte order then there's some trickiness to be aware of when using 45693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XImages. The byte ordering used for the XImage is that of the X 46693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * display, not the Mesa host. 47693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The color-to-pixel encoding for True/DirectColor must be done 48693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * according to the display's visual red_mask, green_mask, and blue_mask. 49693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 50693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * do byte swapping if needed. If one wants to directly "poke" the pixel 51693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * into the XImage's buffer then the pixel must be byte swapped first. In 52693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format 53693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and use XPutPixel everywhere except in the implementation of 54693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * glClear(GL_COLOR_BUFFER_BIT). We want this function to be fast so 55693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * instead of using XPutPixel we "poke" our values after byte-swapping 56693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the clear pixel value if needed. 57693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 58693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 59693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 60693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef __CYGWIN__ 61693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef WIN32 62693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef __WIN32__ 63693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 64693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 65693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glxheader.h" 66693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "xmesaP.h" 67bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/context.h" 68bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/extensions.h" 69bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/framebuffer.h" 70bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/imports.h" 71bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/macros.h" 72bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/renderbuffer.h" 73bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/teximage.h" 74374e7fd6cc95d3d91629a6e1c951d77e8a29c31cBrian Paul#include "glapi/glthread.h" 75724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/swrast.h" 76d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h" 77ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell#include "swrast_setup/swrast_setup.h" 7848f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell#include "vbo/vbo.h" 7923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "tnl/tnl.h" 80d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_context.h" 81d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_pipeline.h" 82d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h" 83da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul#include "drivers/common/meta.h" 84d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul 85d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 86693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Global X driver lock 87693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 88693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul_glthread_Mutex _xmesa_lock; 89693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 90693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 91693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 92693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 93693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/***** X Utility Functions *****/ 94693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 95693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 97d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 98693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the host's byte order as LSBFirst or MSBFirst ala X. 99693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int host_byte_order( void ) 101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int i = 1; 103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul char *cptr = (char *) &i; 104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return (*cptr==1) ? LSBFirst : MSBFirst; 105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 108d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Check if the X Shared Memory extension is available. 110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: 0 = not available 111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 1 = shared XImage support available 112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 2 = shared Pixmap support available also 113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int check_for_xshm( XMesaDisplay *display ) 115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1161ccef926be46dce3b6b5c76e812e2fae4e205ce7Adam Jackson#if defined(USE_XSHM) 1170a20051e6da99e91b7bf589ea457c77a8b618f26Brian Paul int ignore; 118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) { 1200a20051e6da99e91b7bf589ea457c77a8b618f26Brian Paul /* Note: we're no longer calling XShmQueryVersion() here. It seems 1210a20051e6da99e91b7bf589ea457c77a8b618f26Brian Paul * to be flakey (triggers a spurious X protocol error when we close 1220a20051e6da99e91b7bf589ea457c77a8b618f26Brian Paul * one display connection and start using a new one. XShm has been 1230a20051e6da99e91b7bf589ea457c77a8b618f26Brian Paul * around a long time and hasn't changed so if MIT_SHM is supported 1240a20051e6da99e91b7bf589ea457c77a8b618f26Brian Paul * we assume we're good to go. 1250a20051e6da99e91b7bf589ea457c77a8b618f26Brian Paul */ 1260a20051e6da99e91b7bf589ea457c77a8b618f26Brian Paul return 2; 127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 132692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul /* No XSHM support */ 133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 138d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Apply gamma correction to an intensity value in [0..max]. Return the 140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * new intensity value. 141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 142d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic GLint 143d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulgamma_adjust( GLfloat gamma, GLint value, GLint max ) 144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (gamma == 1.0) { 146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return value; 147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul double x = (double) value / (double) max; 150fef303bc94f2fb15a068563ac8abfb1765bde035Eric Anholt return IROUND_POS((GLfloat) max * pow(x, 1.0F/gamma)); 151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 156d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the true number of bits per pixel for XImages. 158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * For example, if we request a 24-bit deep visual we may actually need/get 159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 32bpp XImages. This function returns the appropriate bpp. 160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: dpy - the X display 161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visinfo - desribes the visual to be used for XImages 162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: true number of bits per pixel for XImages 163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 164d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic int 165d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulbits_per_pixel( XMesaVisual xmv ) 166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDisplay *dpy = xmv->display; 168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaVisualInfo visinfo = xmv->visinfo; 169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaImage *img; 170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int bitsPerPixel; 171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Create a temporary XImage */ 172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ZPixmap, 0, /*format, offset*/ 174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (char*) MALLOC(8), /*data*/ 175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1, 1, /*width, height*/ 176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32, /*bitmap_pad*/ 177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0 /*bytes_per_line*/ 178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ); 179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(img); 180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* grab the bits/pixel value */ 181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bitsPerPixel = img->bits_per_pixel; 182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* free the XImage */ 18332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free( img->data ); 184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul img->data = NULL; 185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyImage( img ); 186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return bitsPerPixel; 187d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul} 188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Determine if a given X window ID is valid (window exists). 193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this by calling XGetWindowAttributes() for the window and 194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * checking if we catch an X error. 195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: dpy - the display 196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * win - the window to check for existance 197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: GL_TRUE - window exists 198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE - window doesn't exist 199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean WindowExistsFlag; 201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr ) 203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) dpy; 205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (xerr->error_code == BadWindow) { 206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul WindowExistsFlag = GL_FALSE; 207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean window_exists( XMesaDisplay *dpy, Window win ) 212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XWindowAttributes wa; 214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int (*old_handler)( XMesaDisplay*, XErrorEvent* ); 215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul WindowExistsFlag = GL_TRUE; 216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul old_handler = XSetErrorHandler(window_exists_err_handler); 217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSetErrorHandler(old_handler); 219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return WindowExistsFlag; 220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 222fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianstatic Status 22324d965fab52f790188e5de6e67e7387809b1f145Michel Dänzerget_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height ) 224fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{ 225fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian Window root; 226fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian Status stat; 227fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian int xpos, ypos; 228fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian unsigned int w, h, bw, depth; 229fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth); 230fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian *width = w; 231fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian *height = h; 232fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return stat; 233fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian} 234fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 236d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 237d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Return the size of the window (or pixmap) that corresponds to the 238d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * given XMesaBuffer. 239d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param width returns width in pixels 240d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param height returns height in pixels 241d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */ 242d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulvoid 243d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b, 244d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul GLuint *width, GLuint *height) 245d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul{ 246d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul Status stat; 247d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 248d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul _glthread_LOCK_MUTEX(_xmesa_lock); 249d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul XSync(b->xm_visual->display, 0); /* added for Chromium */ 250fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height); 251d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul _glthread_UNLOCK_MUTEX(_xmesa_lock); 252d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 253fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (!stat) { 254d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul /* probably querying a window that's recently been destroyed */ 255d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul _mesa_warning(NULL, "XGetGeometry failed!\n"); 256d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *width = *height = 1; 257d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul } 258d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul} 259d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 260d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 261d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/***** Linked list of XMesaBuffers *****/ 264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 266928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaBuffer XMesaBufferList = NULL; 267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2698d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul/** 270d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Allocate a new XMesaBuffer object which corresponds to the given drawable. 27131aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg * Note that XMesaBuffer is derived from struct gl_framebuffer. 272d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * The new XMesaBuffer will not have any size (Width=Height=0). 273d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * 274d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param d the corresponding X drawable (window or pixmap) 275d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param type either WINDOW, PIXMAP or PBUFFER, describing d 276d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param vis the buffer's visual 277d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param cmap the window's colormap, if known. 278d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \return new XMesaBuffer or NULL if any problem 2798d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul */ 2808d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paulstatic XMesaBuffer 281d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulcreate_xmesa_buffer(XMesaDrawable d, BufferType type, 282d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul XMesaVisual vis, XMesaColormap cmap) 283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 284d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul XMesaBuffer b; 285e5fce1694cdfca615022bf7b987835384902acebBrian Paul 286d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); 2878d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul 288d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 289d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (!b) 290d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul return NULL; 291d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 292d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->display = vis->display; 293d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->xm_visual = vis; 294d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->type = type; 295d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->cmap = cmap; 2968d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul 2972ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez _mesa_initialize_window_framebuffer(&b->mesa_buffer, &vis->mesa_visual); 298928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian b->mesa_buffer.Delete = xmesa_delete_framebuffer; 299e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 300d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul /* 301d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Front renderbuffer 302d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */ 30332c3957991bd0e1df744d866943a8c47b2757c9eBrian Paul b->frontxrb = xmesa_new_renderbuffer(NULL, 0, vis, GL_FALSE); 304d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (!b->frontxrb) { 30532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(b); 306d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul return NULL; 307d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul } 308d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->frontxrb->Parent = b; 309d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->frontxrb->drawable = d; 310d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->frontxrb->pixmap = (XMesaPixmap) d; 311d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT, 312d16e71eeb47d1e67930f6e86a80dc926468224d9Brian Paul &b->frontxrb->Base.Base); 313e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 314d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul /* 315d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Back renderbuffer 316d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */ 317d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (vis->mesa_visual.doubleBufferMode) { 31832c3957991bd0e1df744d866943a8c47b2757c9eBrian Paul b->backxrb = xmesa_new_renderbuffer(NULL, 0, vis, GL_TRUE); 319d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (!b->backxrb) { 320d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul /* XXX free front xrb too */ 32132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(b); 322d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul return NULL; 323e5fce1694cdfca615022bf7b987835384902acebBrian Paul } 324d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->backxrb->Parent = b; 325d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul /* determine back buffer implementation */ 326d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP; 327d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 328d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT, 329d16e71eeb47d1e67930f6e86a80dc926468224d9Brian Paul &b->backxrb->Base.Base); 330d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul } 331e5fce1694cdfca615022bf7b987835384902acebBrian Paul 332d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul /* 333d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Other renderbuffer (depth, stencil, etc) 334d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */ 335d0dc75c000d5af92648c7de901756400672b8447Brian Paul _swrast_add_soft_renderbuffers(&b->mesa_buffer, 336d0dc75c000d5af92648c7de901756400672b8447Brian Paul GL_FALSE, /* color */ 337d0dc75c000d5af92648c7de901756400672b8447Brian Paul vis->mesa_visual.haveDepthBuffer, 338d0dc75c000d5af92648c7de901756400672b8447Brian Paul vis->mesa_visual.haveStencilBuffer, 339d0dc75c000d5af92648c7de901756400672b8447Brian Paul vis->mesa_visual.haveAccumBuffer, 340d0dc75c000d5af92648c7de901756400672b8447Brian Paul GL_FALSE, /* software alpha buffer */ 341d0dc75c000d5af92648c7de901756400672b8447Brian Paul vis->mesa_visual.numAuxBuffers > 0 ); 3428e1c3bd0b4c599bae5b64cd51cec1d74266f30fbBrian 343fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* GLX_EXT_texture_from_pixmap */ 344fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian b->TextureTarget = 0; 345fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT; 346fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian b->TextureMipmap = 0; 347fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 348d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul /* insert buffer into linked list */ 349d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b->Next = XMesaBufferList; 350d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul XMesaBufferList = b; 351d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 356d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Find an XMesaBuffer by matching X display and colormap but NOT matching 358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the notThis buffer. 359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 360928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaBuffer 361928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis) 362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b; 364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (b=XMesaBufferList; b; b=b->Next) { 365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->display==dpy && b->cmap==cmap && b!=notThis) { 366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 373d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 374928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian * Remove buffer from linked list, delete if no longer referenced. 375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 376d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void 377928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianxmesa_free_buffer(XMesaBuffer buffer) 378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer prev = NULL, b; 380928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian 381928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian for (b = XMesaBufferList; b; b = b->Next) { 382928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian if (b == buffer) { 383928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian struct gl_framebuffer *fb = &buffer->mesa_buffer; 384928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian 385928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian /* unlink buffer from list */ 386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (prev) 387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prev->Next = buffer->Next; 388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBufferList = buffer->Next; 3901832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul 391928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian /* mark as delete pending */ 392928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian fb->DeletePending = GL_TRUE; 3933049946fa742b654afa9b24f8bc79f387f01aea9Brian 3943049946fa742b654afa9b24f8bc79f387f01aea9Brian /* Since the X window for the XMesaBuffer is going away, we don't 3953049946fa742b654afa9b24f8bc79f387f01aea9Brian * want to dereference this pointer in the future. 3963049946fa742b654afa9b24f8bc79f387f01aea9Brian */ 3973049946fa742b654afa9b24f8bc79f387f01aea9Brian b->frontxrb->drawable = 0; 3983049946fa742b654afa9b24f8bc79f387f01aea9Brian 399a510bc3ee1a696da120c09ee4ec33dc033f671acBrian /* Unreference. If count = zero we'll really delete the buffer */ 4007eb5a2892d3d89f4b1800311babb40af1ec7d4e5Brian Paul _mesa_reference_framebuffer(&fb, NULL); 4011832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul 402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return; 403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* continue search */ 405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prev = b; 406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* buffer not found in XMesaBufferList */ 408928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n"); 409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/***** Misc Private Functions *****/ 416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 419e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/** 420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a True/DirectColor visual. 421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 422d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void 423d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap) 424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long rmask, gmask, bmask; 426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) buffer; 427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) cmap; 428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Compute red multiplier (mask) and bit shift */ 430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->rshift = 0; 431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul rmask = GET_REDMASK(v); 432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul while ((rmask & 1)==0) { 433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->rshift++; 434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul rmask = rmask >> 1; 435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Compute green multiplier (mask) and bit shift */ 438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->gshift = 0; 439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul gmask = GET_GREENMASK(v); 440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul while ((gmask & 1)==0) { 441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->gshift++; 442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul gmask = gmask >> 1; 443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Compute blue multiplier (mask) and bit shift */ 446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->bshift = 0; 447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bmask = GET_BLUEMASK(v); 448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul while ((bmask & 1)==0) { 449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->bshift++; 450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bmask = bmask >> 1; 451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Compute component-to-pixel lookup tables and dithering kernel 455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul static GLubyte kernel[16] = { 458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0*16, 8*16, 2*16, 10*16, 459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 12*16, 4*16, 14*16, 6*16, 460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 3*16, 11*16, 1*16, 9*16, 461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 15*16, 7*16, 13*16, 5*16, 462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul }; 463692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul GLint rBits = _mesa_bitcount(rmask); 464692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul GLint gBits = _mesa_bitcount(gmask); 465692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul GLint bBits = _mesa_bitcount(bmask); 4663cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul GLint maxBits; 467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLuint i; 468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* convert pixel components in [0,_mask] to RGB values in [0,255] */ 470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<=rmask; i++) 471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->PixelToR[i] = (unsigned char) ((i * 255) / rmask); 472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<=gmask; i++) 473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->PixelToG[i] = (unsigned char) ((i * 255) / gmask); 474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<=bmask; i++) 475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->PixelToB[i] = (unsigned char) ((i * 255) / bmask); 476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* convert RGB values from [0,255] to pixel components */ 478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0;i<256;i++) { 480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint r = gamma_adjust(v->RedGamma, i, 255); 481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint g = gamma_adjust(v->GreenGamma, i, 255); 482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint b = gamma_adjust(v->BlueGamma, i, 255); 483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift; 484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift; 485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift; 486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* overflow protection */ 488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=256;i<512;i++) { 489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->RtoPixel[i] = v->RtoPixel[255]; 490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->GtoPixel[i] = v->GtoPixel[255]; 491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->BtoPixel[i] = v->BtoPixel[255]; 492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* setup dithering kernel */ 4953cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul maxBits = rBits; 4963cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul if (gBits > maxBits) maxBits = gBits; 4973cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul if (bBits > maxBits) maxBits = bBits; 498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0;i<16;i++) { 4993cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul v->Kernel[i] = kernel[i] >> maxBits; 500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 502449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->undithered_pf = PF_Truecolor; 503449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor; 504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Now check for TrueColor visuals which we can optimize. 508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if ( GET_REDMASK(v) ==0x0000ff 510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_GREENMASK(v)==0x00ff00 511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_BLUEMASK(v) ==0xff0000 512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && CHECK_BYTE_ORDER(v) 513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->BitsPerPixel==32 514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* common 32 bpp config used on SGI, Sun */ 5163fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */ 517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 5183fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian else if (GET_REDMASK(v) == 0xff0000 5193fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian && GET_GREENMASK(v)== 0x00ff00 5203fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian && GET_BLUEMASK(v) == 0x0000ff 5213fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian && CHECK_BYTE_ORDER(v) 5223fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){ 5233fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian if (v->BitsPerPixel==32) { 5243fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian /* if 32 bpp, and visual indicates 8 bpp alpha channel */ 5253fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8) 5263fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */ 5273fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian else 5283fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */ 5293fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian } 5303fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian else if (v->BitsPerPixel == 24) { 5313fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */ 5323fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian } 533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (GET_REDMASK(v) ==0xf800 535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_GREENMASK(v)==0x07e0 536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_BLUEMASK(v) ==0x001f 537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && CHECK_BYTE_ORDER(v) 538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->BitsPerPixel==16 539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 5403fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian /* 5-6-5 RGB */ 541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->undithered_pf = PF_5R6G5B; 542449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->dithered_pf = PF_Dither_5R6G5B; 543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 54763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul/** 54863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * When a context is bound for the first time, we can finally finish 54963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * initializing the context's visual and buffer information. 55063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param v the XMesaVisual to initialize 55163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param b the XMesaBuffer to initialize (may be NULL) 55263f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param rgb_flag TRUE = RGBA mode, FALSE = color index mode 55363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param window the window/pixmap we're rendering into 55463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param cmap the colormap associated with the window/pixmap 55563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \return GL_TRUE=success, GL_FALSE=failure 556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 55763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paulstatic GLboolean 558e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzisinitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b, 55981fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick XMesaDrawable window, 56063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul XMesaColormap cmap) 561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 562c3ed27ec76c5456412122d7e654a2e298409cc88Brian Paul const int xclass = v->visualType; 563e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis 564e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis 56563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul ASSERT(!b || b->xm_visual == v); 566e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Save true bits/pixel */ 568a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul v->BitsPerPixel = bits_per_pixel(v); 569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(v->BitsPerPixel > 0); 570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 57181fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick /* RGB WINDOW: 57281fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick * We support RGB rendering into almost any kind of visual. 57381fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick */ 57481fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 57581fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick setup_truecolor( v, b, cmap ); 576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 57781fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick else { 57881fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n"); 57981fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick return GL_FALSE; 58081fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick } 58181fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick v->mesa_visual.indexBits = 0; 582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 58381fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick if (_mesa_getenv("MESA_NO_DITHER")) { 58481fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick v->dithered_pf = v->undithered_pf; 585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If MESA_INFO env var is set print out some debugging info 590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * which can help Brian figure out what's going on when a user 591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * reports bugs. 592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 593367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (_mesa_getenv("MESA_INFO")) { 594298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("X/Mesa visual = %p\n", (void *) v); 595298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("X/Mesa dithered pf = %u\n", v->dithered_pf); 596298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("X/Mesa undithered pf = %u\n", v->undithered_pf); 597298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("X/Mesa level = %d\n", v->mesa_visual.level); 598298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v)); 599298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b && window) { 603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Do window-specific initializations */ 604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 605d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul /* these should have been set in create_xmesa_buffer */ 606d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul ASSERT(b->frontxrb->drawable == window); 607d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window); 608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Setup for single/double buffering */ 6101832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.doubleBufferMode) { 611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Double buffered */ 612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shm = check_for_xshm( v->display ); 613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* X11 graphics contexts */ 616c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul b->gc = XCreateGC( v->display, window, 0, NULL ); 617c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul XMesaSetFunction( v->display, b->gc, GXcopy ); 618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 6199ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul /* cleargc - for glClear() */ 6209ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->cleargc = XCreateGC( v->display, window, 0, NULL ); 6219ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul XMesaSetFunction( v->display, b->cleargc, GXcopy ); 6229ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul 623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Don't generate Graphics Expose/NoExpose events in swapbuffers(). 625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Patch contributed by Michael Pichler May 15, 1995. 626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 62763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul { 62863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul XGCValues gcvalues; 62963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul gcvalues.graphics_exposures = False; 63063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul b->swapgc = XCreateGC(v->display, window, 63163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul GCGraphicsExposures, &gcvalues); 63263f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul } 6339ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul XMesaSetFunction( v->display, b->swapgc, GXcopy ); 634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Convert an RGBA color to a pixel value. 643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long 645f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergxmesa_color_to_pixel(struct gl_context *ctx, 646e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLubyte r, GLubyte g, GLubyte b, GLubyte a, 647e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint pixelFormat) 648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 649e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul XMesaContext xmesa = XMESA_CONTEXT(ctx); 650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul switch (pixelFormat) { 651449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Truecolor: 652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long p; 654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PACK_TRUECOLOR( p, r, g, b ); 655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return p; 656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8A8B8G8R: 658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_8A8B8G8R( r, g, b, a ); 65941bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul case PF_8A8R8G8B: 66041bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul return PACK_8A8R8G8B( r, g, b, a ); 661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8R8G8B: 662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* fall through */ 663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8R8G8B24: 664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_8R8G8B( r, g, b ); 665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_5R6G5B: 666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_5R6G5B( r, g, b ); 667449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither_True: 668693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* fall through */ 669449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither_5R6G5B: 670693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 671693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long p; 672693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PACK_TRUEDITHER(p, 1, 0, r, g, b); 673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return p; 674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul default: 676e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel"); 677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 682304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#define NUM_VISUAL_TYPES 6 683304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick 684304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick/** 685304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * Convert an X visual type to a GLX visual type. 686304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * 687304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.) 688304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * to be converted. 689304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \return If \c visualType is a valid X visual type, a GLX visual type will 690304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * be returned. Otherwise \c GLX_NONE will be returned. 691304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * 692304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \note 693304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the 694304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * DRI CVS tree. 695304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick */ 696304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanickstatic GLint 697304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanickxmesa_convert_from_x_visual_type( int visualType ) 698304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick{ 699304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick static const int glx_visual_types[ NUM_VISUAL_TYPES ] = { 700304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick GLX_STATIC_GRAY, GLX_GRAY_SCALE, 701304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 702304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick GLX_TRUE_COLOR, GLX_DIRECT_COLOR 703304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick }; 704304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick 705304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick return ( (unsigned) visualType < NUM_VISUAL_TYPES ) 706304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick ? glx_visual_types[ visualType ] : GLX_NONE; 707304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick} 708304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick 709304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick 710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/***** Public Functions *****/ 712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new X/Mesa visual. 717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: display - X11 display 718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visinfo - an XVisualInfo pointer 719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * rgb_flag - GL_TRUE = RGB mode, 720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE = color index mode 721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * alpha_flag - alpha buffer requested? 722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * db_flag - GL_TRUE = double-buffered, 723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE = single buffered 724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * stereo_flag - stereo visual? 725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * ximage_flag - GL_TRUE = use an XImage for back buffer, 726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE = use an off-screen pixmap for back buffer 727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * depth_size - requested bits/depth values, or zero 728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * stencil_size - requested bits/stencil values, or zero 729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * accum_red_size - requested bits/red accum values, or zero 730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * accum_green_size - requested bits/green accum values, or zero 731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * accum_blue_size - requested bits/blue accum values, or zero 732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * accum_alpha_size - requested bits/alpha accum values, or zero 733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * num_samples - number of samples/pixel if multisampling, or zero 734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * level - visual level, usually 0 735304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * visualCaveat - ala the GLX extension, usually GLX_NONE 736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return; a new XMesaVisual or 0 if error. 737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 73850aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC 739693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaVisual XMesaCreateVisual( XMesaDisplay *display, 740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaVisualInfo visinfo, 741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean rgb_flag, 742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean alpha_flag, 743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean db_flag, 744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean stereo_flag, 745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean ximage_flag, 746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint depth_size, 747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint stencil_size, 748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint accum_red_size, 749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint accum_green_size, 750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint accum_blue_size, 751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint accum_alpha_size, 752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint num_samples, 753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint level, 754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint visualCaveat ) 755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul char *gamma; 757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaVisual v; 758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint red_bits, green_bits, blue_bits, alpha_bits; 759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* For debugging only */ 761367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (_mesa_getenv("MESA_XSYNC")) { 762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* This makes debugging X easier. 763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In your debugger, set a breakpoint on _XError to stop when an 764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * X protocol error is generated. 765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSynchronize( display, 1 ); 767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 76981fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick /* Color-index rendering not supported. */ 77081fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick if (!rgb_flag) 77181fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick return NULL; 77281fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick 773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!v) { 775693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->display = display; 779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 78032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg /* Save a copy of the XVisualInfo struct because the user may Xfree() 781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the struct but we may need some of the information contained in it 782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * at a later time. 783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if(!v->visinfo) { 78632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(v); 787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 789e197de56cdb86835f1437688a9161cd909792d80Brian Paul memcpy(v->visinfo, visinfo, sizeof(*visinfo)); 790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* check for MESA_GAMMA environment variable */ 792367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul gamma = _mesa_getenv("MESA_GAMMA"); 793693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (gamma) { 794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0; 795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma ); 796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->RedGamma<=0.0) v->RedGamma = 1.0; 797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->GreenGamma<=0.0) v->GreenGamma = v->RedGamma; 798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->BlueGamma<=0.0) v->BlueGamma = v->RedGamma; 799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0; 802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->ximage_flag = ximage_flag; 805304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick 806304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick v->mesa_visual.redMask = visinfo->red_mask; 807304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick v->mesa_visual.greenMask = visinfo->green_mask; 808304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick v->mesa_visual.blueMask = visinfo->blue_mask; 809705e142dda047f24b563fc2bea0f922173e91d1bKristian Høgsberg v->visualID = visinfo->visualid; 810705e142dda047f24b563fc2bea0f922173e91d1bKristian Høgsberg v->screen = visinfo->screen; 811304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick 8121ccef926be46dce3b6b5c76e812e2fae4e205ce7Adam Jackson#if !(defined(__cplusplus) || defined(c_plusplus)) 813c3ed27ec76c5456412122d7e654a2e298409cc88Brian Paul v->visualType = xmesa_convert_from_x_visual_type(visinfo->class); 814304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#else 815c3ed27ec76c5456412122d7e654a2e298409cc88Brian Paul v->visualType = xmesa_convert_from_x_visual_type(visinfo->c_class); 816304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#endif 817304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick 818304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick v->mesa_visual.visualRating = visualCaveat; 819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 8203fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian if (alpha_flag) 8213fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian v->mesa_visual.alphaBits = 8; 8223fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian 82381fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick (void) initialize_visual_and_buffer( v, NULL, 0, 0 ); 824693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 826c3ed27ec76c5456412122d7e654a2e298409cc88Brian Paul const int xclass = v->visualType; 82763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 828692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul red_bits = _mesa_bitcount(GET_REDMASK(v)); 829692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul green_bits = _mesa_bitcount(GET_GREENMASK(v)); 830692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul blue_bits = _mesa_bitcount(GET_BLUEMASK(v)); 831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 832693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* this is an approximation */ 834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int depth; 835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul depth = GET_VISUAL_DEPTH(v); 836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul red_bits = depth / 3; 837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul depth -= red_bits; 838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul green_bits = depth / 2; 839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul depth -= green_bits; 840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul blue_bits = depth; 841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul alpha_bits = 0; 842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) ); 843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 8443fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian alpha_bits = v->mesa_visual.alphaBits; 845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 847439842e434c87ea1775e828820d11e8194982bccBrian Paul if (!_mesa_initialize_visual(&v->mesa_visual, 848439842e434c87ea1775e828820d11e8194982bccBrian Paul db_flag, stereo_flag, 849439842e434c87ea1775e828820d11e8194982bccBrian Paul red_bits, green_bits, 850439842e434c87ea1775e828820d11e8194982bccBrian Paul blue_bits, alpha_bits, 851439842e434c87ea1775e828820d11e8194982bccBrian Paul depth_size, 852439842e434c87ea1775e828820d11e8194982bccBrian Paul stencil_size, 853439842e434c87ea1775e828820d11e8194982bccBrian Paul accum_red_size, accum_green_size, 854439842e434c87ea1775e828820d11e8194982bccBrian Paul accum_blue_size, accum_alpha_size, 855439842e434c87ea1775e828820d11e8194982bccBrian Paul 0)) { 856439842e434c87ea1775e828820d11e8194982bccBrian Paul FREE(v); 857439842e434c87ea1775e828820d11e8194982bccBrian Paul return NULL; 858439842e434c87ea1775e828820d11e8194982bccBrian Paul } 859304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick 860894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul /* XXX minor hack */ 861304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick v->mesa_visual.level = level; 862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return v; 863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 86650aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC 867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyVisual( XMesaVisual v ) 868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 86932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(v->visinfo); 87032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(v); 871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 875d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/** 876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaContext. 877d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param v the XMesaVisual 878d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param share_list another XMesaContext with which to share display 879d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * lists or NULL if no sharing is wanted. 880d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \return an XMesaContext or NULL if error. 881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 88250aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC 8837a1f3a37a10b162b067239dafa19fc6865a41f14Keith WhitwellXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) 884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 8859a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul static GLboolean firstTime = GL_TRUE; 886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaContext c; 887f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *mesaCtx; 888d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul struct dd_function_table functions; 889d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul TNLcontext *tnl; 890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (firstTime) { 892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul _glthread_INIT_MUTEX(_xmesa_lock); 893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul firstTime = GL_FALSE; 894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 896f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg /* Note: the XMesaContext contains a Mesa struct gl_context struct (inheritance) */ 897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 898d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul if (!c) 899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 9011e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul mesaCtx = &(c->mesa); 9021e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul 903d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* initialize with default driver functions, then plug in XMesa funcs */ 904d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul _mesa_init_driver_functions(&functions); 905d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul xmesa_init_driver_functions(v, &functions); 9065e4ca1ccc9029fd75bb7676dc128e33d12da9665Brian Paul if (!_mesa_initialize_context(mesaCtx, API_OPENGL, &v->mesa_visual, 907f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg share_list ? &(share_list->mesa) : (struct gl_context *) NULL, 908d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul &functions, (void *) c)) { 90932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(c); 910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 913c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul /* Enable this to exercise fixed function -> shader translation 914c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul * with software rendering. 915c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul */ 916c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul if (0) { 917c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE; 918c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; 919c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul } 920c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul 9211e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _mesa_enable_sw_extensions(mesaCtx); 9221e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _mesa_enable_1_3_extensions(mesaCtx); 9231e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _mesa_enable_1_4_extensions(mesaCtx); 92484351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul _mesa_enable_1_5_extensions(mesaCtx); 92553f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul _mesa_enable_2_0_extensions(mesaCtx); 9265c4ca968fab1b0b993fabeb73e3a5d92cbaadaf1Brian _mesa_enable_2_1_extensions(mesaCtx); 927750f52169ccbd1aca217e7749f1ce6ae5828c2acGeorge Sapountzis if (mesaCtx->Mesa_DXTn) { 928692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc"); 929692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul _mesa_enable_extension(mesaCtx, "GL_S3_s3tc"); 9303c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca } 931692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1"); 9324fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#if ENABLE_EXT_timer_query 933692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query"); 9344fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#endif 935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 936507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis 937d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* finish up xmesa context initializations */ 938d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE; 939693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->xm_visual = v; 940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->display = v->display; 942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->pixelformat = v->dithered_pf; /* Dithering is enabled by default */ 943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 944ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell /* Initialize the software rasterizer and helper modules. 945ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell */ 946c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul if (!_swrast_CreateContext( mesaCtx ) || 9470a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell !_vbo_CreateContext( mesaCtx ) || 948c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul !_tnl_CreateContext( mesaCtx ) || 949c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul !_swsetup_CreateContext( mesaCtx )) { 950c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul _mesa_free_context_data(&c->mesa); 95132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(c); 952c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul return NULL; 953c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul } 954ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell 955d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* tnl setup */ 956d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul tnl = TNL_CONTEXT(mesaCtx); 957d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul tnl->Driver.RunPipeline = _tnl_run_pipeline; 958d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* swrast setup */ 9591e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul xmesa_register_swrast_functions( mesaCtx ); 960d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul _swsetup_Wakeup(mesaCtx); 961709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 9622c1937480a68b066a1a0b8ee3770e675bfad859bBrian Paul _mesa_meta_init(mesaCtx); 963da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul 9647a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell return c; 965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96950aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC 970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyContext( XMesaContext c ) 971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 972f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *mesaCtx = &c->mesa; 973d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis 9742c1937480a68b066a1a0b8ee3770e675bfad859bBrian Paul _mesa_meta_free( mesaCtx ); 975da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul 9761e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _swsetup_DestroyContext( mesaCtx ); 9771e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _swrast_DestroyContext( mesaCtx ); 9781e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _tnl_DestroyContext( mesaCtx ); 9790a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell _vbo_DestroyContext( mesaCtx ); 9800983163fde91f1026146903155fd414725a79879Brian Paul _mesa_free_context_data( mesaCtx ); 98132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free( c ); 982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 986d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 987d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Private function for creating an XMesaBuffer which corresponds to an 988d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * X window or pixmap. 989d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param v the window's XMesaVisual 990d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param w the window we're wrapping 991d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \return new XMesaBuffer or NULL if error 992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 9936aa5668871e7f366b33e85fabc72885fc269a7d4George SapountzisPUBLIC XMesaBuffer 9946aa5668871e7f366b33e85fabc72885fc269a7d4George SapountzisXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) 995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XWindowAttributes attr; 9978d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul XMesaBuffer b; 9988d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul XMesaColormap cmap; 999e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis int depth; 1000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 10018d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul assert(v); 1002d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul assert(w); 1003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 10048d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul /* Check that window depth matches visual depth */ 10057a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell XGetWindowAttributes( v->display, w, &attr ); 1006e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis depth = attr.depth; 1007e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis if (GET_VISUAL_DEPTH(v) != depth) { 1008a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 1009e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis GET_VISUAL_DEPTH(v), depth); 1010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 10138d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul /* Find colormap */ 1014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (attr.colormap) { 10158d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul cmap = attr.colormap; 1016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 10182ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 1019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* this is weird, a window w/out a colormap!? */ 1020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* OK, let's just allocate a new one and hope for the best */ 10218d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 1022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1024d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap); 1025d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (!b) 10268d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul return NULL; 1027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 102881fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick if (!initialize_visual_and_buffer( v, b, (XMesaDrawable) w, cmap )) { 1029928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian xmesa_free_buffer(b); 1030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 10336aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis return b; 10346aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis} 10356aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis 1036d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis 1037d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis 1038304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick/** 1039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X pixmap. 1040304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * 1041304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param v the XMesaVisual 1042304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param p the pixmap 1043304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or 1044304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \c GLX_DIRECT_COLOR visual for the pixmap 1045304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \returns new XMesaBuffer or NULL if error 1046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 104750aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC XMesaBuffer 10488d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) 1049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 10508d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul XMesaBuffer b; 10518d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul 10528d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul assert(v); 10538d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul 1054d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 1055d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (!b) 1056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 105881fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) { 1059928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian xmesa_free_buffer(b); 1060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 1064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1067fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian/** 1068fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * For GLX_EXT_texture_from_pixmap 1069fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian */ 1070fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianXMesaBuffer 1071fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianXMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p, 1072fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian XMesaColormap cmap, 1073fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian int format, int target, int mipmap) 1074fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{ 1075fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian GET_CURRENT_CONTEXT(ctx); 1076fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian XMesaBuffer b; 1077fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian GLuint width, height; 1078fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1079fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian assert(v); 1080fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1081fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 1082fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (!b) 1083fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return NULL; 1084fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1085fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* get pixmap size, update framebuffer/renderbuffer dims */ 108624d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer xmesa_get_window_size(v->display, b, &width, &height); 1087fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height); 1088fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1089fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (target == 0) { 1090fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* examine dims */ 1091fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (ctx->Extensions.ARB_texture_non_power_of_two) { 1092fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian target = GLX_TEXTURE_2D_EXT; 1093fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1094fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else if ( _mesa_bitcount(width) == 1 1095fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian && _mesa_bitcount(height) == 1) { 1096fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* power of two size */ 1097fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (height == 1) { 1098fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian target = GLX_TEXTURE_1D_EXT; 1099fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1100fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else { 1101fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian target = GLX_TEXTURE_2D_EXT; 1102fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1103fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1104fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else if (ctx->Extensions.NV_texture_rectangle) { 1105fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian target = GLX_TEXTURE_RECTANGLE_EXT; 1106fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1107fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else { 1108fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* non power of two textures not supported */ 1109fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian XMesaDestroyBuffer(b); 1110fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return 0; 1111fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1112fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1113fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1114fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian b->TextureTarget = target; 1115fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian b->TextureFormat = format; 1116fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian b->TextureMipmap = mipmap; 1117fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 111881fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) { 1119fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian xmesa_free_buffer(b); 1120fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return NULL; 1121fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1122fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1123fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return b; 1124fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian} 1125fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1126fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 11288d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer 11298d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, 11308d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul unsigned int width, unsigned int height) 1131190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul{ 1132e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaWindow root; 1133e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaDrawable drawable; /* X Pixmap Drawable */ 11348d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul XMesaBuffer b; 11358d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul 1136e4656003caee346d9c4eb23256d73409271291a7Brian Paul /* allocate pixmap for front buffer */ 1137e4656003caee346d9c4eb23256d73409271291a7Brian Paul root = RootWindow( v->display, v->visinfo->screen ); 1138d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul drawable = XCreatePixmap(v->display, root, width, height, 1139d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul v->visinfo->depth); 1140d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (!drawable) 1141d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul return NULL; 1142d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 1143d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); 1144d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (!b) 1145d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul return NULL; 1146e4656003caee346d9c4eb23256d73409271291a7Brian Paul 114781fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick if (!initialize_visual_and_buffer(v, b, drawable, cmap)) { 1148928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian xmesa_free_buffer(b); 1149190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul return NULL; 1150190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul } 1151190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1152190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul return b; 1153190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul} 1154190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1155190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1156190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate an XMesaBuffer structure and all related info. 1159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 116050aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC void 1161928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaDestroyBuffer(XMesaBuffer b) 1162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1163928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian xmesa_free_buffer(b); 1164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1167d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/** 116831aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg * Query the current window size and update the corresponding struct gl_framebuffer 1169d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * and all attached renderbuffers. 1170d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Called when: 1171d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * 1. the first time a buffer is bound to a context. 1172d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * 2. from glViewport to poll for window size changes 1173d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * 3. from the XMesaResizeBuffers() API function. 1174e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian * Note: it's possible (and legal) for xmctx to be NULL. That can happen 1175e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian * when resizing a buffer when no rendering context is bound. 1176d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */ 1177d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulvoid 1178d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer) 1179d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul{ 1180d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul GLuint width, height; 1181e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height); 1182d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul if (drawBuffer->mesa_buffer.Width != width || 1183d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul drawBuffer->mesa_buffer.Height != height) { 1184f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = xmctx ? &xmctx->mesa : NULL; 1185e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height); 1186d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul } 118742b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */ 1188d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul} 1189d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 1190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context. 1193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1194693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b ) 1195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return XMesaMakeCurrent2( c, b, b ); 1197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context. 1202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 120350aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC 1204693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 1205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer readBuffer ) 1206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (c) { 1208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!drawBuffer || !readBuffer) 1209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; /* must specify buffers! */ 1210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 12111e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul if (&(c->mesa) == _mesa_get_current_context() 1212e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer 1213e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul && c->mesa.ReadBuffer == &readBuffer->mesa_buffer 1214d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) { 1215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* same context and buffer, do nothing */ 1216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 1217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 12193b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul c->xm_buffer = drawBuffer; 1220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1221c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul /* Call this periodically to detect when the user has begun using 1222c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul * GL rendering from multiple threads. 1223c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul */ 1224c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul _glapi_check_multithread(); 1225c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul 122642b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul xmesa_check_and_update_buffer_size(c, drawBuffer); 122742b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul if (readBuffer != drawBuffer) 1228d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul xmesa_check_and_update_buffer_size(c, readBuffer); 1229d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul 1230e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_make_current(&(c->mesa), 1231e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &drawBuffer->mesa_buffer, 1232e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &readBuffer->mesa_buffer); 1233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 123481fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick /* 123581fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick * Must recompute and set these pixel values because colormap 123681fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick * can be different for different windows. 123781fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick */ 123881fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick c->clearpixel = xmesa_color_to_pixel( &c->mesa, 123981fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick c->clearcolor[0], 124081fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick c->clearcolor[1], 124181fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick c->clearcolor[2], 124281fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick c->clearcolor[3], 124381fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick c->xm_visual->undithered_pf); 124481fe9949ef0293f7a6e076bd6e56f6a5340a1dc3Ian Romanick XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel); 1245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 1247e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul drawBuffer->wasCurrent = GL_TRUE; 1248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Detach */ 1251e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_make_current( NULL, NULL, NULL ); 1252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 1254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Unbind the context c from its buffer. 1259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1260693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaUnbindContext( XMesaContext c ) 1261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* A no-op for XFree86 integration purposes */ 1263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 1264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1267693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaGetCurrentContext( void ) 1268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 1270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ctx) { 12711e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul XMesaContext xmesa = XMESA_CONTEXT(ctx); 1272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return xmesa; 1273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 1276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1280693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentBuffer( void ) 1281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 1283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ctx) { 1284e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer); 1285e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul return xmbuf; 1286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 1289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* New in Mesa 3.1 */ 1294693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentReadBuffer( void ) 1295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 1297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ctx) { 1298d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul return XMESA_BUFFER(ctx->ReadBuffer); 1299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 1302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 13067439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis 13076aa5668871e7f366b33e85fabc72885fc269a7d4George SapountzisGLboolean XMesaSetFXmode( GLint mode ) 13086aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis{ 1309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) mode; 1310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 1311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy the back buffer to the front buffer. If there's no back buffer 1317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this is a no-op. 1318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 131950aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC 1320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSwapBuffers( XMesaBuffer b ) 1321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 1323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1324692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul if (!b->backxrb) { 1325692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul /* single buffered */ 1326692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul return; 1327692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul } 1328692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul 1329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* If we're swapping the buffer associated with the current context 1330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * we have to flush any pending rendering commands first. 1331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 133218a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 133360b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul _mesa_notifySwapBuffers(ctx); 1334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1335692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul if (b->db_mode) { 13364d944b502f8a1ae372d9248e888612bffb5eb6a5George Sapountzis if (b->backxrb->ximage) { 1337e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian /* Copy Ximage (back buf) from client memory to server window */ 13381ccef926be46dce3b6b5c76e812e2fae4e205ce7Adam Jackson#if defined(USE_XSHM) 1339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->shm) { 1340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1341ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 13429ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 1343e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul b->backxrb->ximage, 0, 0, 134429926a11b16ec7a235947d95e9a46777605dd30eBrian Paul 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 134529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul False ); 1346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 1347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 1349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1352ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 13539ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 1354e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul b->backxrb->ximage, 0, 0, 135529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height ); 1356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 1357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1359e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian else if (b->backxrb->pixmap) { 1360e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian /* Copy pixmap (back buf) to window (front buf) on server */ 1361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaCopyArea( b->xm_visual->display, 1363e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul b->backxrb->pixmap, /* source drawable */ 1364ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul b->frontxrb->drawable, /* dest. drawable */ 13659ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 136629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 1367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0, 0 /* dest region */ 1368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ); 1369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 1370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSync( b->xm_visual->display, False ); 1373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy sub-region of back buffer to front buffer 1379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 1381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 1383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* If we're swapping the buffer associated with the current context 1385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * we have to flush any pending rendering commands first. 1386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 13871d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 138860b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul _mesa_notifySwapBuffers(ctx); 1389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1390692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul if (!b->backxrb) { 1391692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul /* single buffered */ 1392692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul return; 1393692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul } 1394692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul 1395692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul if (b->db_mode) { 139629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul int yTop = b->mesa_buffer.Height - y - height; 1397e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (b->backxrb->ximage) { 1398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Copy Ximage from host's memory to server's window */ 13991ccef926be46dce3b6b5c76e812e2fae4e205ce7Adam Jackson#if defined(USE_XSHM) 1400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->shm) { 1401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* XXX assuming width and height aren't too large! */ 1402ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 14039ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 1404e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul b->backxrb->ximage, x, yTop, 1405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x, yTop, width, height, False ); 1406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* wait for finished event??? */ 1407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 1409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* XXX assuming width and height aren't too large! */ 1412ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 14139ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 1414e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul b->backxrb->ximage, x, yTop, 1415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x, yTop, width, height ); 1416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Copy pixmap to window on server */ 1420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaCopyArea( b->xm_visual->display, 1421e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul b->backxrb->pixmap, /* source drawable */ 1422ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul b->frontxrb->drawable, /* dest. drawable */ 14239ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 1424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x, yTop, width, height, /* source region */ 1425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x, yTop /* dest region */ 1426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ); 1427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return a pointer to the XMesa backbuffer Pixmap or XImage. This function 1434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * is a way to get "under the hood" of X/Mesa so one can manipulate the 1435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * back buffer directly. 1436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output: pixmap - pointer to back buffer's Pixmap, or 0 1437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * ximage - pointer to back buffer's XImage, or NULL 1438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: GL_TRUE = context is double buffered 1439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE = context is single buffered 1440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1441693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetBackBuffer( XMesaBuffer b, 1442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPixmap *pixmap, 1443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaImage **ximage ) 1444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1445692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul if (b->db_mode) { 1446692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul if (pixmap) 1447692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul *pixmap = b->backxrb->pixmap; 1448692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul if (ximage) 1449692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul *ximage = b->backxrb->ximage; 1450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 1451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *pixmap = 0; 1454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *ximage = NULL; 1455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 1456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the depth buffer associated with an XMesaBuffer. 1462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: b - the XMesa buffer handle 1463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output: width, height - size of buffer in pixels 1464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * bytesPerValue - bytes per depth value (2 or 4) 1465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * buffer - pointer to depth buffer values 1466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: GL_TRUE or GL_FALSE to indicate success or failure. 1467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1468693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height, 1469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint *bytesPerValue, void **buffer ) 1470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1471e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul struct gl_renderbuffer *rb 1472e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer; 1473d16e71eeb47d1e67930f6e86a80dc926468224d9Brian Paul struct xmesa_renderbuffer *xrb = xmesa_renderbuffer(rb); 1474d16e71eeb47d1e67930f6e86a80dc926468224d9Brian Paul 1475d16e71eeb47d1e67930f6e86a80dc926468224d9Brian Paul if (!xrb || !xrb->Base.Buffer) { 1476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *width = 0; 1477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *height = 0; 1478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *bytesPerValue = 0; 1479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *buffer = 0; 1480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 1481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 14831832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul *width = b->mesa_buffer.Width; 14841832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul *height = b->mesa_buffer.Height; 1485f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16 1486f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul ? sizeof(GLushort) : sizeof(GLuint); 1487d16e71eeb47d1e67930f6e86a80dc926468224d9Brian Paul *buffer = (void *) xrb->Base.Buffer; 1488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 1489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaFlush( XMesaContext c ) 1494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (c && c->xm_visual) { 1496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSync( c->xm_visual->display, False ); 1497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulconst char *XMesaGetString( XMesaContext c, int name ) 1503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) c; 1505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (name==XMESA_VERSION) { 15063160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul return "5.0"; 1507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (name==XMESA_EXTENSIONS) { 1509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return ""; 1510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1518693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d ) 1519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b; 1521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (b=XMesaBufferList; b; b=b->Next) { 1522ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul if (b->frontxrb->drawable == d && b->display == dpy) { 1523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 1524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 15306c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul/** 15316c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul * Free/destroy all XMesaBuffers associated with given display. 15326c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul */ 15336c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paulvoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy) 15346c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul{ 15356c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul XMesaBuffer b, next; 15366c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul for (b = XMesaBufferList; b; b = next) { 15376c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul next = b->Next; 15386c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul if (b->display == dpy) { 1539928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian xmesa_free_buffer(b); 15406c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul } 15416c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul } 15426c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul} 15436c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul 1544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Look for XMesaBuffers whose X window has been destroyed. 1547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate any such XMesaBuffers. 1548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 154990e227f0791cb585dc4e4e1f71e32c67f5e20436Andy Skinnervoid XMesaGarbageCollect( XMesaDisplay* dpy ) 1550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b, next; 1552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (b=XMesaBufferList; b; b=next) { 1553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul next = b->Next; 155490e227f0791cb585dc4e4e1f71e32c67f5e20436Andy Skinner if (b->display && b->display == dpy && b->frontxrb->drawable && b->type == WINDOW) { 1555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSync(b->display, False); 1556ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul if (!window_exists( b->display, b->frontxrb->drawable )) { 1557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* found a dead window, free the ancillary info */ 1558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyBuffer( b ); 1559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y, 1566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLfloat red, GLfloat green, 1567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLfloat blue, GLfloat alpha ) 1568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint r = (GLint) (red * 255.0F); 1570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint g = (GLint) (green * 255.0F); 1571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint b = (GLint) (blue * 255.0F); 1572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint a = (GLint) (alpha * 255.0F); 1573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul switch (xmesa->pixelformat) { 1575449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Truecolor: 1576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long p; 1578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PACK_TRUECOLOR( p, r, g, b ); 1579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return p; 1580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8A8B8G8R: 1582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_8A8B8G8R( r, g, b, a ); 158341bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul case PF_8A8R8G8B: 158441bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul return PACK_8A8R8G8B( r, g, b, a ); 1585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8R8G8B: 1586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_8R8G8B( r, g, b ); 1587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_5R6G5B: 1588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_5R6G5B( r, g, b ); 1589449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither_5R6G5B: 1590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* fall through */ 1591449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither_True: 1592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long p; 1594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PACK_TRUEDITHER(p, x, y, r, g, b); 1595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return p; 1596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul default: 159808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor"); 1599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 1601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 160418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul/* 160518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * This is typically called when the window size changes and we need 160618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * to reallocate the buffer's back/depth/stencil/accum buffers. 160718a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul */ 160850aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC void 1609d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian PaulXMesaResizeBuffers( XMesaBuffer b ) 161018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul{ 1611e0e993c5ff090058037875642dcd34727a3d8760Adam Jackson GET_CURRENT_CONTEXT(ctx); 1612d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul XMesaContext xmctx = XMESA_CONTEXT(ctx); 1613f04979ae481acc9fdc423da06514c4d557edd7cdMathias Hopf if (!xmctx) 1614f04979ae481acc9fdc423da06514c4d557edd7cdMathias Hopf return; 1615d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul xmesa_check_and_update_buffer_size(xmctx, b); 161618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul} 161718a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul 1618fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1619fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianstatic GLint 1620fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianxbuffer_to_renderbuffer(int buffer) 1621fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{ 1622fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian assert(MAX_AUX_BUFFERS <= 4); 1623fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1624fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian switch (buffer) { 1625fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_FRONT_LEFT_EXT: 1626fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return BUFFER_FRONT_LEFT; 1627fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_FRONT_RIGHT_EXT: 1628fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return BUFFER_FRONT_RIGHT; 1629fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_BACK_LEFT_EXT: 1630fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return BUFFER_BACK_LEFT; 1631fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_BACK_RIGHT_EXT: 1632fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return BUFFER_BACK_RIGHT; 1633fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX0_EXT: 1634fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return BUFFER_AUX0; 1635fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX1_EXT: 1636fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX2_EXT: 1637fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX3_EXT: 1638fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX4_EXT: 1639fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX5_EXT: 1640fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX6_EXT: 1641fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX7_EXT: 1642fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX8_EXT: 1643fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_AUX9_EXT: 1644fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian default: 1645fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* BadValue error */ 1646fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return -1; 1647fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1648fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian} 1649fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1650fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1651fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianPUBLIC void 165224d965fab52f790188e5de6e67e7387809b1f145Michel DänzerXMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer, 1653fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian const int *attrib_list) 1654fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{ 1655fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian#if 0 1656fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian GET_CURRENT_CONTEXT(ctx); 1657fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian const GLuint unit = ctx->Texture.CurrentUnit; 1658fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 1659fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian struct gl_texture_object *texObj; 1660fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian#endif 1661fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian struct gl_renderbuffer *rb; 1662fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian struct xmesa_renderbuffer *xrb; 1663fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian GLint b; 166424d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer XMesaImage *img = NULL; 1665fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian GLboolean freeImg = GL_FALSE; 1666fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1667fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian b = xbuffer_to_renderbuffer(buffer); 1668fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (b < 0) 1669fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return; 1670fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1671fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_NONE_EXT) 1672fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return; /* BadMatch error */ 1673fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1674fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian rb = drawable->mesa_buffer.Attachment[b].Renderbuffer; 1675fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (!rb) { 1676fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* invalid buffer */ 1677fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return; 1678fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1679fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian xrb = xmesa_renderbuffer(rb); 1680fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1681fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian#if 0 1682fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian switch (drawable->TextureTarget) { 1683fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_TEXTURE_1D_EXT: 16849818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul texObj = texUnit->CurrentTex[TEXTURE_1D_INDEX]; 1685fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian break; 1686fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_TEXTURE_2D_EXT: 16879818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul texObj = texUnit->CurrentTex[TEXTURE_2D_INDEX]; 1688fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian break; 1689fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian case GLX_TEXTURE_RECTANGLE_EXT: 16909818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul texObj = texUnit->CurrentTex[TEXTURE_RECT_INDEX]; 1691fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian break; 1692fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian default: 1693fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return; /* BadMatch error */ 1694fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1695fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian#endif 1696fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1697fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* 1698fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * The following is a quick and simple way to implement 1699fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * BindTexImage. The better way is to write some new FetchTexel() 1700fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * functions which would extract texels from XImages. We'd still 170124d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer * need to use GetImage when texturing from a Pixmap (front buffer) 1702fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * but texturing from a back buffer (XImage) would avoid an image 1703fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * copy. 1704fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian */ 1705fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1706fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* get XImage */ 1707fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (xrb->pixmap) { 170824d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer img = XMesaGetImage(dpy, xrb->pixmap, 0, 0, rb->Width, rb->Height, ~0L, 170924d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer ZPixmap); 1710fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian freeImg = GL_TRUE; 1711fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1712fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else if (xrb->ximage) { 1713fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian img = xrb->ximage; 1714fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1715fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1716fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* store the XImage as a new texture image */ 1717fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (img) { 1718fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian GLenum format, type, intFormat; 1719fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (img->bits_per_pixel == 32) { 1720fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian format = GL_BGRA; 1721fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian type = GL_UNSIGNED_BYTE; 1722fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian intFormat = GL_RGBA; 1723fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1724fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else if (img->bits_per_pixel == 24) { 1725fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian format = GL_BGR; 1726fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian type = GL_UNSIGNED_BYTE; 1727fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian intFormat = GL_RGB; 1728fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1729fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else if (img->bits_per_pixel == 16) { 1730fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian format = GL_BGR; 1731fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian type = GL_UNSIGNED_SHORT_5_6_5; 1732fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian intFormat = GL_RGB; 1733fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1734fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else { 1735fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian _mesa_problem(NULL, "Unexpected XImage format in XMesaBindTexImage"); 1736fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return; 1737fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1738fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGBA_EXT) { 1739fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian intFormat = GL_RGBA; 1740fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1741fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian else if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGB_EXT) { 1742fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian intFormat = GL_RGB; 1743fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1744fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1745fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian _mesa_TexImage2D(GL_TEXTURE_2D, 0, intFormat, rb->Width, rb->Height, 0, 1746fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian format, type, img->data); 1747fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1748fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (freeImg) { 1749fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian XMesaDestroyImage(img); 1750fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1751fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian } 1752fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian} 1753fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1754fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1755fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1756fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianPUBLIC void 175724d965fab52f790188e5de6e67e7387809b1f145Michel DänzerXMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer) 1758fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{ 1759fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian const GLint b = xbuffer_to_renderbuffer(buffer); 1760fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian if (b < 0) 1761fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian return; 1762fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1763fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian /* no-op for now */ 1764fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian} 1765fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian 1766