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