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