xm_api.c revision 6632915e957149c153a3f793c400a532b4995b18
17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/* 27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Mesa 3-D graphics library 37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Version: 7.1 47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Permission is hereby granted, free of charge, to any person obtaining a 87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * copy of this software and associated documentation files (the "Software"), 97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * to deal in the Software without restriction, including without limitation 107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * the rights to use, copy, modify, merge, publish, distribute, sublicense, 117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * and/or sell copies of the Software, and to permit persons to whom the 127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Software is furnished to do so, subject to the following conditions: 137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * The above copyright notice and this permission notice shall be included 157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * in all copies or substantial portions of the Software. 167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/** 267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * \file xm_api.c 277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * All the XMesa* API functions. 297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * NOTES: 327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * The window coordinate system origin (0,0) is in the lower-left corner 347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * of the window. X11's window coordinate origin is in the upper-left 357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * corner of the window. Therefore, most drawing functions in this 367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * file have to flip Y coordinates. 377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Byte swapping: If the Mesa host and the X display use a different 407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * byte order then there's some trickiness to be aware of when using 417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * XImages. The byte ordering used for the XImage is that of the X 427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * display, not the Mesa host. 437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * The color-to-pixel encoding for True/DirectColor must be done 447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * according to the display's visual red_mask, green_mask, and blue_mask. 457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * do byte swapping if needed. If one wants to directly "poke" the pixel 477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * into the XImage's buffer then the pixel must be byte swapped first. 487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#ifdef __CYGWIN__ 527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#undef WIN32 537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#undef __WIN32__ 547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#endif 5557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 5657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer#include "xm_api.h" 577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include "xm_st.h" 587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include "main/context.h" 607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include "pipe/p_defines.h" 617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include "pipe/p_screen.h" 627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include "pipe/p_context.h" 637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include "xm_public.h" 657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#include <GL/glx.h> 667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 6857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer/* Driver interface routines, set up by xlib backend on library 6957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * _init(). These are global in the same way that function names are 7057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * global. 7157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer */ 7257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic struct xm_driver driver; 7357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic struct st_api *stapi; 747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanvoid xmesa_set_driver( const struct xm_driver *templ ) 7657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer{ 777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman driver = *templ; 7857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer stapi = driver.create_st_api(); 7957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer} 807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstatic XMesaDisplay 827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanxmesa_init_display( Display *display ) 83e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer{ 847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman pipe_static_mutex(init_mutex); 85e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer static struct xmesa_display xm_display; 86e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer XMesaDisplay xmdpy; 87e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 88e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer pipe_mutex_lock(init_mutex); 89e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 90e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer /* TODO support for multiple displays */ 91e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy = &xm_display; 92e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 93e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer if (!xmdpy->display && display) { 94e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy->display = display; 95e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy->screen = driver.create_pipe_screen(display); 96e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy->smapi = CALLOC_STRUCT(st_manager); 97e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer if (xmdpy->smapi) 98e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy->smapi->screen = xmdpy->screen; 99e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 100e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer if (xmdpy->screen && xmdpy->smapi) { 101e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer pipe_mutex_init(xmdpy->mutex); 102e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer } 103e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer else { 104e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer if (xmdpy->screen) { 105e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy->screen->destroy(xmdpy->screen); 106e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy->screen = NULL; 107e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer } 108e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer if (xmdpy->smapi) { 109e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer FREE(xmdpy->smapi); 110e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy->smapi = NULL; 111e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer } 112e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 113e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer xmdpy->display = NULL; 114e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer } 115e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer } 116190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!xmdpy->display || xmdpy->display != display) 117190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmdpy = NULL; 118190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 119e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer pipe_mutex_unlock(init_mutex); 120e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 121e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer return xmdpy; 1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/**********************************************************************/ 1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/***** X Utility Functions *****/ 1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/**********************************************************************/ 127190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 128190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 129190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 130e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer * Return the host's byte order as LSBFirst or MSBFirst ala X. 131e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer */ 132e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerstatic int host_byte_order( void ) 133e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer{ 134e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer int i = 1; 135e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer char *cptr = (char *) &i; 136e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer return (*cptr==1) ? LSBFirst : MSBFirst; 137e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer} 138e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 139e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 140e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 141e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer 1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/** 1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Return the true number of bits per pixel for XImages. 144190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * For example, if we request a 24-bit deep visual we may actually need/get 145190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * 32bpp XImages. This function returns the appropriate bpp. 146190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Input: dpy - the X display 147190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * visinfo - desribes the visual to be used for XImages 148190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Return: true number of bits per pixel for XImages 1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 150190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerstatic int 151190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerbits_per_pixel( XMesaVisual xmv ) 152190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 153190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer Display *dpy = xmv->display; 154190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XVisualInfo * visinfo = xmv->visinfo; 155190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XImage *img; 156190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer int bitsPerPixel; 157190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* Create a temporary XImage */ 158190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 159190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer ZPixmap, 0, /*format, offset*/ 1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (char*) MALLOC(8), /*data*/ 1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1, 1, /*width, height*/ 1627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 32, /*bitmap_pad*/ 1637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 0 /*bytes_per_line*/ 1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ); 1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman assert(img); 1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* grab the bits/pixel value */ 1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman bitsPerPixel = img->bits_per_pixel; 1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* free the XImage */ 1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman free( img->data ); 1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman img->data = NULL; 1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XDestroyImage( img ); 1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return bitsPerPixel; 1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 17757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer/* 1787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Determine if a given X window ID is valid (window exists). 17957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * Do this by calling XGetWindowAttributes() for the window and 1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * checking if we catch an X error. 1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Input: dpy - the display 18257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * win - the window to check for existance 18357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * Return: GL_TRUE - window exists 18457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * GL_FALSE - window doesn't exist 18557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer */ 18657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic GLboolean WindowExistsFlag; 18757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 18857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic int window_exists_err_handler( Display* dpy, XErrorEvent* xerr ) 18957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer{ 19057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer (void) dpy; 19157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer if (xerr->error_code == BadWindow) { 19257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer WindowExistsFlag = GL_FALSE; 19357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 19457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return 0; 19557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer} 19657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 19757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic GLboolean window_exists( Display *dpy, Window win ) 19857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer{ 19957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer XWindowAttributes wa; 20057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer int (*old_handler)( Display*, XErrorEvent* ); 20157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer WindowExistsFlag = GL_TRUE; 20257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer old_handler = XSetErrorHandler(window_exists_err_handler); 20357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 20457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer XSetErrorHandler(old_handler); 20557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return WindowExistsFlag; 20657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer} 20757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 20857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic Status 20957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerget_drawable_size( Display *dpy, Drawable d, uint *width, uint *height ) 21057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer{ 21157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer Window root; 21257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer Status stat; 21357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer int xpos, ypos; 21457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer unsigned int w, h, bw, depth; 21557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth); 21657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer *width = w; 21757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer *height = h; 21857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return stat; 21957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer} 22057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 22157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 22257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer/** 22357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * Return the size of the window (or pixmap) that corresponds to the 22457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * given XMesaBuffer. 22557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * \param width returns width in pixels 22657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * \param height returns height in pixels 22757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer */ 22857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramervoid 22957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerxmesa_get_window_size(Display *dpy, XMesaBuffer b, 23057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer GLuint *width, GLuint *height) 23157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer{ 23257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer XMesaDisplay xmdpy = xmesa_init_display(dpy); 23357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer Status stat; 23457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 2357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman pipe_mutex_lock(xmdpy->mutex); 2367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XSync(b->xm_visual->display, 0); /* added for Chromium */ 2377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman stat = get_drawable_size(dpy, b->ws.drawable, width, height); 2387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman pipe_mutex_unlock(xmdpy->mutex); 23957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 2407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!stat) { 2417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* probably querying a window that's recently been destroyed */ 24257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer _mesa_warning(NULL, "XGetGeometry failed!\n"); 24357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer *width = *height = 1; 24457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 24557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer} 24657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 2477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GET_REDMASK(__v) __v->mesa_visual.redMask 2487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GET_GREENMASK(__v) __v->mesa_visual.greenMask 2497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#define GET_BLUEMASK(__v) __v->mesa_visual.blueMask 2507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/** 25357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * Choose the pixel format for the given visual. 25457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * This will tell the gallium driver how to pack pixel data into 2557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * drawing surfaces. 25657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer */ 25757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic GLuint 25857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerchoose_pixel_format(XMesaVisual v) 25957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer{ 26057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer boolean native_byte_order = (host_byte_order() == 2617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ImageByteOrder(v->display)); 2627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 26357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer if ( GET_REDMASK(v) == 0x0000ff 26457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && GET_GREENMASK(v) == 0x00ff00 26557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && GET_BLUEMASK(v) == 0xff0000 26657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && v->BitsPerPixel == 32) { 26757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer if (native_byte_order) { 26857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer /* no byteswapping needed */ 26957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return PIPE_FORMAT_R8G8B8A8_UNORM; 27057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 27157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer else { 27257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return PIPE_FORMAT_A8B8G8R8_UNORM; 27357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 27457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 27557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer else if ( GET_REDMASK(v) == 0xff0000 27657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && GET_GREENMASK(v) == 0x00ff00 27757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && GET_BLUEMASK(v) == 0x0000ff 27857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && v->BitsPerPixel == 32) { 2797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (native_byte_order) { 28057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer /* no byteswapping needed */ 28157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return PIPE_FORMAT_B8G8R8A8_UNORM; 2827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 2837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman else { 28457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return PIPE_FORMAT_A8R8G8B8_UNORM; 28557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 28657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 28757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer else if ( GET_REDMASK(v) == 0x0000ff00 28857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && GET_GREENMASK(v) == 0x00ff0000 28957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && GET_BLUEMASK(v) == 0xff000000 29057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && v->BitsPerPixel == 32) { 29157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer if (native_byte_order) { 29257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer /* no byteswapping needed */ 29357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return PIPE_FORMAT_A8R8G8B8_UNORM; 29457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 29557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer else { 29657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return PIPE_FORMAT_B8G8R8A8_UNORM; 29757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 29857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 29957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer else if ( GET_REDMASK(v) == 0xf800 30057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && GET_GREENMASK(v) == 0x07e0 30157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && GET_BLUEMASK(v) == 0x001f 30257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && native_byte_order 30357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer && v->BitsPerPixel == 16) { 30457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer /* 5-6-5 RGB */ 30557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return PIPE_FORMAT_B5G6R5_UNORM; 30657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 3077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman assert(0); 30957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer return 0; 31057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer} 31157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 31257240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer/** 3137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Choose a depth/stencil format that is "better" than the given depth and 3147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * stencil sizes. 31557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer */ 31657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic enum pipe_format 3177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanchoose_depth_stencil_format(XMesaDisplay xmdpy, int depth, int stencil) 3187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 3197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const enum pipe_texture_target target = PIPE_TEXTURE_2D; 3207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const unsigned tex_usage = PIPE_TEXTURE_USAGE_DEPTH_STENCIL; 3217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const unsigned geom_flags = (PIPE_TEXTURE_GEOM_NON_SQUARE | 3227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman PIPE_TEXTURE_GEOM_NON_POWER_OF_TWO); 3237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman enum pipe_format formats[8], fmt; 3247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman int count, i; 3257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman count = 0; 3277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (depth <= 24 && stencil <= 8) { 3287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman formats[count++] = PIPE_FORMAT_S8Z24_UNORM; 3297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman formats[count++] = PIPE_FORMAT_Z24S8_UNORM; 3307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 3317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!stencil) { 3337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (depth <= 16) 3347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman formats[count++] = PIPE_FORMAT_Z16_UNORM; 3357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (depth <= 32) 3367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman formats[count++] = PIPE_FORMAT_Z32_UNORM; 3377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 3387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman fmt = PIPE_FORMAT_NONE; 3407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman for (i = 0; i < count; i++) { 34157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer if (xmdpy->screen->is_format_supported(xmdpy->screen, formats[i], 3427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman target, tex_usage, geom_flags)) { 3437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman fmt = formats[i]; 3447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman break; 3457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 3467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 3477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return fmt; 3497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 3507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/**********************************************************************/ 3547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/***** Linked list of XMesaBuffers *****/ 3557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/**********************************************************************/ 3567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstatic XMesaBuffer XMesaBufferList = NULL; 3587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/** 3617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Allocate a new XMesaBuffer object which corresponds to the given drawable. 3627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Note that XMesaBuffer is derived from GLframebuffer. 3637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * The new XMesaBuffer will not have any size (Width=Height=0). 3647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * 3657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * \param d the corresponding X drawable (window or pixmap) 3667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * \param type either WINDOW, PIXMAP or PBUFFER, describing d 3677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * \param vis the buffer's visual 3687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * \param cmap the window's colormap, if known. 3697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * \return new XMesaBuffer or NULL if any problem 3707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 3717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstatic XMesaBuffer 372190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramercreate_xmesa_buffer(Drawable d, BufferType type, 373190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaVisual vis, Colormap cmap) 374190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 375190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaDisplay xmdpy = xmesa_init_display(vis->display); 376190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaBuffer b; 377190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer uint width, height; 378190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 3797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); 3807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!xmdpy) 3827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return NULL; 3837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 3857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!b) 3867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return NULL; 3877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->ws.drawable = d; 3897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->ws.visual = vis->visinfo->visual; 3907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->ws.depth = vis->visinfo->depth; 3917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->xm_visual = vis; 3937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->type = type; 3947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->cmap = cmap; 3957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman get_drawable_size(vis->display, d, &width, &height); 3977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* 3997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Create framebuffer, but we'll plug in our own renderbuffers below. 4007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 4017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->stfb = xmesa_create_st_framebuffer(xmdpy->screen, b); 4027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* GLX_EXT_texture_from_pixmap */ 4047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->TextureTarget = 0; 4057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT; 4067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->TextureMipmap = 0; 4077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* insert buffer into linked list */ 4097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->Next = XMesaBufferList; 4107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaBufferList = b; 4117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return b; 4137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 4147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/** 4177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Find an XMesaBuffer by matching X display and colormap but NOT matching 4187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * the notThis buffer. 4197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 4207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanXMesaBuffer 4217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanxmesa_find_buffer(Display *dpy, Colormap cmap, XMesaBuffer notThis) 4227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 4237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaBuffer b; 4247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman for (b = XMesaBufferList; b; b = b->Next) { 4257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (b->xm_visual->display == dpy && 4267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->cmap == cmap && 4277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b != notThis) { 4287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return b; 4297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 4307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 4317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return NULL; 4327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 4337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/** 4367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Remove buffer from linked list, delete if no longer referenced. 4377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 4387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanstatic void 4397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanxmesa_free_buffer(XMesaBuffer buffer) 4407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 4417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaBuffer prev = NULL, b; 4427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman for (b = XMesaBufferList; b; b = b->Next) { 4447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (b == buffer) { 4457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* unlink buffer from list */ 446190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (prev) 447190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer prev->Next = buffer->Next; 448190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer else 449190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaBufferList = buffer->Next; 450190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 451190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* Since the X window for the XMesaBuffer is going away, we don't 452190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * want to dereference this pointer in the future. 453190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 454190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer b->ws.drawable = 0; 455190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 456190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* XXX we should move the buffer to a delete-pending list and destroy 45757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * the buffer until it is no longer current. 45857240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer */ 459190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_destroy_st_framebuffer(buffer->stfb); 460190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 461190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer free(buffer); 462190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 463190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return; 464190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 465190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* continue search */ 466190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer prev = b; 467190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 468190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* buffer not found in XMesaBufferList */ 469190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n"); 470190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 471190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 472190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 473190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 474190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/**********************************************************************/ 475190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/***** Misc Private Functions *****/ 476190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/**********************************************************************/ 477190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 478190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 479190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 480190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * When a context is bound for the first time, we can finally finish 481190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * initializing the context's visual and buffer information. 482190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param v the XMesaVisual to initialize 483190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param b the XMesaBuffer to initialize (may be NULL) 484190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param rgb_flag TRUE = RGBA mode, FALSE = color index mode 485190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param window the window/pixmap we're rendering into 486190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param cmap the colormap associated with the window/pixmap 487190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \return GL_TRUE=success, GL_FALSE=failure 488190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 48957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramerstatic GLboolean 490190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerinitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b, 491190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GLboolean rgb_flag, Drawable window, 492190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer Colormap cmap) 493190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 494190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer ASSERT(!b || b->xm_visual == v); 495190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 496190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* Save true bits/pixel */ 497190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->BitsPerPixel = bits_per_pixel(v); 498190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer assert(v->BitsPerPixel > 0); 499190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 500190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (rgb_flag == GL_FALSE) { 501190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* COLOR-INDEXED WINDOW: not supported*/ 502190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return GL_FALSE; 503190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 504190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer else { 505190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* RGB WINDOW: 506190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * We support RGB rendering into almost any kind of visual. 507190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 508190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer const int xclass = v->mesa_visual.visualType; 509190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (xclass != GLX_TRUE_COLOR && xclass == !GLX_DIRECT_COLOR) { 510190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer _mesa_warning(NULL, 511190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer "XMesa: RGB mode rendering not supported in given visual.\n"); 512190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return GL_FALSE; 513190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 514190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->mesa_visual.indexBits = 0; 515190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 516190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (v->BitsPerPixel == 32) { 517190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* We use XImages for all front/back buffers. If an X Window or 518190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * X Pixmap is 32bpp, there's no guarantee that the alpha channel 519190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * will be preserved. For XImages we're in luck. 520190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 521190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->mesa_visual.alphaBits = 8; 522190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 523190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 524190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 525190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* 526190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * If MESA_INFO env var is set print out some debugging info 527190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * which can help Brian figure out what's going on when a user 528190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * reports bugs. 529190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 530190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (_mesa_getenv("MESA_INFO")) { 531190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer printf("X/Mesa visual = %p\n", (void *) v); 532190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer printf("X/Mesa level = %d\n", v->mesa_visual.level); 533190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer printf("X/Mesa depth = %d\n", v->visinfo->depth); 534190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 535190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 536190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 537190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return GL_TRUE; 538190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 539190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 54057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 54157240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer 542190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#define NUM_VISUAL_TYPES 6 543190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 544190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 54557240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * Convert an X visual type to a GLX visual type. 54657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * 547190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.) 548190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * to be converted. 549190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \return If \c visualType is a valid X visual type, a GLX visual type will 550190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * be returned. Otherwise \c GLX_NONE will be returned. 551190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * 552190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \note 553190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the 554190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * DRI CVS tree. 555190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 556190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerstatic GLint 557190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerxmesa_convert_from_x_visual_type( int visualType ) 558190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 559190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer static const int glx_visual_types[ NUM_VISUAL_TYPES ] = { 560190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GLX_STATIC_GRAY, GLX_GRAY_SCALE, 561190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 562190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GLX_TRUE_COLOR, GLX_DIRECT_COLOR 563190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer }; 564190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 565190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return ( (unsigned) visualType < NUM_VISUAL_TYPES ) 566190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer ? glx_visual_types[ visualType ] : GLX_NONE; 567190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 568190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 569190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 570190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/**********************************************************************/ 571190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/***** Public Functions *****/ 572190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/**********************************************************************/ 573190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 574190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 575190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/* 576190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Create a new X/Mesa visual. 577190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Input: display - X11 display 578190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * visinfo - an XVisualInfo pointer 579190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * rgb_flag - GL_TRUE = RGB mode, 580190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * GL_FALSE = color index mode 581190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * alpha_flag - alpha buffer requested? 582190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * db_flag - GL_TRUE = double-buffered, 583190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * GL_FALSE = single buffered 58457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * stereo_flag - stereo visual? 585190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * ximage_flag - GL_TRUE = use an XImage for back buffer, 58657240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * GL_FALSE = use an off-screen pixmap for back buffer 587190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * depth_size - requested bits/depth values, or zero 588190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * stencil_size - requested bits/stencil values, or zero 589190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * accum_red_size - requested bits/red accum values, or zero 590190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * accum_green_size - requested bits/green accum values, or zero 591190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * accum_blue_size - requested bits/blue accum values, or zero 592190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * accum_alpha_size - requested bits/alpha accum values, or zero 593190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * num_samples - number of samples/pixel if multisampling, or zero 594190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * level - visual level, usually 0 5957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * visualCaveat - ala the GLX extension, usually GLX_NONE 5967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Return; a new XMesaVisual or 0 if error. 5977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 5987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanPUBLIC 5997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanXMesaVisual XMesaCreateVisual( Display *display, 6007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XVisualInfo * visinfo, 6017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLboolean rgb_flag, 6027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLboolean alpha_flag, 6037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLboolean db_flag, 6047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLboolean stereo_flag, 6057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLboolean ximage_flag, 6067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint depth_size, 60757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer GLint stencil_size, 6087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint accum_red_size, 6097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint accum_green_size, 6107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint accum_blue_size, 6117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint accum_alpha_size, 6127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint num_samples, 6137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint level, 6147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint visualCaveat ) 6157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 6167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaDisplay xmdpy = xmesa_init_display(display); 6177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaVisual v; 6187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman GLint red_bits, green_bits, blue_bits, alpha_bits; 6197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!xmdpy) 6217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return NULL; 6227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* For debugging only */ 6247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (_mesa_getenv("MESA_XSYNC")) { 625190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* This makes debugging X easier. 626190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * In your debugger, set a breakpoint on _XError to stop when an 627190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * X protocol error is generated. 6287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 6297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XSynchronize( display, 1 ); 6307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 6337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!v) { 6347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return NULL; 6357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->display = display; 6387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* Save a copy of the XVisualInfo struct because the user may Xfree() 6407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * the struct but we may need some of the information contained in it 6417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * at a later time. 6427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 6437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 644190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!v->visinfo) { 645190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer free(v); 6467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return NULL; 647e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer } 6487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman memcpy(v->visinfo, visinfo, sizeof(*visinfo)); 6497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->ximage_flag = ximage_flag; 6517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 652190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->mesa_visual.redMask = visinfo->red_mask; 653190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->mesa_visual.greenMask = visinfo->green_mask; 6547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->mesa_visual.blueMask = visinfo->blue_mask; 6557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->mesa_visual.visualID = visinfo->visualid; 6567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->mesa_visual.screen = visinfo->screen; 6577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#if !(defined(__cplusplus) || defined(c_plusplus)) 6597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class); 6607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman#else 6617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class); 662190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer#endif 663190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 664190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->mesa_visual.visualRating = visualCaveat; 6657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (alpha_flag) 6677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->mesa_visual.alphaBits = 8; 6687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (void) initialize_visual_and_buffer( v, NULL, rgb_flag, 0, 0 ); 6707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman { 6727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const int xclass = v->mesa_visual.visualType; 6737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 6747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman red_bits = _mesa_bitcount(GET_REDMASK(v)); 6757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman green_bits = _mesa_bitcount(GET_GREENMASK(v)); 6767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman blue_bits = _mesa_bitcount(GET_BLUEMASK(v)); 6777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 6787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman else { 6797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* this is an approximation */ 6807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman int depth; 6817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman depth = v->visinfo->depth; 6827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman red_bits = depth / 3; 6837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman depth -= red_bits; 6847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman green_bits = depth / 2; 6857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman depth -= green_bits; 686190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer blue_bits = depth; 687190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer alpha_bits = 0; 688190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer assert( red_bits + green_bits + blue_bits == v->visinfo->depth ); 68957240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 690190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer alpha_bits = v->mesa_visual.alphaBits; 691190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 692190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 693190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer _mesa_initialize_visual( &v->mesa_visual, 694190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer db_flag, stereo_flag, 695190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer red_bits, green_bits, 696190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer blue_bits, alpha_bits, 697190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer depth_size, 698190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer stencil_size, 699190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer accum_red_size, accum_green_size, 700190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer accum_blue_size, accum_alpha_size, 701190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 0 ); 702190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 703190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.buffer_mask = ST_ATTACHMENT_FRONT_LEFT_MASK; 704190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (db_flag) 705190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK; 706190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (stereo_flag) { 707190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK; 708190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (db_flag) 709190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK; 710190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 711190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 712190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.color_format = choose_pixel_format(v); 713190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.depth_stencil_format = 714190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer choose_depth_stencil_format(xmdpy, depth_size, stencil_size); 715190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 716190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.accum_format = (accum_red_size + 717190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer accum_green_size + accum_blue_size + accum_alpha_size) ? 718190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE; 719190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 720190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.samples = num_samples; 721190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->stvis.render_buffer = ST_ATTACHMENT_INVALID; 722190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 723190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* XXX minor hack */ 724190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->mesa_visual.level = level; 725190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return v; 726190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 727190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 728190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 729190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerPUBLIC 730190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid XMesaDestroyVisual( XMesaVisual v ) 731190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 732190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer free(v->visinfo); 733190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer free(v); 734190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 735190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 736190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 737190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 738190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Do per-display initializations. 739190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 740190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid 741190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerxmesa_init( Display *display ) 742190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 743190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_init_display(display); 744190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 745190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 746190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 747190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 748190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Create a new XMesaContext. 749190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param v the XMesaVisual 75057240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer * \param share_list another XMesaContext with which to share display 751190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * lists or NULL if no sharing is wanted. 752190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \return an XMesaContext or NULL if error. 75357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer */ 75457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin KramerPUBLIC 755190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) 756190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 757190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaDisplay xmdpy = xmesa_init_display(v->display); 758190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaContext c; 759190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 760190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!xmdpy) 761190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 762190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 763190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */ 764190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 765190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!c) 766190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 767190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 768190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c->xm_visual = v; 769190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 770190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c->xm_read_buffer = NULL; 771190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 772190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c->st = stapi->create_context(stapi, xmdpy->smapi, 773190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer &v->stvis, (share_list) ? share_list->st : NULL); 774190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (c->st == NULL) 775190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer goto fail; 776190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 777190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c->st->st_manager_private = (void *) c; 778190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 779190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return c; 780190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 781190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerfail: 782190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (c->st) 783190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c->st->destroy(c->st); 784190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 785190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer free(c); 786190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 787190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 788190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 789190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 790190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 791190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerPUBLIC 792190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid XMesaDestroyContext( XMesaContext c ) 793190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 794190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c->st->destroy(c->st); 795190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 796190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* FIXME: We should destroy the screen here, but if we do so, surfaces may 797190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * outlive it, causing segfaults 798190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer struct pipe_screen *screen = c->st->pipe->screen; 799190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer screen->destroy(screen); 800190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 801190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 802190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer free(c); 80357240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer} 804190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 805190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 806190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 80757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer/** 808190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Private function for creating an XMesaBuffer which corresponds to an 809190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * X window or pixmap. 810190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param v the window's XMesaVisual 811190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param w the window we're wrapping 812190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \return new XMesaBuffer or NULL if error 813190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 814190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerPUBLIC XMesaBuffer 815190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaCreateWindowBuffer(XMesaVisual v, Window w) 816190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 817190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XWindowAttributes attr; 818190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaBuffer b; 819190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer Colormap cmap; 820190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer int depth; 8217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman assert(v); 8237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman assert(w); 8247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* Check that window depth matches visual depth */ 8267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XGetWindowAttributes( v->display, w, &attr ); 8277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman depth = attr.depth; 8287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (v->visinfo->depth != depth) { 8297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 8307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman v->visinfo->depth, depth); 8317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return NULL; 8327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 8337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* Find colormap */ 8357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (attr.colormap) { 8367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman cmap = attr.colormap; 8377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 8387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman else { 8397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 8407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* this is weird, a window w/out a colormap!? */ 8417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* OK, let's just allocate a new one and hope for the best */ 8427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 8437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 8447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b = create_xmesa_buffer((Drawable) w, WINDOW, v, cmap); 8467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!b) 8477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return NULL; 8487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 8497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode, 8507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (Drawable) w, cmap )) { 8517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman xmesa_free_buffer(b); 852190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 853190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 854190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 855190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return b; 856190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 857190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 858190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 859190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 860190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 861190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Create a new XMesaBuffer from an X pixmap. 862190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * 863190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param v the XMesaVisual 864190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param p the pixmap 865190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or 866190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \c GLX_DIRECT_COLOR visual for the pixmap 867190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * \returns new XMesaBuffer or NULL if error 868190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 869190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerPUBLIC XMesaBuffer 870190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaCreatePixmapBuffer(XMesaVisual v, Pixmap p, Colormap cmap) 871190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 872190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaBuffer b; 873190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 874190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer assert(v); 875190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 876190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer b = create_xmesa_buffer((Drawable) p, PIXMAP, v, cmap); 877190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!b) 878190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 879190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 880190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 881190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer (Drawable) p, cmap)) { 882190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_free_buffer(b); 883190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 884190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 885190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 886190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return b; 887190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 888190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 889190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 890190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 891190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * For GLX_EXT_texture_from_pixmap 892190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 893190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaBuffer 894190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaCreatePixmapTextureBuffer(XMesaVisual v, Pixmap p, 895190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer Colormap cmap, 896190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer int format, int target, int mipmap) 897190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 898190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer GET_CURRENT_CONTEXT(ctx); 899190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaBuffer b; 900190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 901190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer assert(v); 902190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 903190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer b = create_xmesa_buffer((Drawable) p, PIXMAP, v, cmap); 904190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!b) 905190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 906190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 907190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* get pixmap size */ 908190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_get_window_size(v->display, b, &b->width, &b->height); 909190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 910190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (target == 0) { 911190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* examine dims */ 912190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (ctx->Extensions.ARB_texture_non_power_of_two) { 913190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer target = GLX_TEXTURE_2D_EXT; 914190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 915190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer else if ( _mesa_bitcount(b->width) == 1 916190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer && _mesa_bitcount(b->height) == 1) { 917190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* power of two size */ 918190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (b->height == 1) { 919190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer target = GLX_TEXTURE_1D_EXT; 920190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 921190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer else { 922190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer target = GLX_TEXTURE_2D_EXT; 923190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 924190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 925190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer else if (ctx->Extensions.NV_texture_rectangle) { 926190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer target = GLX_TEXTURE_RECTANGLE_EXT; 92757240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer } 928190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer else { 929190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* non power of two textures not supported */ 930190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaDestroyBuffer(b); 931190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return 0; 932190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 933190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 934190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 935190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer b->TextureTarget = target; 936190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer b->TextureFormat = format; 937190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer b->TextureMipmap = mipmap; 938190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 939190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 940190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer (Drawable) p, cmap)) { 941190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_free_buffer(b); 942190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 943190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 944190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 945190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return b; 946190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 947190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 948190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 949190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 950190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaBuffer 951190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaCreatePBuffer(XMesaVisual v, Colormap cmap, 952190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer unsigned int width, unsigned int height) 953190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 954190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer Window root; 955190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer Drawable drawable; /* X Pixmap Drawable */ 956190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaBuffer b; 957190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 958190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* allocate pixmap for front buffer */ 959190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer root = RootWindow( v->display, v->visinfo->screen ); 960190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer drawable = XCreatePixmap(v->display, root, width, height, 961190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer v->visinfo->depth); 962190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!drawable) 963190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 964190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 965190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); 966190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!b) 967190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 968190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 969190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 970190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer drawable, cmap)) { 971190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_free_buffer(b); 972190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 973190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 974190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 975190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return b; 976190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 977190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 978190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 979190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 980190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/* 981190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Deallocate an XMesaBuffer structure and all related info. 982190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 983190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerPUBLIC void 984190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaDestroyBuffer(XMesaBuffer b) 985190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 986190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_free_buffer(b); 987190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 988190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 989190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 990190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 991190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Query the current drawable size and notify the binding context. 992190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 993190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid 994190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerxmesa_check_buffer_size(XMesaBuffer b) 995190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 996190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaContext xmctx = XMesaGetCurrentContext(); 997190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 998190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (b->type == PBUFFER) 999190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return; 1000190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1001190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_get_window_size(b->xm_visual->display, b, &b->width, &b->height); 1002190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (xmctx && xmctx->xm_buffer == b) 1003190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb); 1004190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 10057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/* 10087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Bind buffer b to context c and make c the current rendering context. 10097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 10107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanPUBLIC 10117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 10127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaBuffer readBuffer ) 10137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 101457240ff6e2252f8986f6e47e4010bc52fbae25d1Benjamin Kramer XMesaContext old_ctx = XMesaGetCurrentContext(); 10157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (old_ctx && old_ctx != c) { 10177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaFlush(old_ctx); 10187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman old_ctx->xm_buffer = NULL; 10197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman old_ctx->xm_read_buffer = NULL; 10207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 10217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (c) { 10237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!drawBuffer || !readBuffer) 10247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return GL_FALSE; /* must specify buffers! */ 10257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (c == old_ctx && 10277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman c->xm_buffer == drawBuffer && 10287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman c->xm_read_buffer == readBuffer) 10297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return GL_TRUE; 10307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman xmesa_check_buffer_size(drawBuffer); 10327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (readBuffer != drawBuffer) 10337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman xmesa_check_buffer_size(readBuffer); 10347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman c->xm_buffer = drawBuffer; 10367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman c->xm_read_buffer = readBuffer; 10377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman stapi->make_current(stapi, c->st, drawBuffer->stfb, readBuffer->stfb); 10397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 1041190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer drawBuffer->wasCurrent = GL_TRUE; 1042190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 1043190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer else { 1044e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer /* Detach */ 10457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman stapi->make_current(stapi, NULL, NULL, NULL); 10467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1047190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 1048190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return GL_TRUE; 10497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 10507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 10517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1052190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/* 1053190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Unbind the context c from its buffer. 1054190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 1055190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerGLboolean XMesaUnbindContext( XMesaContext c ) 1056190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 1057190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer /* A no-op for XFree86 integration purposes */ 1058190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return GL_TRUE; 1059190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 1060190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1061190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1062190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaContext XMesaGetCurrentContext( void ) 1063190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 1064190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer struct st_context_iface *st = stapi->get_current(stapi); 1065190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return (XMesaContext) (st) ? st->st_manager_private : NULL; 1066190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 1067190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1068190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1069190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1070190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 1071190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Swap front and back color buffers and have winsys display front buffer. 1072190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * If there's no front color buffer no swap actually occurs. 1073190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 1074190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerPUBLIC 1075190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid XMesaSwapBuffers( XMesaBuffer b ) 1076190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 1077190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaContext xmctx = XMesaGetCurrentContext(); 1078190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1079190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (xmctx && xmctx->xm_buffer == b) { 1080190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmctx->st->flush( xmctx->st, 1081190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer PIPE_FLUSH_RENDER_CACHE | 1082190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer PIPE_FLUSH_SWAPBUFFERS | 1083190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer PIPE_FLUSH_FRAME, 1084190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer NULL); 1085190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 1086190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1087190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_swap_st_framebuffer(b->stfb); 1088190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 1089190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1090190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1091190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1092190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/* 1093190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer * Copy sub-region of back buffer to front buffer 1094190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 1095190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 1096190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 1097190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmesa_copy_st_framebuffer(b->stfb, 1098190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer ST_ATTACHMENT_BACK_LEFT, ST_ATTACHMENT_FRONT_LEFT, 1099190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer x, y, width, height); 1100190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 1101190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1102190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1103190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1104190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid XMesaFlush( XMesaContext c ) 1105190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 1106190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (c && c->xm_visual->display) { 1107190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaDisplay xmdpy = xmesa_init_display(c->xm_visual->display); 1108190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer struct pipe_fence_handle *fence = NULL; 1109190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1110190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer c->st->flush(c->st, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence); 1111190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (fence) { 1112190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmdpy->screen->fence_finish(xmdpy->screen, fence, 0); 1113190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer xmdpy->screen->fence_reference(xmdpy->screen, &fence, NULL); 1114190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 1115190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XSync( c->xm_visual->display, False ); 1116190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer } 1117190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 1118190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1119190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1120190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1121190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1122190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1123190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin KramerXMesaBuffer XMesaFindBuffer( Display *dpy, Drawable d ) 1124190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 1125190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaBuffer b; 1126190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer for (b = XMesaBufferList; b; b = b->Next) { 1127190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer if (b->ws.drawable == d && b->xm_visual->display == dpy) { 11287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return b; 11297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 11307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 1131190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer return NULL; 1132190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer} 1133190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1134190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1135190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer/** 11367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Free/destroy all XMesaBuffers associated with given display. 1137190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer */ 1138190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramervoid xmesa_destroy_buffers_on_display(Display *dpy) 1139190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer{ 1140190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer XMesaBuffer b, next; 1141190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer for (b = XMesaBufferList; b; b = next) { 11427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman next = b->Next; 11437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (b->xm_visual->display == dpy) { 11447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman xmesa_free_buffer(b); 11457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 11467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 11477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 11487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/* 11517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Look for XMesaBuffers whose X window has been destroyed. 11527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman * Deallocate any such XMesaBuffers. 11537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman */ 11547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanvoid XMesaGarbageCollect( void ) 11557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 11567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaBuffer b, next; 11577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman for (b=XMesaBufferList; b; b=next) { 11587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman next = b->Next; 11597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (b->xm_visual && 11607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->xm_visual->display && 11617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->ws.drawable && 11627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman b->type == WINDOW) { 11637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XSync(b->xm_visual->display, False); 11647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (!window_exists( b->xm_visual->display, b->ws.drawable )) { 11657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman /* found a dead window, free the ancillary info */ 11667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman XMesaDestroyBuffer( b ); 11677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 11687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 11697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 11707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 11717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanPUBLIC void 11767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanXMesaBindTexImage(Display *dpy, XMesaBuffer drawable, int buffer, 11777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman const int *attrib_list) 11787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 11797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 11807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanPUBLIC void 11847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanXMesaReleaseTexImage(Display *dpy, XMesaBuffer drawable, int buffer) 11857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 11867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 11877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 11897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanvoid 11907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanXMesaCopyContext(XMesaContext src, XMesaContext dst, unsigned long mask) 11917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman{ 11927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman if (dst->st->copy) 11937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman dst->st->copy(dst->st, src->st, mask); 11947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 11957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman