xm_api.c revision 31aca27c08d6a385c595d34fe4ee06390bf5b0e8
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Mesa 3-D graphics library
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Version:  7.1
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
7971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com * Permission is hereby granted, free of charge, to any person obtaining a
8b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com * copy of this software and associated documentation files (the "Software"),
97bc13a62609149f0b535c2f3ff7210eb834d8b36epoger@google.com * to deal in the Software without restriction, including without limitation
107361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com * and/or sell copies of the Software, and to permit persons to whom the
12b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com * Software is furnished to do so, subject to the following conditions:
138a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com *
144370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * The above copyright notice and this permission notice shall be included
15971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com * in all copies or substantial portions of the Software.
165af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *
17971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
198015dd83ae37147bb630d4751030868051ad0caereed@android.com * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
208015dd83ae37147bb630d4751030868051ad0caereed@android.com * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
218015dd83ae37147bb630d4751030868051ad0caereed@android.com * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
229875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
230770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com */
240770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com
2510afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org/**
2610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org * \file xm_api.c
278923c6cfd580ac9accb11b909fa2a033d69553aareed@google.com *
288923c6cfd580ac9accb11b909fa2a033d69553aareed@google.com * All the XMesa* API functions.
290770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com *
309875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com *
319875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * NOTES:
320770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com *
3300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * The window coordinate system origin (0,0) is in the lower-left corner
34e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com * of the window.  X11's window coordinate origin is in the upper-left
35e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com * corner of the window.  Therefore, most drawing functions in this
36e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com * file have to flip Y coordinates.
37b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com *
38b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com *
39b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com * Byte swapping:  If the Mesa host and the X display use a different
40b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com * byte order then there's some trickiness to be aware of when using
4146cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * XImages.  The byte ordering used for the XImage is that of the X
4246cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * display, not the Mesa host.
430a09eef79053f93a9b2311c6a29275abf39f189ebsalomon@google.com * The color-to-pixel encoding for True/DirectColor must be done
4446cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * according to the display's visual red_mask, green_mask, and blue_mask.
450a09eef79053f93a9b2311c6a29275abf39f189ebsalomon@google.com * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
4646cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * do byte swapping if needed.  If one wants to directly "poke" the pixel
4746cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * into the XImage's buffer then the pixel must be byte swapped first.
48c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com *
49c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com */
50c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
51c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com#ifdef __CYGWIN__
52c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com#undef WIN32
53c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com#undef __WIN32__
54c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com#endif
55c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
56e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com#include "xm_api.h"
57e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com#include "xm_st.h"
58e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com
5900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#include "pipe/p_defines.h"
6000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#include "pipe/p_screen.h"
6100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#include "pipe/p_context.h"
6200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com
6300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#include "xm_public.h"
643914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com#include <GL/glx.h>
653914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com
663914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com
673914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com/* Driver interface routines, set up by xlib backend on library
68dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com * _init().  These are global in the same way that function names are
6900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * global.
70d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com */
71dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comstatic struct xm_driver driver;
7200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comstatic struct st_api *stapi;
73dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
7400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com/* Default strict invalidate to false.  This means we will not call
75dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com * XGetGeometry after every swapbuffers, which allows swapbuffers to
7600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * remain asynchronous.  For apps running at 100fps with synchronous
7700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * swapping, a 10% boost is typical.  For gears, I see closer to 20%
7800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * speedup.
79d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com *
8000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * Note that the work of copying data on swapbuffers doesn't disappear
81dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com * - this change just allows the X server to execute the PutImage
8200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * asynchronously without us effectively blocked until its completion.
8300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com *
8400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * This speeds up even llvmpipe's threaded rasterization as the
8500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * swapbuffers operation was a large part of the serial component of
8600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * an llvmpipe frame.
8700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com *
8800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * The downside of this is correctness - applications which don't call
89d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com * glViewport on window resizes will get incorrect rendering.  A
9000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * better solution would be to have per-frame but asynchronous
9100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * invalidation.  Xcb almost looks as if it could provide this, but
9200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * the API doesn't seem to quite be there.
9300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com */
948015dd83ae37147bb630d4751030868051ad0caereed@android.comboolean xmesa_strict_invalidate = FALSE;
958015dd83ae37147bb630d4751030868051ad0caereed@android.com
968015dd83ae37147bb630d4751030868051ad0caereed@android.comvoid xmesa_set_driver( const struct xm_driver *templ )
978015dd83ae37147bb630d4751030868051ad0caereed@android.com{
988015dd83ae37147bb630d4751030868051ad0caereed@android.com   driver = *templ;
998015dd83ae37147bb630d4751030868051ad0caereed@android.com   stapi = driver.create_st_api();
1009875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
1019875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   xmesa_strict_invalidate =
1029875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      debug_get_bool_option("XMESA_STRICT_INVALIDATE", FALSE);
1039875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com}
1048015dd83ae37147bb630d4751030868051ad0caereed@android.com
1059875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
1069875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com/*
10700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com * XXX replace this with a linked list, or better yet, try to attach the
1089875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * gallium/mesa extra bits to the X Display object with XAddExtension().
1099875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com */
1100770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com#define MAX_DISPLAYS 10
1118015dd83ae37147bb630d4751030868051ad0caereed@android.comstatic struct xmesa_display Displays[MAX_DISPLAYS];
1128015dd83ae37147bb630d4751030868051ad0caereed@android.comstatic int NumDisplays = 0;
1138015dd83ae37147bb630d4751030868051ad0caereed@android.com
114b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.comstatic int
115b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.comxmesa_get_param(struct st_manager *smapi,
116b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com                enum st_manager_param param)
117b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com{
118b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   switch(param) {
119b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   case ST_MANAGER_BROKEN_INVALIDATE:
120b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com      return !xmesa_strict_invalidate;
121b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   default:
122b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com      return 0;
123b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   }
124b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com}
125b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com
126b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.comstatic XMesaDisplay
127b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.comxmesa_init_display( Display *display )
128b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com{
129b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   pipe_static_mutex(init_mutex);
130b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   XMesaDisplay xmdpy;
131b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   int i;
132b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com
133b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   pipe_mutex_lock(init_mutex);
134b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com
1353d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   /* Look for XMesaDisplay which corresponds to 'display' */
1369875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   for (i = 0; i < NumDisplays; i++) {
1379875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      if (Displays[i].display == display) {
1389875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         /* Found it */
1399875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         pipe_mutex_unlock(init_mutex);
1403d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com         return &Displays[i];
1413d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com      }
1423d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   }
1439875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
1449875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   /* Create new XMesaDisplay */
1453d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com
1463d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   assert(NumDisplays < MAX_DISPLAYS);
1473d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   xmdpy = &Displays[NumDisplays];
1483d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   NumDisplays++;
1493d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com
1503d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   if (!xmdpy->display && display) {
1513d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com      xmdpy->display = display;
1529875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      xmdpy->screen = driver.create_pipe_screen(display);
1539875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      xmdpy->smapi = CALLOC_STRUCT(st_manager);
1549875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      if (xmdpy->smapi) {
1559875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         xmdpy->smapi->screen = xmdpy->screen;
1569875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         xmdpy->smapi->get_param = xmesa_get_param;
1579875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      }
1589875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
1593d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com      if (xmdpy->screen && xmdpy->smapi) {
1603d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com         pipe_mutex_init(xmdpy->mutex);
161c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      }
162c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      else {
163c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         if (xmdpy->screen) {
164c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com            xmdpy->screen->destroy(xmdpy->screen);
165b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com            xmdpy->screen = NULL;
166b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com         }
167b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com         if (xmdpy->smapi) {
168b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com            FREE(xmdpy->smapi);
169b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com            xmdpy->smapi = NULL;
170b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com         }
171cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com
172cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com         xmdpy->display = NULL;
173cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com      }
174cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com   }
175cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com   if (!xmdpy->display || xmdpy->display != display)
176cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com      xmdpy = NULL;
177b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com
178b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   pipe_mutex_unlock(init_mutex);
179cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com
180b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   return xmdpy;
181b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com}
182b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com
183cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com/**********************************************************************/
184ea325437bd5a9996422b640087b64742363e5b55tomhudson@google.com/*****                     X Utility Functions                    *****/
185ea325437bd5a9996422b640087b64742363e5b55tomhudson@google.com/**********************************************************************/
186ea325437bd5a9996422b640087b64742363e5b55tomhudson@google.com
187cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com
188c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com/**
189b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com * Return the host's byte order as LSBFirst or MSBFirst ala X.
190b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com */
191b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.comstatic int host_byte_order( void )
192cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com{
193b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   int i = 1;
194b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   char *cptr = (char *) &i;
195b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com   return (*cptr==1) ? LSBFirst : MSBFirst;
196cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com}
197b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com
198b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com
199ea325437bd5a9996422b640087b64742363e5b55tomhudson@google.com
200ea325437bd5a9996422b640087b64742363e5b55tomhudson@google.com
201ea325437bd5a9996422b640087b64742363e5b55tomhudson@google.com/**
2023d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com * Return the true number of bits per pixel for XImages.
2039875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * For example, if we request a 24-bit deep visual we may actually need/get
2049875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * 32bpp XImages.  This function returns the appropriate bpp.
2059875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * Input:  dpy - the X display
206cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com *         visinfo - desribes the visual to be used for XImages
2079875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * Return:  true number of bits per pixel for XImages
208c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com */
209b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.comstatic int
210b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.combits_per_pixel( XMesaVisual xmv )
211b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com{
2123d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   Display *dpy = xmv->display;
2139875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   XVisualInfo * visinfo = xmv->visinfo;
214c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   XImage *img;
2158015dd83ae37147bb630d4751030868051ad0caereed@android.com   int bitsPerPixel;
21600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com   /* Create a temporary XImage */
217b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
218b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com		       ZPixmap, 0,           /*format, offset*/
219686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org		       (char*) MALLOC(8),    /*data*/
220b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com		       1, 1,                 /*width, height*/
2218a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com		       32,                   /*bitmap_pad*/
2220770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com		       0                     /*bytes_per_line*/
2230770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com                     );
224686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org   assert(img);
225686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org   /* grab the bits/pixel value */
226686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org   bitsPerPixel = img->bits_per_pixel;
227686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org   /* free the XImage */
228b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   free( img->data );
229686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org   img->data = NULL;
230686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org   XDestroyImage( img );
2317361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   return bitsPerPixel;
2327361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com}
2337361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
2347361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
2357361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
2367361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com/*
2377361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com * Determine if a given X window ID is valid (window exists).
2387361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com * Do this by calling XGetWindowAttributes() for the window and
2397361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com * checking if we catch an X error.
2409875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * Input:  dpy - the display
2417361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com *         win - the window to check for existance
2427361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com * Return:  GL_TRUE - window exists
2437361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com *          GL_FALSE - window doesn't exist
2447361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com */
2457361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.comstatic GLboolean WindowExistsFlag;
2467361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
2479875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comstatic int window_exists_err_handler( Display* dpy, XErrorEvent* xerr )
2489875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com{
2499875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   (void) dpy;
2509875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   if (xerr->error_code == BadWindow) {
2519875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      WindowExistsFlag = GL_FALSE;
2529875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   }
2539875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   return 0;
2549875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com}
2559875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
2569875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comstatic GLboolean window_exists( Display *dpy, Window win )
2579875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com{
2589875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   XWindowAttributes wa;
2599875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   int (*old_handler)( Display*, XErrorEvent* );
2609875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   WindowExistsFlag = GL_TRUE;
2619875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   old_handler = XSetErrorHandler(window_exists_err_handler);
26210afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
26310afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   XSetErrorHandler(old_handler);
26410afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   return WindowExistsFlag;
26510afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org}
26610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org
26710afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.orgstatic Status
26810afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.orgget_drawable_size( Display *dpy, Drawable d, uint *width, uint *height )
26910afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org{
27010afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   Window root;
27110afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   Status stat;
27210afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   int xpos, ypos;
27310afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   unsigned int w, h, bw, depth;
27410afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth);
27510afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   *width = w;
27610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   *height = h;
27710afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   return stat;
27810afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org}
27979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
28079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
28179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org/**
28279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org * Return the size of the window (or pixmap) that corresponds to the
28310afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org * given XMesaBuffer.
28410afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org * \param width  returns width in pixels
28510afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org * \param height  returns height in pixels
28610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org */
28710afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.orgvoid
288c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.comxmesa_get_window_size(Display *dpy, XMesaBuffer b,
289c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com                      GLuint *width, GLuint *height)
290c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com{
2914370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   XMesaDisplay xmdpy = xmesa_init_display(dpy);
2924370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   Status stat;
2939875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
294cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com   pipe_mutex_lock(xmdpy->mutex);
2959875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   stat = get_drawable_size(dpy, b->ws.drawable, width, height);
2969875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   pipe_mutex_unlock(xmdpy->mutex);
2974370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
2984370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   if (!stat) {
2994370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      /* probably querying a window that's recently been destroyed */
3004370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      _mesa_warning(NULL, "XGetGeometry failed!\n");
3014370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      *width = *height = 1;
3024370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   }
3034370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
3044370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
3054370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#define GET_REDMASK(__v)        __v->mesa_visual.redMask
306bf6c1e4aff4d233f6502157fb73459cf69d0ab37junov@chromium.org#define GET_GREENMASK(__v)      __v->mesa_visual.greenMask
3079875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com#define GET_BLUEMASK(__v)       __v->mesa_visual.blueMask
3089875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
309c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
3109875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com/**
3114370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * Choose the pixel format for the given visual.
3124370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * This will tell the gallium driver how to pack pixel data into
3134370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * drawing surfaces.
3144370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com */
3154370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comstatic GLuint
3164370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comchoose_pixel_format(XMesaVisual v)
3174370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com{
3184370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   boolean native_byte_order = (host_byte_order() ==
3194370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                ImageByteOrder(v->display));
320af951c9bc4cbb6e60b430194fe5127ebe99c53fbreed@google.com
321af951c9bc4cbb6e60b430194fe5127ebe99c53fbreed@google.com   if (   GET_REDMASK(v)   == 0x0000ff
322cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com       && GET_GREENMASK(v) == 0x00ff00
323c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com       && GET_BLUEMASK(v)  == 0xff0000
324c69809745e6496564639e42ef998ad39adf7dfb8bsalomon@google.com       && v->BitsPerPixel == 32) {
3254370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      if (native_byte_order) {
3269875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         /* no byteswapping needed */
327c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         return PIPE_FORMAT_R8G8B8A8_UNORM;
3289875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      }
3299875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      else {
3309875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         return PIPE_FORMAT_A8B8G8R8_UNORM;
3319875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      }
3329875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   }
3339875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   else if (   GET_REDMASK(v)   == 0xff0000
3349875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com            && GET_GREENMASK(v) == 0x00ff00
33510afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org            && GET_BLUEMASK(v)  == 0x0000ff
3369875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com            && v->BitsPerPixel == 32) {
3379875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      if (native_byte_order) {
3389875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         /* no byteswapping needed */
3399875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         return PIPE_FORMAT_B8G8R8A8_UNORM;
3409875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      }
34179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org      else {
34279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org         return PIPE_FORMAT_A8R8G8B8_UNORM;
34379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org      }
34479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org   }
34579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org   else if (   GET_REDMASK(v)   == 0x0000ff00
34679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org            && GET_GREENMASK(v) == 0x00ff0000
34779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org            && GET_BLUEMASK(v)  == 0xff000000
34879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org            && v->BitsPerPixel == 32) {
34979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org      if (native_byte_order) {
35079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org         /* no byteswapping needed */
35179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org         return PIPE_FORMAT_A8R8G8B8_UNORM;
35279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org      }
35379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org      else {
35479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org         return PIPE_FORMAT_B8G8R8A8_UNORM;
35579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org      }
35679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org   }
3579875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   else if (   GET_REDMASK(v)   == 0xf800
3589875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com            && GET_GREENMASK(v) == 0x07e0
3599875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com            && GET_BLUEMASK(v)  == 0x001f
36079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org            && native_byte_order
3619875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com            && v->BitsPerPixel == 16) {
3629875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      /* 5-6-5 RGB */
3639875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      return PIPE_FORMAT_B5G6R5_UNORM;
3649875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   }
3659875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
3669875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   return PIPE_FORMAT_NONE;
3679875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com}
368b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com
369b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com
370b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com/**
371b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com * Choose a depth/stencil format that satisfies the given depth and
372b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com * stencil sizes.
373b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com */
374dc9a695a62ffe0f18e2835bffd325b60b64b547bbungeman@google.comstatic enum pipe_format
375dc9a695a62ffe0f18e2835bffd325b60b64b547bbungeman@google.comchoose_depth_stencil_format(XMesaDisplay xmdpy, int depth, int stencil)
376dc9a695a62ffe0f18e2835bffd325b60b64b547bbungeman@google.com{
377dc9a695a62ffe0f18e2835bffd325b60b64b547bbungeman@google.com   const enum pipe_texture_target target = PIPE_TEXTURE_2D;
378dc9a695a62ffe0f18e2835bffd325b60b64b547bbungeman@google.com   const unsigned tex_usage = PIPE_BIND_DEPTH_STENCIL;
379b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   const unsigned geom_flags = (PIPE_TEXTURE_GEOM_NON_SQUARE |
380b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com                                PIPE_TEXTURE_GEOM_NON_POWER_OF_TWO);
381b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   const unsigned sample_count = 0;
382b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   enum pipe_format formats[8], fmt;
383b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   int count, i;
384b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com
385b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   count = 0;
38610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org
387b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   if (depth <= 16 && stencil == 0) {
388b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com      formats[count++] = PIPE_FORMAT_Z16_UNORM;
389b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   }
390b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   if (depth <= 24 && stencil == 0) {
391b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com      formats[count++] = PIPE_FORMAT_X8Z24_UNORM;
392b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com      formats[count++] = PIPE_FORMAT_Z24X8_UNORM;
393c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   }
394c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   if (depth <= 24 && stencil <= 8) {
395c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      formats[count++] = PIPE_FORMAT_S8_USCALED_Z24_UNORM;
396c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      formats[count++] = PIPE_FORMAT_Z24_UNORM_S8_USCALED;
397c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   }
398c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   if (depth <= 32 && stencil == 0) {
3999875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      formats[count++] = PIPE_FORMAT_Z32_UNORM;
4009875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   }
401b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com
402b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   fmt = PIPE_FORMAT_NONE;
403b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   for (i = 0; i < count; i++) {
404b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com      if (xmdpy->screen->is_format_supported(xmdpy->screen, formats[i],
405ea325437bd5a9996422b640087b64742363e5b55tomhudson@google.com                                             target, sample_count,
4069875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com                                             tex_usage, geom_flags)) {
40746cce91f4859b9c229938d4d649870c0a43b1806reed@google.com         fmt = formats[i];
40846cce91f4859b9c229938d4d649870c0a43b1806reed@google.com         break;
409ea325437bd5a9996422b640087b64742363e5b55tomhudson@google.com      }
410b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   }
411b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com
412b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com   return fmt;
413b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com}
414b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com
4159875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
416c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
417c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com/**********************************************************************/
418c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com/*****                Linked list of XMesaBuffers                 *****/
4199875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com/**********************************************************************/
420c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
4219875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comstatic XMesaBuffer XMesaBufferList = NULL;
4229875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
4239875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
424c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com/**
425c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * Allocate a new XMesaBuffer object which corresponds to the given drawable.
426c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * Note that XMesaBuffer is derived from struct gl_framebuffer.
427c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * The new XMesaBuffer will not have any size (Width=Height=0).
428c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com *
429c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * \param d  the corresponding X drawable (window or pixmap)
430cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com * \param type  either WINDOW, PIXMAP or PBUFFER, describing d
431c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * \param vis  the buffer's visual
432c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * \param cmap  the window's colormap, if known.
4338e529b794703821a85cd7de6d52d4c593299e293reed@google.com * \return new XMesaBuffer or NULL if any problem
4348e529b794703821a85cd7de6d52d4c593299e293reed@google.com */
4358e529b794703821a85cd7de6d52d4c593299e293reed@google.comstatic XMesaBuffer
4368e529b794703821a85cd7de6d52d4c593299e293reed@google.comcreate_xmesa_buffer(Drawable d, BufferType type,
437c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com                    XMesaVisual vis, Colormap cmap)
438c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com{
439cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com   XMesaDisplay xmdpy = xmesa_init_display(vis->display);
440c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   XMesaBuffer b;
441cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com   uint width, height;
442cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com
443c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER);
444c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
445c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   if (!xmdpy)
446c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      return NULL;
447c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
4489875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
4499875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   if (!b)
450c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      return NULL;
451c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
452c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->ws.drawable = d;
453c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->ws.visual = vis->visinfo->visual;
454c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->ws.depth = vis->visinfo->depth;
455c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
4569875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   b->xm_visual = vis;
457e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com   b->type = type;
458e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com   b->cmap = cmap;
459e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com
460c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   get_drawable_size(vis->display, d, &width, &height);
4619875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
4629875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   /*
4639875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com    * Create framebuffer, but we'll plug in our own renderbuffers below.
464c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com    */
465c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->stfb = xmesa_create_st_framebuffer(xmdpy, b);
466c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
467c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   /* GLX_EXT_texture_from_pixmap */
468c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->TextureTarget = 0;
469c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT;
470c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->TextureMipmap = 0;
471c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
472c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   /* insert buffer into linked list */
4739875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   b->Next = XMesaBufferList;
4749284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com   XMesaBufferList = b;
4759875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
4767361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   return b;
4779284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com}
4789284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com
4799875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
4807361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com/**
4819284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com * Find an XMesaBuffer by matching X display and colormap but NOT matching
4829284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com * the notThis buffer.
4839284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com */
4849284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.comXMesaBuffer
4859284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.comxmesa_find_buffer(Display *dpy, Colormap cmap, XMesaBuffer notThis)
4869284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com{
4879284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com   XMesaBuffer b;
4889284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com   for (b = XMesaBufferList; b; b = b->Next) {
4899284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com      if (b->xm_visual->display == dpy &&
4909875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com          b->cmap == cmap &&
4919875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com          b != notThis) {
4929875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         return b;
4939875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      }
4949875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   }
4959875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   return NULL;
49610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org}
4979875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
4989875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
4999875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com/**
5009875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * Remove buffer from linked list, delete if no longer referenced.
5019875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com */
5029875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comstatic void
5039875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comxmesa_free_buffer(XMesaBuffer buffer)
5049875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com{
5059875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   XMesaBuffer prev = NULL, b;
5069875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
5079875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   for (b = XMesaBufferList; b; b = b->Next) {
5089875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      if (b == buffer) {
5099875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         /* unlink buffer from list */
5109875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         if (prev)
5119875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com            prev->Next = buffer->Next;
5129875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         else
5139875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com            XMesaBufferList = buffer->Next;
5149875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
5159875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         /* Since the X window for the XMesaBuffer is going away, we don't
5169875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com          * want to dereference this pointer in the future.
5179875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com          */
5189875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         b->ws.drawable = 0;
5199875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
5209875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         /* XXX we should move the buffer to a delete-pending list and destroy
5219875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com          * the buffer until it is no longer current.
5229875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com          */
5239875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         xmesa_destroy_st_framebuffer(buffer->stfb);
5249875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
5259875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com         free(buffer);
5269875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
527c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         return;
528c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      }
529c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      /* continue search */
530c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      prev = b;
531c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   }
532c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   /* buffer not found in XMesaBufferList */
533c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n");
534c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com}
535b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com
5369875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
5379875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
538971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com/**********************************************************************/
539c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com/*****                   Misc Private Functions                   *****/
5404370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com/**********************************************************************/
5414370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
542c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
543c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com/**
5449875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * When a context is bound for the first time, we can finally finish
54546cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * initializing the context's visual and buffer information.
546b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com * \param v  the XMesaVisual to initialize
54746cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * \param b  the XMesaBuffer to initialize (may be NULL)
5480f1541f1c3c7393052dd54dfc32d0d32918a90aebungeman@google.com * \param rgb_flag  TRUE = RGBA mode, FALSE = color index mode
54946cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * \param window  the window/pixmap we're rendering into
55046cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * \param cmap  the colormap associated with the window/pixmap
55146cce91f4859b9c229938d4d649870c0a43b1806reed@google.com * \return GL_TRUE=success, GL_FALSE=failure
552b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com */
553b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.comstatic GLboolean
5549875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.cominitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
5558e728d7467ae29dc1a53e4d8b436f91e112a5ee9tomhudson@google.com                             GLboolean rgb_flag, Drawable window,
556b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com                             Colormap cmap)
5579875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com{
5589875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   ASSERT(!b || b->xm_visual == v);
5594370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
5604370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   /* Save true bits/pixel */
5614370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   v->BitsPerPixel = bits_per_pixel(v);
5624370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   assert(v->BitsPerPixel > 0);
5634370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
5644370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   if (rgb_flag == GL_FALSE) {
5654370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      /* COLOR-INDEXED WINDOW: not supported*/
5664370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      return GL_FALSE;
5674370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   }
5684370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   else {
5694370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      /* RGB WINDOW:
5704370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com       * We support RGB rendering into almost any kind of visual.
5714370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com       */
5724370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      const int xclass = v->visualType;
5734370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      if (xclass != GLX_TRUE_COLOR && xclass == !GLX_DIRECT_COLOR) {
5744370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com	 _mesa_warning(NULL,
5754370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com            "XMesa: RGB mode rendering not supported in given visual.\n");
5764370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com	 return GL_FALSE;
5774370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      }
5784370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      v->mesa_visual.indexBits = 0;
5794370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
5804370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      if (v->BitsPerPixel == 32) {
581c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         /* We use XImages for all front/back buffers.  If an X Window or
582c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com          * X Pixmap is 32bpp, there's no guarantee that the alpha channel
583c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com          * will be preserved.  For XImages we're in luck.
584c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com          */
585c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         v->mesa_visual.alphaBits = 8;
5869875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      }
5879875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   }
5889875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
5899875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   /*
5909875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com    * If MESA_INFO env var is set print out some debugging info
5919875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com    * which can help Brian figure out what's going on when a user
592cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com    * reports bugs.
593cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com    */
594c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   if (_mesa_getenv("MESA_INFO")) {
595c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      printf("X/Mesa visual = %p\n", (void *) v);
5969875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      printf("X/Mesa level = %d\n", v->mesa_visual.level);
5979875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      printf("X/Mesa depth = %d\n", v->visinfo->depth);
5989875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
599c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   }
600c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
601c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   return GL_TRUE;
602c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com}
603c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
6049875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
6059875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
6069875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com#define NUM_VISUAL_TYPES   6
6079875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
6089875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com/**
6099875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * Convert an X visual type to a GLX visual type.
6109875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com *
6119875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.)
612cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com *        to be converted.
613cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com * \return If \c visualType is a valid X visual type, a GLX visual type will
614c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com *         be returned.  Otherwise \c GLX_NONE will be returned.
615c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com *
6169875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * \note
6179875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the
6189875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com * DRI CVS tree.
6195af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com */
6205af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.comstatic GLint
6215af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.comxmesa_convert_from_x_visual_type( int visualType )
6225af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com{
6235af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com    static const int glx_visual_types[ NUM_VISUAL_TYPES ] = {
6245af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com	GLX_STATIC_GRAY,  GLX_GRAY_SCALE,
6255af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com	GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
6265af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com	GLX_TRUE_COLOR,   GLX_DIRECT_COLOR
6275af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com    };
6285af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
6295af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com    return ( (unsigned) visualType < NUM_VISUAL_TYPES )
6305af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com	? glx_visual_types[ visualType ] : GLX_NONE;
6315af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com}
6325af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
6335af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
6345af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com/**********************************************************************/
6355af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com/*****                       Public Functions                     *****/
6365af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com/**********************************************************************/
6375af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
6385af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
6395af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com/*
6405af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com * Create a new X/Mesa visual.
6415af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com * Input:  display - X11 display
6425af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         visinfo - an XVisualInfo pointer
6435af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         rgb_flag - GL_TRUE = RGB mode,
6445af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *                    GL_FALSE = color index mode
6455af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         alpha_flag - alpha buffer requested?
6465af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         db_flag - GL_TRUE = double-buffered,
6475af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *                   GL_FALSE = single buffered
6485af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         stereo_flag - stereo visual?
6495af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         ximage_flag - GL_TRUE = use an XImage for back buffer,
6505af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *                       GL_FALSE = use an off-screen pixmap for back buffer
6515af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         depth_size - requested bits/depth values, or zero
6525af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         stencil_size - requested bits/stencil values, or zero
6535af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         accum_red_size - requested bits/red accum values, or zero
6545af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         accum_green_size - requested bits/green accum values, or zero
6555af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         accum_blue_size - requested bits/blue accum values, or zero
6565af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         accum_alpha_size - requested bits/alpha accum values, or zero
6575af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         num_samples - number of samples/pixel if multisampling, or zero
6585af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         level - visual level, usually 0
6595af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com *         visualCaveat - ala the GLX extension, usually GLX_NONE
6605af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com * Return;  a new XMesaVisual or 0 if error.
6615af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com */
6625af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.comPUBLIC
6635af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.comXMesaVisual XMesaCreateVisual( Display *display,
6645af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               XVisualInfo * visinfo,
6655af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLboolean rgb_flag,
6665af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLboolean alpha_flag,
6675af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLboolean db_flag,
6685af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLboolean stereo_flag,
6695af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLboolean ximage_flag,
6705af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint depth_size,
6715af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint stencil_size,
6725af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint accum_red_size,
6735af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint accum_green_size,
6745af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint accum_blue_size,
6755af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint accum_alpha_size,
6765af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint num_samples,
6775af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint level,
6785af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com                               GLint visualCaveat )
6795af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com{
6805d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org   XMesaDisplay xmdpy = xmesa_init_display(display);
6815d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org   XMesaVisual v;
6825d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org   GLint red_bits, green_bits, blue_bits, alpha_bits;
6835d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org
6845d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org   if (!xmdpy)
6855d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org      return NULL;
6865d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org
6875d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org   /* For debugging only */
6885d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org   if (_mesa_getenv("MESA_XSYNC")) {
6895d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org      /* This makes debugging X easier.
6905d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org       * In your debugger, set a breakpoint on _XError to stop when an
6915d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org       * X protocol error is generated.
6925d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org       */
6935d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org      XSynchronize( display, 1 );
6945d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org   }
6955d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org
6965d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
6979875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   if (!v) {
69877e498e6ba5603b64988c3243ee97b6165147298junov@google.com      return NULL;
6998570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com   }
7005af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
701f6f123d23608a4a5fe9c812d2452039a18da7e0brobertphillips@google.com   v->display = display;
7027361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7039875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   /* Save a copy of the XVisualInfo struct because the user may Xfree()
70473fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com    * the struct but we may need some of the information contained in it
70573fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com    * at a later time.
70673fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com    */
7079875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
7088570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com   if (!v->visinfo) {
70977e498e6ba5603b64988c3243ee97b6165147298junov@google.com      free(v);
7105af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com      return NULL;
71173fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com   }
71273fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com   memcpy(v->visinfo, visinfo, sizeof(*visinfo));
71377e498e6ba5603b64988c3243ee97b6165147298junov@google.com
71477e498e6ba5603b64988c3243ee97b6165147298junov@google.com   v->ximage_flag = ximage_flag;
71577e498e6ba5603b64988c3243ee97b6165147298junov@google.com
716d3b9fbbc48c13a1b2a664cf7e01374a44c201f51robertphillips@google.com   v->mesa_visual.redMask = visinfo->red_mask;
717e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com   v->mesa_visual.greenMask = visinfo->green_mask;
7189875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   v->mesa_visual.blueMask = visinfo->blue_mask;
7199875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   v->visualID = visinfo->visualid;
7207361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   v->screen = visinfo->screen;
7217361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7227361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com#if !(defined(__cplusplus) || defined(c_plusplus))
7237361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   v->visualType = xmesa_convert_from_x_visual_type(visinfo->class);
7247361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com#else
7257361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   v->visualType = xmesa_convert_from_x_visual_type(visinfo->c_class);
7267361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com#endif
7277361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7289875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   v->mesa_visual.visualRating = visualCaveat;
7297361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7307361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   if (alpha_flag)
7317361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      v->mesa_visual.alphaBits = 8;
7321a7e9461bb2bf3a56023cd6fbbc6f009e7537a1ereed@google.com
7337361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   (void) initialize_visual_and_buffer( v, NULL, rgb_flag, 0, 0 );
7347361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7357361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   {
7367361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      const int xclass = v->visualType;
7377361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
7387361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         red_bits   = _mesa_bitcount(GET_REDMASK(v));
7397361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         green_bits = _mesa_bitcount(GET_GREENMASK(v));
7407361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         blue_bits  = _mesa_bitcount(GET_BLUEMASK(v));
7417361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      }
7427361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      else {
7437361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         /* this is an approximation */
744686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org         int depth;
745b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com         depth = v->visinfo->depth;
7467361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         red_bits = depth / 3;
7477361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         depth -= red_bits;
7487361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         green_bits = depth / 2;
7497361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         depth -= green_bits;
7507361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         blue_bits = depth;
751b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com         alpha_bits = 0;
75200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com         assert( red_bits + green_bits + blue_bits == v->visinfo->depth );
75300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com      }
754b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com      alpha_bits = v->mesa_visual.alphaBits;
755b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com   }
756b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com
757b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com   /* initialize visual */
758b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com   {
759b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com      struct gl_config *vis = &v->mesa_visual;
760b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com
761b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com      vis->rgbMode          = GL_TRUE;
762b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com      vis->doubleBufferMode = db_flag;
763b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com      vis->stereoMode       = stereo_flag;
764b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com
765b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com      vis->redBits          = red_bits;
766b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com      vis->greenBits        = green_bits;
767b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com      vis->blueBits         = blue_bits;
768d9f826c0dbc38f3608797a02948adf9bc99d5d50bsalomon@google.com      vis->alphaBits        = alpha_bits;
7697361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->rgbBits          = red_bits + green_bits + blue_bits;
7707361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7717361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->indexBits      = 0;
7727361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->depthBits      = depth_size;
7737361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->stencilBits    = stencil_size;
7747361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7757361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->accumRedBits   = accum_red_size;
7767361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->accumGreenBits = accum_green_size;
7777361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->accumBlueBits  = accum_blue_size;
7787361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->accumAlphaBits = accum_alpha_size;
7797361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7807361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->haveAccumBuffer   = accum_red_size > 0;
781d9f826c0dbc38f3608797a02948adf9bc99d5d50bsalomon@google.com      vis->haveDepthBuffer   = depth_size > 0;
7827361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->haveStencilBuffer = stencil_size > 0;
783d9f826c0dbc38f3608797a02948adf9bc99d5d50bsalomon@google.com
7847361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->numAuxBuffers = 0;
7857361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->level = 0;
7867361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->sampleBuffers = 0;
7877361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      vis->samples = 0;
7887361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   }
7897361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7907361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   v->stvis.buffer_mask = ST_ATTACHMENT_FRONT_LEFT_MASK;
7917361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   if (db_flag)
7927361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      v->stvis.buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
7937361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   if (stereo_flag) {
7947361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      v->stvis.buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK;
7957361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      if (db_flag)
7967361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com         v->stvis.buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK;
7977361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   }
7987361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
7997361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   v->stvis.color_format = choose_pixel_format(v);
8007361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   if (v->stvis.color_format == PIPE_FORMAT_NONE) {
8017361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      FREE(v->visinfo);
802d9f826c0dbc38f3608797a02948adf9bc99d5d50bsalomon@google.com      FREE(v);
803d9f826c0dbc38f3608797a02948adf9bc99d5d50bsalomon@google.com      return NULL;
8049875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   }
80500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com
8068923c6cfd580ac9accb11b909fa2a033d69553aareed@google.com   v->stvis.depth_stencil_format =
8078923c6cfd580ac9accb11b909fa2a033d69553aareed@google.com      choose_depth_stencil_format(xmdpy, depth_size, stencil_size);
808d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com
8097bc13a62609149f0b535c2f3ff7210eb834d8b36epoger@google.com   v->stvis.accum_format = (accum_red_size +
8107bc13a62609149f0b535c2f3ff7210eb834d8b36epoger@google.com         accum_green_size + accum_blue_size + accum_alpha_size) ?
8118015dd83ae37147bb630d4751030868051ad0caereed@android.com      PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE;
8125d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org
8138015dd83ae37147bb630d4751030868051ad0caereed@android.com   v->stvis.samples = num_samples;
8149875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   v->stvis.render_buffer = ST_ATTACHMENT_INVALID;
8158570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
8168015dd83ae37147bb630d4751030868051ad0caereed@android.com   /* XXX minor hack */
817b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com   v->mesa_visual.level = level;
818e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com   return v;
819ab9739777cc84bf6c7e86372ade87a4ec468d1e6reed@google.com}
820b8b0983c9e06771154accb0c50570b0cc6f138ccreed@google.com
8215af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
8226abfa49b9727cabb9550d35cdef28007df0c9b8btomhudson@google.comPUBLIC
823f6f123d23608a4a5fe9c812d2452039a18da7e0brobertphillips@google.comvoid XMesaDestroyVisual( XMesaVisual v )
8244370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com{
825e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com   free(v->visinfo);
826e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com   free(v);
827e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com}
828e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com
8299875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
8308015dd83ae37147bb630d4751030868051ad0caereed@android.com/**
8318015dd83ae37147bb630d4751030868051ad0caereed@android.com * Do per-display initializations.
8328015dd83ae37147bb630d4751030868051ad0caereed@android.com */
8338015dd83ae37147bb630d4751030868051ad0caereed@android.comvoid
8348015dd83ae37147bb630d4751030868051ad0caereed@android.comxmesa_init( Display *display )
8358015dd83ae37147bb630d4751030868051ad0caereed@android.com{
8368015dd83ae37147bb630d4751030868051ad0caereed@android.com   xmesa_init_display(display);
8375d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org}
8385d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org
8395d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org
8405d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org/**
8415d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org * Create a new XMesaContext.
8428015dd83ae37147bb630d4751030868051ad0caereed@android.com * \param v  the XMesaVisual
8438015dd83ae37147bb630d4751030868051ad0caereed@android.com * \param share_list  another XMesaContext with which to share display
8448015dd83ae37147bb630d4751030868051ad0caereed@android.com *                    lists or NULL if no sharing is wanted.
8458015dd83ae37147bb630d4751030868051ad0caereed@android.com * \return an XMesaContext or NULL if error.
8468015dd83ae37147bb630d4751030868051ad0caereed@android.com */
8473d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.comPUBLIC
8489875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
8493d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com{
8503d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   XMesaDisplay xmdpy = xmesa_init_display(v->display);
8513d3f092a9547779a1f0fb6dac202349f50969ab2reed@google.com   struct st_context_attribs attribs;
8528570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com   XMesaContext c;
8538570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
8548570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com   if (!xmdpy)
8558570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com      return NULL;
8568570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
85710afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */
85810afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
8595af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com   if (!c)
8605af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com      return NULL;
861b8b0983c9e06771154accb0c50570b0cc6f138ccreed@google.com
862b8b0983c9e06771154accb0c50570b0cc6f138ccreed@google.com   c->xm_visual = v;
863ab9739777cc84bf6c7e86372ade87a4ec468d1e6reed@google.com   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
864ab9739777cc84bf6c7e86372ade87a4ec468d1e6reed@google.com   c->xm_read_buffer = NULL;
8654370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
8664370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com   memset(&attribs, 0, sizeof(attribs));
867e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com   attribs.profile = ST_PROFILE_DEFAULT;
868e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com   attribs.visual = v->stvis;
869e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com
870e8fcb5017cfcaf5b02d8a11e62073d6903aa02a5reed@google.com   c->st = stapi->create_context(stapi, xmdpy->smapi,
87173fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com         &attribs, (share_list) ? share_list->st : NULL);
87273fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com   if (c->st == NULL)
873ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com      goto fail;
874ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com
875ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com   c->st->st_manager_private = (void *) c;
876b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com
877b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com   return c;
878ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com
879e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.comfail:
8808570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com   if (c->st)
8819875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      c->st->destroy(c->st);
8828570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
8838570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com   free(c);
8849875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   return NULL;
8859875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com}
8869875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
8878570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
8888570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
8899875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comPUBLIC
890873cb1e23b64e4b2d11749352b626bcef204bdd7reed@google.comvoid XMesaDestroyContext( XMesaContext c )
8918570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com{
8928570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com   c->st->destroy(c->st);
8937361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
894873cb1e23b64e4b2d11749352b626bcef204bdd7reed@google.com   /* FIXME: We should destroy the screen here, but if we do so, surfaces may
89500f883e6413202a150eb1b53213d2eb3047d7067reed@android.com    * outlive it, causing segfaults
89600f883e6413202a150eb1b53213d2eb3047d7067reed@android.com   struct pipe_screen *screen = c->st->pipe->screen;
8979284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com   screen->destroy(screen);
8989284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com   */
89900f883e6413202a150eb1b53213d2eb3047d7067reed@android.com
90000f883e6413202a150eb1b53213d2eb3047d7067reed@android.com   free(c);
9015d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org}
9025d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org
9035d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org
9048570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
9058570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com/**
9068570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com * Private function for creating an XMesaBuffer which corresponds to an
9078570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com * X window or pixmap.
908c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * \param v  the window's XMesaVisual
909c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * \param w  the window we're wrapping
910c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * \return  new XMesaBuffer or NULL if error
911c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com */
912c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.comPUBLIC XMesaBuffer
913c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.comXMesaCreateWindowBuffer(XMesaVisual v, Window w)
914e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com{
915e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com   XWindowAttributes attr;
916e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com   XMesaBuffer b;
917e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com   Colormap cmap;
9187361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   int depth;
9197361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
92000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com   assert(v);
921ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com   assert(w);
922b2a5162f1da657839c542de9a5592a95fe05536dreed@google.com
923ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com   /* Check that window depth matches visual depth */
924ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com   XGetWindowAttributes( v->display, w, &attr );
925ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com   depth = attr.depth;
926ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com   if (v->visinfo->depth != depth) {
9279875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
928ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com                    v->visinfo->depth, depth);
9298015dd83ae37147bb630d4751030868051ad0caereed@android.com      return NULL;
930cae6b3f1e85239f95fcdad2b341ccbe83a8a2a40tomhudson@google.com   }
9318015dd83ae37147bb630d4751030868051ad0caereed@android.com
9329875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   /* Find colormap */
9337361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   if (attr.colormap) {
9347361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      cmap = attr.colormap;
9357361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   }
9367361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   else {
9377361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
9387361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      /* this is weird, a window w/out a colormap!? */
9397361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      /* OK, let's just allocate a new one and hope for the best */
9407361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
9417361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   }
9427361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
9437361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   b = create_xmesa_buffer((Drawable) w, WINDOW, v, cmap);
9447361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   if (!b)
9457361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      return NULL;
9467361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
9477361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode,
9487361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com                                      (Drawable) w, cmap )) {
9497361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      xmesa_free_buffer(b);
950daf12bb01a58e18056479687f22d09d79f66a7afbsalomon@google.com      return NULL;
9517361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   }
9527361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
9537361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com   return b;
9547361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com}
9557361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
9567361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
9577361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com
9587361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com/**
959c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com * Create a new XMesaBuffer from an X pixmap.
96029d3501e3bda5e84c47824e17937961852b4efa6bsalomon@google.com *
961e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com * \param v    the XMesaVisual
96264e011a59d0bfce8bf523211e4e4ed1939032b87bungeman@google.com * \param p    the pixmap
96364e011a59d0bfce8bf523211e4e4ed1939032b87bungeman@google.com * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or
964ab9739777cc84bf6c7e86372ade87a4ec468d1e6reed@google.com *             \c GLX_DIRECT_COLOR visual for the pixmap
965ab9739777cc84bf6c7e86372ade87a4ec468d1e6reed@google.com * \returns new XMesaBuffer or NULL if error
966ab9739777cc84bf6c7e86372ade87a4ec468d1e6reed@google.com */
967c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.comPUBLIC XMesaBuffer
968c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.comXMesaCreatePixmapBuffer(XMesaVisual v, Pixmap p, Colormap cmap)
969c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com{
9709875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   XMesaBuffer b;
971c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
972c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   assert(v);
973c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
974c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b = create_xmesa_buffer((Drawable) p, PIXMAP, v, cmap);
975c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   if (!b)
97673fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com      return NULL;
9779875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
978c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
979c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com				     (Drawable) p, cmap)) {
980c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      xmesa_free_buffer(b);
9817361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com      return NULL;
982c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   }
983c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
984c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   return b;
9854370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
986e24a07980eee6a4a743b0099e2ed5d44bd9715c4twiz@google.com
9878570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com
9884370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com/**
9898570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com * For GLX_EXT_texture_from_pixmap
9907361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com */
9914370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comXMesaBuffer
9924370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comXMesaCreatePixmapTextureBuffer(XMesaVisual v, Pixmap p,
993c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com                               Colormap cmap,
994c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com                               int format, int target, int mipmap)
995c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com{
996c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   GET_CURRENT_CONTEXT(ctx);
997c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   XMesaBuffer b;
998c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com
999c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   assert(v);
10005af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
10015af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com   b = create_xmesa_buffer((Drawable) p, PIXMAP, v, cmap);
10025af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com   if (!b)
10035af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com      return NULL;
10045af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com
10055af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com   /* get pixmap size */
10065af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com   xmesa_get_window_size(v->display, b, &b->width, &b->height);
1007a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.com
1008a2ca41e3afdd8fad5e0e924dec029f33918e0a67djsollen@google.com   if (target == 0) {
1009c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      /* examine dims */
1010c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      if (ctx->Extensions.ARB_texture_non_power_of_two) {
1011c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         target = GLX_TEXTURE_2D_EXT;
1012c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      }
10135d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org      else if (   _mesa_bitcount(b->width)  == 1
10145d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org               && _mesa_bitcount(b->height) == 1) {
10155d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org         /* power of two size */
10165d0c62f0f654127b7d66358405d824266868bd1dmike@reedtribe.org         if (b->height == 1) {
1017c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com            target = GLX_TEXTURE_1D_EXT;
1018c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         }
1019c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         else {
1020c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com            target = GLX_TEXTURE_2D_EXT;
1021c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         }
1022c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      }
1023c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      else if (ctx->Extensions.NV_texture_rectangle) {
1024c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         target = GLX_TEXTURE_RECTANGLE_EXT;
1025c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      }
1026c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com      else {
1027c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         /* non power of two textures not supported */
1028c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         XMesaDestroyBuffer(b);
1029c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com         return 0;
103073fb0422a6c18896a685240af176c1a2ce7e9e38tomhudson@google.com      }
10319875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com   }
103200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com
103300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com   b->TextureTarget = target;
1034c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->TextureFormat = format;
1035c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   b->TextureMipmap = mipmap;
1036f6f123d23608a4a5fe9c812d2452039a18da7e0brobertphillips@google.com
1037c7cf2b351f85712a8ed0e1c495d1045dbaa7b785epoger@google.com   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
103800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com				     (Drawable) p, cmap)) {
1039      xmesa_free_buffer(b);
1040      return NULL;
1041   }
1042
1043   return b;
1044}
1045
1046
1047
1048XMesaBuffer
1049XMesaCreatePBuffer(XMesaVisual v, Colormap cmap,
1050                   unsigned int width, unsigned int height)
1051{
1052   Window root;
1053   Drawable drawable;  /* X Pixmap Drawable */
1054   XMesaBuffer b;
1055
1056   /* allocate pixmap for front buffer */
1057   root = RootWindow( v->display, v->visinfo->screen );
1058   drawable = XCreatePixmap(v->display, root, width, height,
1059                            v->visinfo->depth);
1060   if (!drawable)
1061      return NULL;
1062
1063   b = create_xmesa_buffer(drawable, PBUFFER, v, cmap);
1064   if (!b)
1065      return NULL;
1066
1067   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
1068				     drawable, cmap)) {
1069      xmesa_free_buffer(b);
1070      return NULL;
1071   }
1072
1073   return b;
1074}
1075
1076
1077
1078/*
1079 * Deallocate an XMesaBuffer structure and all related info.
1080 */
1081PUBLIC void
1082XMesaDestroyBuffer(XMesaBuffer b)
1083{
1084   xmesa_free_buffer(b);
1085}
1086
1087
1088/**
1089 * Notify the binding context to validate the buffer.
1090 */
1091void
1092xmesa_notify_invalid_buffer(XMesaBuffer b)
1093{
1094   XMesaContext xmctx = XMesaGetCurrentContext();
1095
1096   if (xmctx && xmctx->xm_buffer == b)
1097      xmctx->st->notify_invalid_framebuffer(xmctx->st, b->stfb);
1098}
1099
1100
1101/**
1102 * Query the current drawable size and notify the binding context.
1103 */
1104void
1105xmesa_check_buffer_size(XMesaBuffer b)
1106{
1107   if (b->type == PBUFFER)
1108      return;
1109
1110   xmesa_get_window_size(b->xm_visual->display, b, &b->width, &b->height);
1111   xmesa_notify_invalid_buffer(b);
1112}
1113
1114
1115/*
1116 * Bind buffer b to context c and make c the current rendering context.
1117 */
1118PUBLIC
1119GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
1120                             XMesaBuffer readBuffer )
1121{
1122   XMesaContext old_ctx = XMesaGetCurrentContext();
1123
1124   if (old_ctx && old_ctx != c) {
1125      XMesaFlush(old_ctx);
1126      old_ctx->xm_buffer = NULL;
1127      old_ctx->xm_read_buffer = NULL;
1128   }
1129
1130   if (c) {
1131      if (!drawBuffer || !readBuffer)
1132         return GL_FALSE;  /* must specify buffers! */
1133
1134      if (c == old_ctx &&
1135	  c->xm_buffer == drawBuffer &&
1136	  c->xm_read_buffer == readBuffer)
1137	 return GL_TRUE;
1138
1139      xmesa_check_buffer_size(drawBuffer);
1140      if (readBuffer != drawBuffer)
1141         xmesa_check_buffer_size(readBuffer);
1142
1143      c->xm_buffer = drawBuffer;
1144      c->xm_read_buffer = readBuffer;
1145
1146      stapi->make_current(stapi, c->st, drawBuffer->stfb, readBuffer->stfb);
1147
1148      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
1149      drawBuffer->wasCurrent = GL_TRUE;
1150   }
1151   else {
1152      /* Detach */
1153      stapi->make_current(stapi, NULL, NULL, NULL);
1154
1155   }
1156   return GL_TRUE;
1157}
1158
1159
1160/*
1161 * Unbind the context c from its buffer.
1162 */
1163GLboolean XMesaUnbindContext( XMesaContext c )
1164{
1165   /* A no-op for XFree86 integration purposes */
1166   return GL_TRUE;
1167}
1168
1169
1170XMesaContext XMesaGetCurrentContext( void )
1171{
1172   struct st_context_iface *st = stapi->get_current(stapi);
1173   return (XMesaContext) (st) ? st->st_manager_private : NULL;
1174}
1175
1176
1177
1178/**
1179 * Swap front and back color buffers and have winsys display front buffer.
1180 * If there's no front color buffer no swap actually occurs.
1181 */
1182PUBLIC
1183void XMesaSwapBuffers( XMesaBuffer b )
1184{
1185   XMesaContext xmctx = XMesaGetCurrentContext();
1186
1187   if (xmctx && xmctx->xm_buffer == b) {
1188      xmctx->st->flush( xmctx->st,
1189            PIPE_FLUSH_RENDER_CACHE |
1190            PIPE_FLUSH_SWAPBUFFERS |
1191            PIPE_FLUSH_FRAME,
1192            NULL);
1193   }
1194
1195   xmesa_swap_st_framebuffer(b->stfb);
1196}
1197
1198
1199
1200/*
1201 * Copy sub-region of back buffer to front buffer
1202 */
1203void XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
1204{
1205   xmesa_copy_st_framebuffer(b->stfb,
1206         ST_ATTACHMENT_BACK_LEFT, ST_ATTACHMENT_FRONT_LEFT,
1207         x, y, width, height);
1208}
1209
1210
1211
1212void XMesaFlush( XMesaContext c )
1213{
1214   if (c && c->xm_visual->display) {
1215      XMesaDisplay xmdpy = xmesa_init_display(c->xm_visual->display);
1216      struct pipe_fence_handle *fence = NULL;
1217
1218      c->st->flush(c->st, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
1219      if (fence) {
1220         xmdpy->screen->fence_finish(xmdpy->screen, fence, 0);
1221         xmdpy->screen->fence_reference(xmdpy->screen, &fence, NULL);
1222      }
1223      XFlush( c->xm_visual->display );
1224   }
1225}
1226
1227
1228
1229
1230
1231XMesaBuffer XMesaFindBuffer( Display *dpy, Drawable d )
1232{
1233   XMesaBuffer b;
1234   for (b = XMesaBufferList; b; b = b->Next) {
1235      if (b->ws.drawable == d && b->xm_visual->display == dpy) {
1236         return b;
1237      }
1238   }
1239   return NULL;
1240}
1241
1242
1243/**
1244 * Free/destroy all XMesaBuffers associated with given display.
1245 */
1246void xmesa_destroy_buffers_on_display(Display *dpy)
1247{
1248   XMesaBuffer b, next;
1249   for (b = XMesaBufferList; b; b = next) {
1250      next = b->Next;
1251      if (b->xm_visual->display == dpy) {
1252         xmesa_free_buffer(b);
1253         /* delete head of list? */
1254         if (XMesaBufferList == b) {
1255            XMesaBufferList = next;
1256         }
1257      }
1258   }
1259}
1260
1261
1262/*
1263 * Look for XMesaBuffers whose X window has been destroyed.
1264 * Deallocate any such XMesaBuffers.
1265 */
1266void XMesaGarbageCollect( void )
1267{
1268   XMesaBuffer b, next;
1269   for (b=XMesaBufferList; b; b=next) {
1270      next = b->Next;
1271      if (b->xm_visual &&
1272          b->xm_visual->display &&
1273          b->ws.drawable &&
1274          b->type == WINDOW) {
1275         XSync(b->xm_visual->display, False);
1276         if (!window_exists( b->xm_visual->display, b->ws.drawable )) {
1277            /* found a dead window, free the ancillary info */
1278            XMesaDestroyBuffer( b );
1279         }
1280      }
1281   }
1282}
1283
1284
1285
1286
1287PUBLIC void
1288XMesaBindTexImage(Display *dpy, XMesaBuffer drawable, int buffer,
1289                  const int *attrib_list)
1290{
1291}
1292
1293
1294
1295PUBLIC void
1296XMesaReleaseTexImage(Display *dpy, XMesaBuffer drawable, int buffer)
1297{
1298}
1299
1300
1301void
1302XMesaCopyContext(XMesaContext src, XMesaContext dst, unsigned long mask)
1303{
1304   if (dst->st->copy)
1305      dst->st->copy(dst->st, src->st, mask);
1306}
1307