1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.1 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file xm_api.c 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All the XMesa* API functions. 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NOTES: 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The window coordinate system origin (0,0) is in the lower-left corner 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the window. X11's window coordinate origin is in the upper-left 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * corner of the window. Therefore, most drawing functions in this 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * file have to flip Y coordinates. 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in support for the MIT Shared Memory extension. If enabled, when you 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use an Ximage for the back buffer in double buffered mode, the "swap" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * operation will be faster. You must also link with -lXext. 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Byte swapping: If the Mesa host and the X display use a different 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * byte order then there's some trickiness to be aware of when using 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XImages. The byte ordering used for the XImage is that of the X 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * display, not the Mesa host. 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The color-to-pixel encoding for True/DirectColor must be done 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * according to the display's visual red_mask, green_mask, and blue_mask. 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * do byte swapping if needed. If one wants to directly "poke" the pixel 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * into the XImage's buffer then the pixel must be byte swapped first. In 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and use XPutPixel everywhere except in the implementation of 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glClear(GL_COLOR_BUFFER_BIT). We want this function to be fast so 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instead of using XPutPixel we "poke" our values after byte-swapping 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the clear pixel value if needed. 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __CYGWIN__ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef WIN32 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef __WIN32__ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxheader.h" 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xmesaP.h" 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h" 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/extensions.h" 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/framebuffer.h" 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/renderbuffer.h" 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/teximage.h" 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glapi/glthread.h" 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/swrast.h" 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_renderbuffer.h" 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast_setup/swrast_setup.h" 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo/vbo.h" 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/tnl.h" 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_context.h" 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_pipeline.h" 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/driverfuncs.h" 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h" 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Global X driver lock 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_glthread_Mutex _xmesa_lock; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** X Utility Functions *****/ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the host's byte order as LSBFirst or MSBFirst ala X. 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int host_byte_order( void ) 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = 1; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *cptr = (char *) &i; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (*cptr==1) ? LSBFirst : MSBFirst; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the X Shared Memory extension is available. 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: 0 = not available 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1 = shared XImage support available 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2 = shared Pixmap support available also 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int check_for_xshm( XMesaDisplay *display ) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_XSHM) 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ignore; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: we're no longer calling XShmQueryVersion() here. It seems 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to be flakey (triggers a spurious X protocol error when we close 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * one display connection and start using a new one. XShm has been 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * around a long time and hasn't changed so if MIT_SHM is supported 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we assume we're good to go. 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 2; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No XSHM support */ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply gamma correction to an intensity value in [0..max]. Return the 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * new intensity value. 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggamma_adjust( GLfloat gamma, GLint value, GLint max ) 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gamma == 1.0) { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double x = (double) value / (double) max; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return IROUND_POS((GLfloat) max * pow(x, 1.0F/gamma)); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the true number of bits per pixel for XImages. 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For example, if we request a 24-bit deep visual we may actually need/get 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32bpp XImages. This function returns the appropriate bpp. 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: dpy - the X display 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * visinfo - desribes the visual to be used for XImages 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: true number of bits per pixel for XImages 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbits_per_pixel( XMesaVisual xmv ) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDisplay *dpy = xmv->display; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaVisualInfo visinfo = xmv->visinfo; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaImage *img; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int bitsPerPixel; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create a temporary XImage */ 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ZPixmap, 0, /*format, offset*/ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (char*) MALLOC(8), /*data*/ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, 1, /*width, height*/ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32, /*bitmap_pad*/ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0 /*bytes_per_line*/ 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(img); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* grab the bits/pixel value */ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bitsPerPixel = img->bits_per_pixel; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* free the XImage */ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free( img->data ); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->data = NULL; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDestroyImage( img ); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bitsPerPixel; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine if a given X window ID is valid (window exists). 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do this by calling XGetWindowAttributes() for the window and 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * checking if we catch an X error. 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: dpy - the display 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * win - the window to check for existance 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: GL_TRUE - window exists 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE - window doesn't exist 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean WindowExistsFlag; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr ) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) dpy; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xerr->error_code == BadWindow) { 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WindowExistsFlag = GL_FALSE; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean window_exists( XMesaDisplay *dpy, Window win ) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XWindowAttributes wa; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int (*old_handler)( XMesaDisplay*, XErrorEvent* ); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WindowExistsFlag = GL_TRUE; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_handler = XSetErrorHandler(window_exists_err_handler); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSetErrorHandler(old_handler); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return WindowExistsFlag; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Status 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height ) 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Window root; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Status stat; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int xpos, ypos; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int w, h, bw, depth; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = w; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = h; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return stat; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the size of the window (or pixmap) that corresponds to the 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * given XMesaBuffer. 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width returns width in pixels 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height returns height in pixels 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b, 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *width, GLuint *height) 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Status stat; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_LOCK_MUTEX(_xmesa_lock); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSync(b->xm_visual->display, 0); /* added for Chromium */ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_UNLOCK_MUTEX(_xmesa_lock); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!stat) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* probably querying a window that's recently been destroyed */ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(NULL, "XGetGeometry failed!\n"); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = *height = 1; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Linked list of XMesaBuffers *****/ 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer XMesaBufferList = NULL; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate a new XMesaBuffer object which corresponds to the given drawable. 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that XMesaBuffer is derived from struct gl_framebuffer. 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The new XMesaBuffer will not have any size (Width=Height=0). 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param d the corresponding X drawable (window or pixmap) 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type either WINDOW, PIXMAP or PBUFFER, describing d 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param vis the buffer's visual 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param cmap the window's colormap, if known. 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return new XMesaBuffer or NULL if any problem 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic XMesaBuffer 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_xmesa_buffer(XMesaDrawable d, BufferType type, 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaVisual vis, XMesaColormap cmap) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->display = vis->display; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->xm_visual = vis; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->type = type; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->cmap = cmap; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_initialize_window_framebuffer(&b->mesa_buffer, &vis->mesa_visual); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->mesa_buffer.Delete = xmesa_delete_framebuffer; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Front renderbuffer 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->frontxrb = xmesa_new_renderbuffer(NULL, 0, vis, GL_FALSE); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b->frontxrb) { 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(b); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->frontxrb->Parent = b; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->frontxrb->drawable = d; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->frontxrb->pixmap = (XMesaPixmap) d; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT, 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &b->frontxrb->Base.Base); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Back renderbuffer 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vis->mesa_visual.doubleBufferMode) { 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->backxrb = xmesa_new_renderbuffer(NULL, 0, vis, GL_TRUE); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b->backxrb) { 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX free front xrb too */ 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(b); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->backxrb->Parent = b; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* determine back buffer implementation */ 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT, 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &b->backxrb->Base.Base); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Other renderbuffer (depth, stencil, etc) 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_add_soft_renderbuffers(&b->mesa_buffer, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE, /* color */ 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->mesa_visual.haveDepthBuffer, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->mesa_visual.haveStencilBuffer, 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->mesa_visual.haveAccumBuffer, 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE, /* software alpha buffer */ 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vis->mesa_visual.numAuxBuffers > 0 ); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GLX_EXT_texture_from_pixmap */ 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureTarget = 0; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureMipmap = 0; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* insert buffer into linked list */ 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->Next = XMesaBufferList; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBufferList = b; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Find an XMesaBuffer by matching X display and colormap but NOT matching 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the notThis buffer. 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis) 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b=XMesaBufferList; b; b=b->Next) { 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->display==dpy && b->cmap==cmap && b!=notThis) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Remove buffer from linked list, delete if no longer referenced. 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_free_buffer(XMesaBuffer buffer) 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer prev = NULL, b; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b = XMesaBufferList; b; b = b->Next) { 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b == buffer) { 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_framebuffer *fb = &buffer->mesa_buffer; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unlink buffer from list */ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prev) 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev->Next = buffer->Next; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBufferList = buffer->Next; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* mark as delete pending */ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb->DeletePending = GL_TRUE; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Since the X window for the XMesaBuffer is going away, we don't 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * want to dereference this pointer in the future. 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->frontxrb->drawable = 0; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Unreference. If count = zero we'll really delete the buffer */ 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_framebuffer(&fb, NULL); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* continue search */ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev = b; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* buffer not found in XMesaBufferList */ 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n"); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Misc Private Functions *****/ 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Setup RGB rendering for a window with a True/DirectColor visual. 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap) 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long rmask, gmask, bmask; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) buffer; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) cmap; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Compute red multiplier (mask) and bit shift */ 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->rshift = 0; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmask = GET_REDMASK(v); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while ((rmask & 1)==0) { 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->rshift++; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rmask = rmask >> 1; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Compute green multiplier (mask) and bit shift */ 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->gshift = 0; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gmask = GET_GREENMASK(v); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while ((gmask & 1)==0) { 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->gshift++; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gmask = gmask >> 1; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Compute blue multiplier (mask) and bit shift */ 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->bshift = 0; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bmask = GET_BLUEMASK(v); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while ((bmask & 1)==0) { 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->bshift++; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bmask = bmask >> 1; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute component-to-pixel lookup tables and dithering kernel 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLubyte kernel[16] = { 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0*16, 8*16, 2*16, 10*16, 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 12*16, 4*16, 14*16, 6*16, 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3*16, 11*16, 1*16, 9*16, 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 15*16, 7*16, 13*16, 5*16, 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rBits = _mesa_bitcount(rmask); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint gBits = _mesa_bitcount(gmask); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint bBits = _mesa_bitcount(bmask); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint maxBits; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert pixel components in [0,_mask] to RGB values in [0,255] */ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<=rmask; i++) 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->PixelToR[i] = (unsigned char) ((i * 255) / rmask); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<=gmask; i++) 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->PixelToG[i] = (unsigned char) ((i * 255) / gmask); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i<=bmask; i++) 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->PixelToB[i] = (unsigned char) ((i * 255) / bmask); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert RGB values from [0,255] to pixel components */ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<256;i++) { 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint r = gamma_adjust(v->RedGamma, i, 255); 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint g = gamma_adjust(v->GreenGamma, i, 255); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint b = gamma_adjust(v->BlueGamma, i, 255); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* overflow protection */ 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=256;i<512;i++) { 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->RtoPixel[i] = v->RtoPixel[255]; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->GtoPixel[i] = v->GtoPixel[255]; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->BtoPixel[i] = v->BtoPixel[255]; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* setup dithering kernel */ 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxBits = rBits; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gBits > maxBits) maxBits = gBits; 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bBits > maxBits) maxBits = bBits; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<16;i++) { 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->Kernel[i] = kernel[i] >> maxBits; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->undithered_pf = PF_Truecolor; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor; 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Now check for TrueColor visuals which we can optimize. 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( GET_REDMASK(v) ==0x0000ff 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_GREENMASK(v)==0x00ff00 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_BLUEMASK(v) ==0xff0000 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && CHECK_BYTE_ORDER(v) 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->BitsPerPixel==32 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* common 32 bpp config used on SGI, Sun */ 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */ 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (GET_REDMASK(v) == 0xff0000 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_GREENMASK(v)== 0x00ff00 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_BLUEMASK(v) == 0x0000ff 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && CHECK_BYTE_ORDER(v) 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){ 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->BitsPerPixel==32) { 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if 32 bpp, and visual indicates 8 bpp alpha channel */ 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8) 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */ 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */ 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (v->BitsPerPixel == 24) { 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (GET_REDMASK(v) ==0xf800 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_GREENMASK(v)==0x07e0 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && GET_BLUEMASK(v) ==0x001f 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && CHECK_BYTE_ORDER(v) 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->BitsPerPixel==16 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 5-6-5 RGB */ 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->undithered_pf = PF_5R6G5B; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->dithered_pf = PF_Dither_5R6G5B; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When a context is bound for the first time, we can finally finish 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * initializing the context's visual and buffer information. 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the XMesaVisual to initialize 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param b the XMesaBuffer to initialize (may be NULL) 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param rgb_flag TRUE = RGBA mode, FALSE = color index mode 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param window the window/pixmap we're rendering into 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param cmap the colormap associated with the window/pixmap 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE=success, GL_FALSE=failure 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b, 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDrawable window, 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaColormap cmap) 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int xclass = v->visualType; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(!b || b->xm_visual == v); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Save true bits/pixel */ 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->BitsPerPixel = bits_per_pixel(v); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v->BitsPerPixel > 0); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RGB WINDOW: 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We support RGB rendering into almost any kind of visual. 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setup_truecolor( v, b, cmap ); 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n"); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.indexBits = 0; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_getenv("MESA_NO_DITHER")) { 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->dithered_pf = v->undithered_pf; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If MESA_INFO env var is set print out some debugging info 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which can help Brian figure out what's going on when a user 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reports bugs. 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_getenv("MESA_INFO")) { 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa visual = %p\n", (void *) v); 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa dithered pf = %u\n", v->dithered_pf); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa undithered pf = %u\n", v->undithered_pf); 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa level = %d\n", v->mesa_visual.level); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v)); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b && window) { 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do window-specific initializations */ 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* these should have been set in create_xmesa_buffer */ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(b->frontxrb->drawable == window); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window); 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup for single/double buffering */ 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->mesa_visual.doubleBufferMode) { 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Double buffered */ 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->shm = check_for_xshm( v->display ); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* X11 graphics contexts */ 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->gc = XCreateGC( v->display, window, 0, NULL ); 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaSetFunction( v->display, b->gc, GXcopy ); 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* cleargc - for glClear() */ 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->cleargc = XCreateGC( v->display, window, 0, NULL ); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaSetFunction( v->display, b->cleargc, GXcopy ); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Don't generate Graphics Expose/NoExpose events in swapbuffers(). 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Patch contributed by Michael Pichler May 15, 1995. 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XGCValues gcvalues; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gcvalues.graphics_exposures = False; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->swapgc = XCreateGC(v->display, window, 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GCGraphicsExposures, &gcvalues); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaSetFunction( v->display, b->swapgc, GXcopy ); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert an RGBA color to a pixel value. 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned long 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_color_to_pixel(struct gl_context *ctx, 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte r, GLubyte g, GLubyte b, GLubyte a, 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint pixelFormat) 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaContext xmesa = XMESA_CONTEXT(ctx); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pixelFormat) { 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_Truecolor: 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long p; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PACK_TRUECOLOR( p, r, g, b ); 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_8A8B8G8R: 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PACK_8A8B8G8R( r, g, b, a ); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_8A8R8G8B: 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PACK_8A8R8G8B( r, g, b, a ); 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_8R8G8B: 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall through */ 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_8R8G8B24: 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PACK_8R8G8B( r, g, b ); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_5R6G5B: 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PACK_5R6G5B( r, g, b ); 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_Dither_True: 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall through */ 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_Dither_5R6G5B: 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long p; 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PACK_TRUEDITHER(p, 1, 0, r, g, b); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel"); 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUM_VISUAL_TYPES 6 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert an X visual type to a GLX visual type. 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.) 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to be converted. 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return If \c visualType is a valid X visual type, a GLX visual type will 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be returned. Otherwise \c GLX_NONE will be returned. 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DRI CVS tree. 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_convert_from_x_visual_type( int visualType ) 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const int glx_visual_types[ NUM_VISUAL_TYPES ] = { 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_STATIC_GRAY, GLX_GRAY_SCALE, 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLX_TRUE_COLOR, GLX_DIRECT_COLOR 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ( (unsigned) visualType < NUM_VISUAL_TYPES ) 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? glx_visual_types[ visualType ] : GLX_NONE; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Public Functions *****/ 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new X/Mesa visual. 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: display - X11 display 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * visinfo - an XVisualInfo pointer 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rgb_flag - GL_TRUE = RGB mode, 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE = color index mode 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * alpha_flag - alpha buffer requested? 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * db_flag - GL_TRUE = double-buffered, 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE = single buffered 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stereo_flag - stereo visual? 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ximage_flag - GL_TRUE = use an XImage for back buffer, 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE = use an off-screen pixmap for back buffer 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * depth_size - requested bits/depth values, or zero 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stencil_size - requested bits/stencil values, or zero 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accum_red_size - requested bits/red accum values, or zero 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accum_green_size - requested bits/green accum values, or zero 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accum_blue_size - requested bits/blue accum values, or zero 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * accum_alpha_size - requested bits/alpha accum values, or zero 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * num_samples - number of samples/pixel if multisampling, or zero 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * level - visual level, usually 0 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * visualCaveat - ala the GLX extension, usually GLX_NONE 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return; a new XMesaVisual or 0 if error. 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaVisual XMesaCreateVisual( XMesaDisplay *display, 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaVisualInfo visinfo, 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean rgb_flag, 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean alpha_flag, 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean db_flag, 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean stereo_flag, 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean ximage_flag, 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint depth_size, 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint stencil_size, 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accum_red_size, 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accum_green_size, 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accum_blue_size, 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accum_alpha_size, 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint num_samples, 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint level, 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint visualCaveat ) 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *gamma; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaVisual v; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint red_bits, green_bits, blue_bits, alpha_bits; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For debugging only */ 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_getenv("MESA_XSYNC")) { 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This makes debugging X easier. 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In your debugger, set a breakpoint on _XError to stop when an 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * X protocol error is generated. 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSynchronize( display, 1 ); 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Color-index rendering not supported. */ 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rgb_flag) 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!v) { 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->display = display; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Save a copy of the XVisualInfo struct because the user may Xfree() 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the struct but we may need some of the information contained in it 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * at a later time. 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!v->visinfo) { 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(v); 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(v->visinfo, visinfo, sizeof(*visinfo)); 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check for MESA_GAMMA environment variable */ 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gamma = _mesa_getenv("MESA_GAMMA"); 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gamma) { 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma ); 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->RedGamma<=0.0) v->RedGamma = 1.0; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->GreenGamma<=0.0) v->GreenGamma = v->RedGamma; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->BlueGamma<=0.0) v->BlueGamma = v->RedGamma; 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->ximage_flag = ximage_flag; 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.redMask = visinfo->red_mask; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.greenMask = visinfo->green_mask; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.blueMask = visinfo->blue_mask; 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visualID = visinfo->visualid; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->screen = visinfo->screen; 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !(defined(__cplusplus) || defined(c_plusplus)) 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visualType = xmesa_convert_from_x_visual_type(visinfo->class); 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visualType = xmesa_convert_from_x_visual_type(visinfo->c_class); 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.visualRating = visualCaveat; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (alpha_flag) 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.alphaBits = 8; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) initialize_visual_and_buffer( v, NULL, 0, 0 ); 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int xclass = v->visualType; 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org red_bits = _mesa_bitcount(GET_REDMASK(v)); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org green_bits = _mesa_bitcount(GET_GREENMASK(v)); 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blue_bits = _mesa_bitcount(GET_BLUEMASK(v)); 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this is an approximation */ 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int depth; 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = GET_VISUAL_DEPTH(v); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org red_bits = depth / 3; 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth -= red_bits; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org green_bits = depth / 2; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth -= green_bits; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blue_bits = depth; 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_bits = 0; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) ); 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alpha_bits = v->mesa_visual.alphaBits; 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_initialize_visual(&v->mesa_visual, 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org db_flag, stereo_flag, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org red_bits, green_bits, 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blue_bits, alpha_bits, 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_size, 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stencil_size, 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org accum_red_size, accum_green_size, 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org accum_blue_size, accum_alpha_size, 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0)) { 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(v); 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX minor hack */ 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->mesa_visual.level = level; 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return v; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaDestroyVisual( XMesaVisual v ) 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(v->visinfo); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(v); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new XMesaContext. 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the XMesaVisual 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param share_list another XMesaContext with which to share display 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lists or NULL if no sharing is wanted. 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return an XMesaContext or NULL if error. 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLboolean firstTime = GL_TRUE; 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaContext c; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *mesaCtx; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dd_function_table functions; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (firstTime) { 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glthread_INIT_MUTEX(_xmesa_lock); 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org firstTime = GL_FALSE; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: the XMesaContext contains a Mesa struct gl_context struct (inheritance) */ 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!c) 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mesaCtx = &(c->mesa); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* initialize with default driver functions, then plug in XMesa funcs */ 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_driver_functions(&functions); 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_init_driver_functions(v, &functions); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_initialize_context(mesaCtx, API_OPENGL, &v->mesa_visual, 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org share_list ? &(share_list->mesa) : (struct gl_context *) NULL, 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &functions, (void *) c)) { 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(c); 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Enable this to exercise fixed function -> shader translation 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with software rendering. 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE; 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_sw_extensions(mesaCtx); 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_3_extensions(mesaCtx); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_4_extensions(mesaCtx); 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_5_extensions(mesaCtx); 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_2_0_extensions(mesaCtx); 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_2_1_extensions(mesaCtx); 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mesaCtx->Mesa_DXTn) { 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc"); 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_extension(mesaCtx, "GL_S3_s3tc"); 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1"); 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if ENABLE_EXT_timer_query 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query"); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* finish up xmesa context initializations */ 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE; 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_visual = v; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->display = v->display; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->pixelformat = v->dithered_pf; /* Dithering is enabled by default */ 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Initialize the software rasterizer and helper modules. 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_swrast_CreateContext( mesaCtx ) || 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_vbo_CreateContext( mesaCtx ) || 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_tnl_CreateContext( mesaCtx ) || 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_swsetup_CreateContext( mesaCtx )) { 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_context_data(&c->mesa); 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(c); 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* tnl setup */ 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl = TNL_CONTEXT(mesaCtx); 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.RunPipeline = _tnl_run_pipeline; 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* swrast setup */ 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_register_swrast_functions( mesaCtx ); 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_Wakeup(mesaCtx); 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_meta_init(mesaCtx); 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return c; 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaDestroyContext( XMesaContext c ) 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *mesaCtx = &c->mesa; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_meta_free( mesaCtx ); 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_DestroyContext( mesaCtx ); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_DestroyContext( mesaCtx ); 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_DestroyContext( mesaCtx ); 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _vbo_DestroyContext( mesaCtx ); 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_context_data( mesaCtx ); 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free( c ); 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Private function for creating an XMesaBuffer which corresponds to an 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * X window or pixmap. 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the window's XMesaVisual 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param w the window we're wrapping 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return new XMesaBuffer or NULL if error 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC XMesaBuffer 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XWindowAttributes attr; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaColormap cmap; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int depth; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v); 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(w); 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check that window depth matches visual depth */ 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XGetWindowAttributes( v->display, w, &attr ); 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = attr.depth; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (GET_VISUAL_DEPTH(v) != depth) { 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_VISUAL_DEPTH(v), depth); 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Find colormap */ 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attr.colormap) { 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cmap = attr.colormap; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this is weird, a window w/out a colormap!? */ 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OK, let's just allocate a new one and hope for the best */ 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap); 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialize_visual_and_buffer( v, b, (XMesaDrawable) w, cmap )) { 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new XMesaBuffer from an X pixmap. 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param v the XMesaVisual 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param p the pixmap 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c GLX_DIRECT_COLOR visual for the pixmap 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \returns new XMesaBuffer or NULL if error 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC XMesaBuffer 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v); 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) { 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For GLX_EXT_texture_from_pixmap 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p, 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaColormap cmap, 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int format, int target, int mipmap) 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint width, height; 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v); 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get pixmap size, update framebuffer/renderbuffer dims */ 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_get_window_size(v->display, b, &width, &height); 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height); 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == 0) { 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* examine dims */ 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_texture_non_power_of_two) { 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GLX_TEXTURE_2D_EXT; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if ( _mesa_bitcount(width) == 1 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && _mesa_bitcount(height) == 1) { 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* power of two size */ 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height == 1) { 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GLX_TEXTURE_1D_EXT; 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GLX_TEXTURE_2D_EXT; 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Extensions.NV_texture_rectangle) { 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = GLX_TEXTURE_RECTANGLE_EXT; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* non power of two textures not supported */ 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDestroyBuffer(b); 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureTarget = target; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureFormat = format; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->TextureMipmap = mipmap; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) { 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int width, unsigned int height) 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaWindow root; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDrawable drawable; /* X Pixmap Drawable */ 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* allocate pixmap for front buffer */ 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org root = RootWindow( v->display, v->visinfo->screen ); 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawable = XCreatePixmap(v->display, root, width, height, 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->visinfo->depth); 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!drawable) 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b) 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialize_visual_and_buffer(v, b, drawable, cmap)) { 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Deallocate an XMesaBuffer structure and all related info. 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC void 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaDestroyBuffer(XMesaBuffer b) 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Query the current window size and update the corresponding struct gl_framebuffer 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and all attached renderbuffers. 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called when: 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1. the first time a buffer is bound to a context. 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2. from glViewport to poll for window size changes 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3. from the XMesaResizeBuffers() API function. 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: it's possible (and legal) for xmctx to be NULL. That can happen 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * when resizing a buffer when no rendering context is bound. 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer) 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint width, height; 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height); 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (drawBuffer->mesa_buffer.Width != width || 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawBuffer->mesa_buffer.Height != height) { 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = xmctx ? &xmctx->mesa : NULL; 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height); 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */ 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Bind buffer b to context c and make c the current rendering context. 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b ) 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return XMesaMakeCurrent2( c, b, b ); 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Bind buffer b to context c and make c the current rendering context. 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer readBuffer ) 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c) { 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!drawBuffer || !readBuffer) 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; /* must specify buffers! */ 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (&(c->mesa) == _mesa_get_current_context() 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && c->mesa.ReadBuffer == &readBuffer->mesa_buffer 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) { 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* same context and buffer, do nothing */ 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_buffer = drawBuffer; 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Call this periodically to detect when the user has begun using 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL rendering from multiple threads. 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glapi_check_multithread(); 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_check_and_update_buffer_size(c, drawBuffer); 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (readBuffer != drawBuffer) 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_check_and_update_buffer_size(c, readBuffer); 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_make_current(&(c->mesa), 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &drawBuffer->mesa_buffer, 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &readBuffer->mesa_buffer); 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Must recompute and set these pixel values because colormap 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * can be different for different windows. 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->clearpixel = xmesa_color_to_pixel( &c->mesa, 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->clearcolor[0], 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->clearcolor[1], 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->clearcolor[2], 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->clearcolor[3], 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c->xm_visual->undithered_pf); 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel); 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drawBuffer->wasCurrent = GL_TRUE; 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Detach */ 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_make_current( NULL, NULL, NULL ); 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unbind the context c from its buffer. 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean XMesaUnbindContext( XMesaContext c ) 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* A no-op for XFree86 integration purposes */ 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaContext XMesaGetCurrentContext( void ) 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx) { 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaContext xmesa = XMESA_CONTEXT(ctx); 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return xmesa; 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer XMesaGetCurrentBuffer( void ) 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx) { 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer); 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return xmbuf; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* New in Mesa 3.1 */ 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer XMesaGetCurrentReadBuffer( void ) 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx) { 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return XMESA_BUFFER(ctx->ReadBuffer); 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean XMesaSetFXmode( GLint mode ) 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) mode; 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy the back buffer to the front buffer. If there's no back buffer 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this is a no-op. 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaSwapBuffers( XMesaBuffer b ) 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b->backxrb) { 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* single buffered */ 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we're swapping the buffer associated with the current context 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we have to flush any pending rendering commands first. 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_notifySwapBuffers(ctx); 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->db_mode) { 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->backxrb->ximage) { 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy Ximage (back buf) from client memory to server window */ 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_XSHM) 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->shm) { 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->swapgc, 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->backxrb->ximage, 0, 0, 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org False ); 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->swapgc, 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->backxrb->ximage, 0, 0, 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height ); 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (b->backxrb->pixmap) { 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy pixmap (back buf) to window (front buf) on server */ 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaCopyArea( b->xm_visual->display, 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->backxrb->pixmap, /* source drawable */ 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->frontxrb->drawable, /* dest. drawable */ 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->swapgc, 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0 /* dest region */ 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSync( b->xm_visual->display, False ); 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy sub-region of back buffer to front buffer 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we're swapping the buffer associated with the current context 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we have to flush any pending rendering commands first. 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_notifySwapBuffers(ctx); 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!b->backxrb) { 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* single buffered */ 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->db_mode) { 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int yTop = b->mesa_buffer.Height - y - height; 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->backxrb->ximage) { 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy Ximage from host's memory to server's window */ 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_XSHM) 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->shm) { 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX assuming width and height aren't too large! */ 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->swapgc, 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->backxrb->ximage, x, yTop, 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, yTop, width, height, False ); 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* wait for finished event??? */ 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX assuming width and height aren't too large! */ 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->swapgc, 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->backxrb->ximage, x, yTop, 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, yTop, width, height ); 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy pixmap to window on server */ 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaCopyArea( b->xm_visual->display, 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->backxrb->pixmap, /* source drawable */ 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->frontxrb->drawable, /* dest. drawable */ 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b->swapgc, 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, yTop, width, height, /* source region */ 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, yTop /* dest region */ 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return a pointer to the XMesa backbuffer Pixmap or XImage. This function 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is a way to get "under the hood" of X/Mesa so one can manipulate the 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * back buffer directly. 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output: pixmap - pointer to back buffer's Pixmap, or 0 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ximage - pointer to back buffer's XImage, or NULL 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: GL_TRUE = context is double buffered 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_FALSE = context is single buffered 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean XMesaGetBackBuffer( XMesaBuffer b, 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaPixmap *pixmap, 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaImage **ximage ) 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->db_mode) { 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pixmap) 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pixmap = b->backxrb->pixmap; 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ximage) 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ximage = b->backxrb->ximage; 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pixmap = 0; 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ximage = NULL; 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the depth buffer associated with an XMesaBuffer. 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: b - the XMesa buffer handle 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output: width, height - size of buffer in pixels 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bytesPerValue - bytes per depth value (2 or 4) 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer - pointer to depth buffer values 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: GL_TRUE or GL_FALSE to indicate success or failure. 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height, 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *bytesPerValue, void **buffer ) 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer; 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xmesa_renderbuffer *xrb = xmesa_renderbuffer(rb); 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xrb || !xrb->Base.Buffer) { 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = 0; 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = 0; 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bytesPerValue = 0; 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *buffer = 0; 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = b->mesa_buffer.Width; 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = b->mesa_buffer.Height; 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? sizeof(GLushort) : sizeof(GLuint); 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *buffer = (void *) xrb->Base.Buffer; 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaFlush( XMesaContext c ) 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c && c->xm_visual) { 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSync( c->xm_visual->display, False ); 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char *XMesaGetString( XMesaContext c, int name ) 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) c; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (name==XMESA_VERSION) { 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return "5.0"; 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (name==XMESA_EXTENSIONS) { 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ""; 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d ) 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b; 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b=XMesaBufferList; b; b=b->Next) { 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->frontxrb->drawable == d && b->display == dpy) { 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return b; 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free/destroy all XMesaBuffers associated with given display. 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy) 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b, next; 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b = XMesaBufferList; b; b = next) { 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = b->Next; 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->display == dpy) { 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_free_buffer(b); 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Look for XMesaBuffers whose X window has been destroyed. 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Deallocate any such XMesaBuffers. 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid XMesaGarbageCollect( XMesaDisplay* dpy ) 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaBuffer b, next; 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (b=XMesaBufferList; b; b=next) { 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = b->Next; 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b->display && b->display == dpy && b->frontxrb->drawable && b->type == WINDOW) { 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XSync(b->display, False); 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!window_exists( b->display, b->frontxrb->drawable )) { 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* found a dead window, free the ancillary info */ 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDestroyBuffer( b ); 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y, 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat red, GLfloat green, 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat blue, GLfloat alpha ) 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint r = (GLint) (red * 255.0F); 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint g = (GLint) (green * 255.0F); 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint b = (GLint) (blue * 255.0F); 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint a = (GLint) (alpha * 255.0F); 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (xmesa->pixelformat) { 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_Truecolor: 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long p; 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PACK_TRUECOLOR( p, r, g, b ); 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p; 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_8A8B8G8R: 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PACK_8A8B8G8R( r, g, b, a ); 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_8A8R8G8B: 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PACK_8A8R8G8B( r, g, b, a ); 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_8R8G8B: 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PACK_8R8G8B( r, g, b ); 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_5R6G5B: 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PACK_5R6G5B( r, g, b ); 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_Dither_5R6G5B: 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall through */ 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PF_Dither_True: 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long p; 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PACK_TRUEDITHER(p, x, y, r, g, b); 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p; 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor"); 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is typically called when the window size changes and we need 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to reallocate the buffer's back/depth/stencil/accum buffers. 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC void 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaResizeBuffers( XMesaBuffer b ) 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaContext xmctx = XMESA_CONTEXT(ctx); 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!xmctx) 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmesa_check_and_update_buffer_size(xmctx, b); 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxbuffer_to_renderbuffer(int buffer) 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(MAX_AUX_BUFFERS <= 4); 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (buffer) { 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_FRONT_LEFT_EXT: 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BUFFER_FRONT_LEFT; 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_FRONT_RIGHT_EXT: 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BUFFER_FRONT_RIGHT; 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BACK_LEFT_EXT: 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BUFFER_BACK_LEFT; 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_BACK_RIGHT_EXT: 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BUFFER_BACK_RIGHT; 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX0_EXT: 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BUFFER_AUX0; 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX1_EXT: 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX2_EXT: 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX3_EXT: 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX4_EXT: 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX5_EXT: 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX6_EXT: 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX7_EXT: 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX8_EXT: 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_AUX9_EXT: 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BadValue error */ 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC void 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer, 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *attrib_list) 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint unit = ctx->Texture.CurrentUnit; 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb; 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct xmesa_renderbuffer *xrb; 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint b; 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaImage *img = NULL; 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean freeImg = GL_FALSE; 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = xbuffer_to_renderbuffer(buffer); 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b < 0) 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_NONE_EXT) 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /* BadMatch error */ 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb = drawable->mesa_buffer.Attachment[b].Renderbuffer; 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rb) { 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* invalid buffer */ 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xrb = xmesa_renderbuffer(rb); 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (drawable->TextureTarget) { 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TEXTURE_1D_EXT: 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = texUnit->CurrentTex[TEXTURE_1D_INDEX]; 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TEXTURE_2D_EXT: 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = texUnit->CurrentTex[TEXTURE_2D_INDEX]; 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GLX_TEXTURE_RECTANGLE_EXT: 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = texUnit->CurrentTex[TEXTURE_RECT_INDEX]; 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /* BadMatch error */ 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The following is a quick and simple way to implement 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BindTexImage. The better way is to write some new FetchTexel() 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * functions which would extract texels from XImages. We'd still 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * need to use GetImage when texturing from a Pixmap (front buffer) 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but texturing from a back buffer (XImage) would avoid an image 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy. 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get XImage */ 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xrb->pixmap) { 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = XMesaGetImage(dpy, xrb->pixmap, 0, 0, rb->Width, rb->Height, ~0L, 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ZPixmap); 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org freeImg = GL_TRUE; 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (xrb->ximage) { 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img = xrb->ximage; 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* store the XImage as a new texture image */ 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img) { 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, type, intFormat; 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img->bits_per_pixel == 32) { 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = GL_BGRA; 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type = GL_UNSIGNED_BYTE; 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intFormat = GL_RGBA; 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (img->bits_per_pixel == 24) { 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = GL_BGR; 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type = GL_UNSIGNED_BYTE; 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intFormat = GL_RGB; 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (img->bits_per_pixel == 16) { 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = GL_BGR; 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type = GL_UNSIGNED_SHORT_5_6_5; 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intFormat = GL_RGB; 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "Unexpected XImage format in XMesaBindTexImage"); 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGBA_EXT) { 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intFormat = GL_RGBA; 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGB_EXT) { 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org intFormat = GL_RGB; 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_TexImage2D(GL_TEXTURE_2D, 0, intFormat, rb->Width, rb->Height, 0, 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, img->data); 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (freeImg) { 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org XMesaDestroyImage(img); 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC void 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgXMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer) 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint b = xbuffer_to_renderbuffer(buffer); 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (b < 0) 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no-op for now */ 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1766