xm_api.c revision 4d944b502f8a1ae372d9248e888612bffb5eb6a5
14ee2ad04344446e610172a0e73949212923014dfSebastian Redl/*
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Mesa 3-D graphics library
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Version:  6.5.2
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Permission is hereby granted, free of charge, to any person obtaining a
82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * copy of this software and associated documentation files (the "Software"),
92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * to deal in the Software without restriction, including without limitation
10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * the rights to use, copy, modify, merge, publish, distribute, sublicense,
112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * and/or sell copies of the Software, and to permit persons to whom the
122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Software is furnished to do so, subject to the following conditions:
132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl * The above copyright notice and this permission notice shall be included
1589d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor * in all copies or substantial portions of the Software.
160eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis *
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
222a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis */
240b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
257a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall/**
262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * \file xm_api.c
27a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall *
286ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl * All the XMesa* API functions.
297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *
306a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *
317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * NOTES:
3283d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff *
3314f79002e58556798e86168c63e48d533287eda5Douglas Gregor * The window coordinate system origin (0,0) is in the lower-left corner
3410e286aa8d39fb51a21412850265d9dae74613eeChris Lattner * of the window.  X11's window coordinate origin is in the upper-left
353251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * corner of the window.  Therefore, most drawing functions in this
3614f79002e58556798e86168c63e48d533287eda5Douglas Gregor * file have to flip Y coordinates.
37bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor *
382bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
39ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor * in support for the MIT Shared Memory extension.  If enabled, when you
400a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor * use an Ximage for the back buffer in double buffered mode, the "swap"
4117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor * operation will be faster.  You must also link with -lXext.
4217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor *
432596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar * Byte swapping:  If the Mesa host and the X display use a different
442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * byte order then there's some trickiness to be aware of when using
45fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer * XImages.  The byte ordering used for the XImage is that of the X
4614f79002e58556798e86168c63e48d533287eda5Douglas Gregor * display, not the Mesa host.
4703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer * The color-to-pixel encoding for True/DirectColor must be done
48f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * according to the display's visual red_mask, green_mask, and blue_mask.
493c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
50cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * do byte swapping if needed.  If one wants to directly "poke" the pixel
51f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * into the XImage's buffer then the pixel must be byte swapped first.  In
522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * and use XPutPixel everywhere except in the implementation of
542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
55ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * instead of using XPutPixel we "poke" our values after byte-swapping
565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * the clear pixel value if needed.
575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner *
585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner */
596e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
60ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#ifdef __CYGWIN__
616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#undef WIN32
626e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#undef __WIN32__
635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#endif
645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
656e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#include "glxheader.h"
66ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#include "GL/xmesa.h"
67ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#include "xmesaP.h"
682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "context.h"
692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "extensions.h"
702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "framebuffer.h"
7112b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner#include "glthread.h"
722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "imports.h"
733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#include "macros.h"
74a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include "renderbuffer.h"
7589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "swrast/swrast.h"
762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast_setup/swrast_setup.h"
772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "vbo/vbo.h"
782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/tnl.h"
798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "tnl/t_context.h"
802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/t_pipeline.h"
8189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "drivers/common/driverfuncs.h"
828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Global X driver lock
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor_glthread_Mutex _xmesa_lock;
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Lookup tables for HPCR pixel format:
922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic short hpcr_rgbTbl[3][256] = {
943397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{
952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1033397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1083397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
1112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor},
1122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
1133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
114df1550fc59b51681d37225934fe4e3acac321621Richard Smith 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
115df1550fc59b51681d37225934fe4e3acac321621Richard Smith 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
1168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
120df1550fc59b51681d37225934fe4e3acac321621Richard Smith 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
1292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor},
1303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{
1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
1322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 40,  40,  41,  41,  42,  42,  43,  43,  44,  44,  45,  45,  46,  46,  47,  47,
1330953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
1342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
1352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
1363397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
1372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  86,  86,  87,  87,
1382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1423397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
1473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
1482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor};
1497e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor
1507e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor
151c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
1528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**********************************************************************/
1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/*****                     X Utility Functions                    *****/
1542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/
1553397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
158e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson * Return the host's byte order as LSBFirst or MSBFirst ala X.
1598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */
1602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#ifndef XFree86Server
1612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic int host_byte_order( void )
1623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{
1632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   int i = 1;
1648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   char *cptr = (char *) &i;
1652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   return (*cptr==1) ? LSBFirst : MSBFirst;
1662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif
1682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
169264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola
170264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola/**
171a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman * Check if the X Shared Memory extension is available.
172425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola * Return:  0 = not available
173ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor *          1 = shared XImage support available
174264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola *          2 = shared Pixmap support available also
175f85e193739c953358c865005855253af4f68a497John McCall */
1762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic int check_for_xshm( XMesaDisplay *display )
1772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
1783397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#if defined(USE_XSHM) && !defined(XFree86Server)
1792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   int major, minor, ignore;
1808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   Bool pixmaps;
1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
1833397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor	 return (pixmaps==True) ? 2 : 1;
1852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      }
1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      else {
1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor	 return 0;
1882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      }
1892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
190c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor   else {
19160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      return 0;
19260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl   }
19360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl#else
19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl   /* No  XSHM support */
19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl   return 0;
19660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl#endif
19760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl}
19860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl
1998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
2012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Apply gamma correction to an intensity value in [0..max].  Return the
2023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * new intensity value.
203ed97649e9574b9d854fa4d6109c9333ae0993554John McCall */
2048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic GLint
205ed97649e9574b9d854fa4d6109c9333ae0993554John McCallgamma_adjust( GLfloat gamma, GLint value, GLint max )
206ed97649e9574b9d854fa4d6109c9333ae0993554John McCall{
2073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (gamma == 1.0) {
2082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return value;
2099763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   }
2109763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   else {
2118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      double x = (double) value / (double) max;
2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma));
2132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
2143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
215c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
2168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
2193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Return the true number of bits per pixel for XImages.
2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * For example, if we request a 24-bit deep visual we may actually need/get
2218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * 32bpp XImages.  This function returns the appropriate bpp.
2222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Input:  dpy - the X display
2232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *         visinfo - desribes the visual to be used for XImages
2243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Return:  true number of bits per pixel for XImages
225395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson */
2268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic int
227395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlssonbits_per_pixel( XMesaVisual xmv )
228395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson{
229ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt#ifdef XFree86Server
230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   const int depth = xmv->nplanes;
231ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   int i;
232ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   assert(depth > 0);
233ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
234ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt      if (screenInfo.formats[i].depth == depth)
235ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt         return screenInfo.formats[i].bitsPerPixel;
23634b41d939a1328f484511c6002ba2456db879a29Richard Smith   }
23734b41d939a1328f484511c6002ba2456db879a29Richard Smith   return depth;  /* should never get here, but this should be safe */
23834b41d939a1328f484511c6002ba2456db879a29Richard Smith#else
23934b41d939a1328f484511c6002ba2456db879a29Richard Smith   XMesaDisplay *dpy = xmv->display;
24034b41d939a1328f484511c6002ba2456db879a29Richard Smith   XMesaVisualInfo visinfo = xmv->visinfo;
2413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   XMesaImage *img;
242be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis   int bitsPerPixel;
2432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* Create a temporary XImage */
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
2452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor		       ZPixmap, 0,           /*format, offset*/
2462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor		       (char*) MALLOC(8),    /*data*/
2472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor		       1, 1,                 /*width, height*/
2483397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl		       32,                   /*bitmap_pad*/
2492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor		       0                     /*bytes_per_line*/
2508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                     );
2512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   assert(img);
2522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* grab the bits/pixel value */
2533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   bitsPerPixel = img->bits_per_pixel;
2542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* free the XImage */
2558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   _mesa_free( img->data );
2562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   img->data = NULL;
2572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   XMesaDestroyImage( img );
2589d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall   return bitsPerPixel;
2599d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall#endif
2609d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
2619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2639d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2649d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall/*
2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Determine if a given X window ID is valid (window exists).
2663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Do this by calling XGetWindowAttributes() for the window and
26749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * checking if we catch an X error.
26849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * Input:  dpy - the display
26949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall *         win - the window to check for existance
2708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Return:  GL_TRUE - window exists
27149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall *          GL_FALSE - window doesn't exist
27249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall */
27349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall#ifndef XFree86Server
274c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic GLboolean WindowExistsFlag;
275c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
276c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
277c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor{
278c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   (void) dpy;
279c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   if (xerr->error_code == BadWindow) {
280c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor      WindowExistsFlag = GL_FALSE;
281c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   }
2823397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   return 0;
2832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
284be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis
28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
28690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{
28790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   XWindowAttributes wa;
28890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
28990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   WindowExistsFlag = GL_TRUE;
2903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith   old_handler = XSetErrorHandler(window_exists_err_handler);
2913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
2929763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   XSetErrorHandler(old_handler);
2939763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   return WindowExistsFlag;
2948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
29590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif
29690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
29790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
2983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
299ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis/**
300ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis * Return the size of the window (or pixmap) that corresponds to the
301ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis * given XMesaBuffer.
3028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * \param width  returns width in pixels
30390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * \param height  returns height in pixels
30490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis */
30590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid
3063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b,
30790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis                      GLuint *width, GLuint *height)
30890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{
30990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#ifdef XFree86Server
31090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH);
31190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT);
31290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#else
3133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   Window root;
31490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   Status stat;
31590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   int xpos, ypos;
31690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   unsigned int w, h, bw, depth;
3174fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth
3188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   _glthread_LOCK_MUTEX(_xmesa_lock);
31990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   XSync(b->xm_visual->display, 0); /* added for Chromium */
32090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   stat = XGetGeometry(dpy, b->frontxrb->pixmap, &root, &xpos, &ypos,
32190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis                       &w, &h, &bw, &depth);
3223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   _glthread_UNLOCK_MUTEX(_xmesa_lock);
3238dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
3248dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis   if (stat) {
3258dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      *width = w;
326f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis      *height = h;
327f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis   }
328f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis   else {
3298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      /* probably querying a window that's recently been destroyed */
33090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis      _mesa_warning(NULL, "XGetGeometry failed!\n");
33190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis      *width = *height = 1;
33290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   }
3333397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif
33490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
3353acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3363acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3373acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3383acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis/**********************************************************************/
3393acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis/*****                Linked list of XMesaBuffers                 *****/
3403acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis/**********************************************************************/
3413acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlXMesaBuffer XMesaBufferList = NULL;
3432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
3442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
3457536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor/**
3467536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * Allocate a new XMesaBuffer object which corresponds to the given drawable.
347cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * Note that XMesaBuffer is derived from GLframebuffer.
348cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * The new XMesaBuffer will not have any size (Width=Height=0).
349cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor *
350cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * \param d  the corresponding X drawable (window or pixmap)
3517536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * \param type  either WINDOW, PIXMAP or PBUFFER, describing d
3527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * \param vis  the buffer's visual
3537536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * \param cmap  the window's colormap, if known.
354075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \return new XMesaBuffer or NULL if any problem
355075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara */
356075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnarastatic XMesaBuffer
357075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaracreate_xmesa_buffer(XMesaDrawable d, BufferType type,
358075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara                    XMesaVisual vis, XMesaColormap cmap)
3593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{
360465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara   XMesaBuffer b;
3613acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3623acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER);
3638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
3642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
3652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (!b)
3663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      return NULL;
3673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
36831f17ecbef57b5679c017c375db330546b7b5145John McCall   b->display = vis->display;
3698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   b->xm_visual = vis;
3703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   b->type = type;
3713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   b->cmap = cmap;
3723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
373deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor   _mesa_initialize_framebuffer(&b->mesa_buffer, &vis->mesa_visual);
3748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   b->mesa_buffer.Delete = xmesa_delete_framebuffer;
375c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
376c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall   /*
3773397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    * Front renderbuffer
378c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    */
3792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE);
380c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall   if (!b->frontxrb) {
381446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff      _mesa_free(b);
382446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff      return NULL;
3838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   }
3842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   b->frontxrb->Parent = b;
3852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   b->frontxrb->drawable = d;
386d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff   b->frontxrb->pixmap = (XMesaPixmap) d;
3873397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT,
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                          &b->frontxrb->Base);
3898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
3902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /*
3912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    * Back renderbuffer
392a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    */
393a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   if (vis->mesa_visual.doubleBufferMode) {
394a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE);
395a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      if (!b->backxrb) {
39689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis         /* XXX free front xrb too */
397a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall         _mesa_free(b);
398a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall         return NULL;
39989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis      }
400a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      b->backxrb->Parent = b;
401a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      /* determine back buffer implementation */
40251bd803fbdade51d674598ed45da3d54190a656cJohn McCall      b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP;
403a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
40451bd803fbdade51d674598ed45da3d54190a656cJohn McCall      _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT,
405a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall                             &b->backxrb->Base);
406a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   }
40751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
40851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /*
409a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    * Software alpha planes
410a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    */
411a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   if (vis->mesa_visual.alphaBits > 0
412a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall       && vis->undithered_pf != PF_8A8B8G8R
41351bd803fbdade51d674598ed45da3d54190a656cJohn McCall       && vis->undithered_pf != PF_8A8R8G8B) {
41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall      /* Visual has alpha, but pixel format doesn't support it.
41551bd803fbdade51d674598ed45da3d54190a656cJohn McCall       * We'll use an alpha renderbuffer wrapper.
41651bd803fbdade51d674598ed45da3d54190a656cJohn McCall       */
417ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      b->swAlpha = GL_TRUE;
418ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor   }
419ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor   else {
420ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      b->swAlpha = GL_FALSE;
421ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor   }
422ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
423ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor   /*
42451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    * Other renderbuffer (depth, stencil, etc)
42551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    */
42651bd803fbdade51d674598ed45da3d54190a656cJohn McCall   _mesa_add_soft_renderbuffers(&b->mesa_buffer,
42751bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                GL_FALSE,  /* color */
42851bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.haveDepthBuffer,
42951bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.haveStencilBuffer,
43051bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.haveAccumBuffer,
43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                b->swAlpha,
43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.numAuxBuffers > 0 );
43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
43451bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /* insert buffer into linked list */
43551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->Next = XMesaBufferList;
43651bd803fbdade51d674598ed45da3d54190a656cJohn McCall   XMesaBufferList = b;
43751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   return b;
43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
44051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
442b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara/**
44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Find an XMesaBuffer by matching X display and colormap but NOT matching
44451bd803fbdade51d674598ed45da3d54190a656cJohn McCall * the notThis buffer.
44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */
44651bd803fbdade51d674598ed45da3d54190a656cJohn McCallXMesaBuffer
44751bd803fbdade51d674598ed45da3d54190a656cJohn McCallxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis)
44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall   XMesaBuffer b;
45051bd803fbdade51d674598ed45da3d54190a656cJohn McCall   for (b=XMesaBufferList; b; b=b->Next) {
45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
45251bd803fbdade51d674598ed45da3d54190a656cJohn McCall         return b;
45351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      }
45451bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   return NULL;
45651bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
45751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45951bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**
46051bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Remove buffer from linked list, delete if no longer referenced.
46151bd803fbdade51d674598ed45da3d54190a656cJohn McCall */
46251bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic void
46351bd803fbdade51d674598ed45da3d54190a656cJohn McCallxmesa_free_buffer(XMesaBuffer buffer)
46451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
46551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   XMesaBuffer prev = NULL, b;
46651bd803fbdade51d674598ed45da3d54190a656cJohn McCall
46751bd803fbdade51d674598ed45da3d54190a656cJohn McCall   for (b = XMesaBufferList; b; b = b->Next) {
46851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      if (b == buffer) {
46951bd803fbdade51d674598ed45da3d54190a656cJohn McCall         struct gl_framebuffer *fb = &buffer->mesa_buffer;
47051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
47151bd803fbdade51d674598ed45da3d54190a656cJohn McCall         /* unlink buffer from list */
47251bd803fbdade51d674598ed45da3d54190a656cJohn McCall         if (prev)
47351bd803fbdade51d674598ed45da3d54190a656cJohn McCall            prev->Next = buffer->Next;
47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall         else
475796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara            XMesaBufferList = buffer->Next;
476796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara
477dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor         /* mark as delete pending */
47851bd803fbdade51d674598ed45da3d54190a656cJohn McCall         fb->DeletePending = GL_TRUE;
47951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
48051bd803fbdade51d674598ed45da3d54190a656cJohn McCall         /* Since the X window for the XMesaBuffer is going away, we don't
48151bd803fbdade51d674598ed45da3d54190a656cJohn McCall          * want to dereference this pointer in the future.
48251bd803fbdade51d674598ed45da3d54190a656cJohn McCall          */
48351bd803fbdade51d674598ed45da3d54190a656cJohn McCall         b->frontxrb->drawable = 0;
48451bd803fbdade51d674598ed45da3d54190a656cJohn McCall
48551bd803fbdade51d674598ed45da3d54190a656cJohn McCall         /* Unreference.  If count = zero we'll really delete the buffer */
48651bd803fbdade51d674598ed45da3d54190a656cJohn McCall         _mesa_unreference_framebuffer(&fb);
487ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
488ed97649e9574b9d854fa4d6109c9333ae0993554John McCall         return;
489ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      }
49051bd803fbdade51d674598ed45da3d54190a656cJohn McCall      /* continue search */
49151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      prev = b;
49251bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
49351bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /* buffer not found in XMesaBufferList */
494cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall   _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n");
495cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall}
496cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
49751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**
499cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall * Copy X color table stuff from one XMesaBuffer to another.
500cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall */
501cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCallstatic void
502cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCallcopy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
50351bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
50451bd803fbdade51d674598ed45da3d54190a656cJohn McCall   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
50551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
506a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
507ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
508ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   dst->num_alloced = src->num_alloced;
509ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   MEMCPY(dst->alloced_colors, src->alloced_colors,
510ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt          sizeof(src->alloced_colors));
511ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt}
512ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
51334b41d939a1328f484511c6002ba2456db879a29Richard Smith
51434b41d939a1328f484511c6002ba2456db879a29Richard Smith
51534b41d939a1328f484511c6002ba2456db879a29Richard Smith/**********************************************************************/
51651bd803fbdade51d674598ed45da3d54190a656cJohn McCall/*****                   Misc Private Functions                   *****/
51751bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**********************************************************************/
518a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
51951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
52051bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**
521a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall * A replacement for XAllocColor.  This function should never
5229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * fail to allocate a color.  When XAllocColor fails, we return
5239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * the nearest matching color.  If we have to allocate many colors
5249d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * this function isn't too efficient; the XQueryColors() could be
5259d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * done just once.
5269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Written by Michael Pichler, Brian Paul, Mark Kilgard
5279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Input:  dpy - X display
5289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall *         cmap - X colormap
5299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall *         cmapSize - size of colormap
5309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * In/Out: color - the XColor struct
5319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Output:  exact - 1=exact color match, 0=closest match
5329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall *          alloced - 1=XAlloc worked, 0=XAlloc failed
5339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall */
5349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallstatic void
5359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallnoFaultXAllocColor( int client,
5369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                    XMesaDisplay *dpy,
53751bd803fbdade51d674598ed45da3d54190a656cJohn McCall                    XMesaColormap cmap,
53851bd803fbdade51d674598ed45da3d54190a656cJohn McCall                    int cmapSize,
539a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall                    XMesaColor *color,
54049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                    int *exact, int *alloced )
54149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall{
54249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall#ifdef XFree86Server
54349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall   Pixel *ppixIn;
544c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   xrgb *ctable;
545c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#else
546c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   /* we'll try to cache ctable for better remote display performance */
547c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   static Display *prevDisplay = NULL;
54851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   static XMesaColormap prevCmap = 0;
54951bd803fbdade51d674598ed45da3d54190a656cJohn McCall   static int prevCmapSize = 0;
550833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall   static XMesaColor *ctable = NULL;
551833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#endif
552833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall   XMesaColor subColor;
553833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall   int i, bestmatch;
55444f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis   double mindist;       /* 3*2^16^2 exceeds long int precision. */
55544f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis
556a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   (void) client;
557075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
558075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   /* First try just using XAllocColor. */
559075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara#ifdef XFree86Server
560075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   if (AllocColor(cmap,
561465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara		  &color->red, &color->green, &color->blue,
562e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara		  &color->pixel,
5639e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor		  client) == Success)
564a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#else
5653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   if (XAllocColor(dpy, cmap, color))
5663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif
5673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   {
5684714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor      *exact = 1;
569e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara      *alloced = 1;
5702494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor      return;
57151bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
572a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
57333500955d731c73717af52088b7fc0e7a85681e7John McCall   /* Alloc failed, search for closest match */
57433500955d731c73717af52088b7fc0e7a85681e7John McCall
57533500955d731c73717af52088b7fc0e7a85681e7John McCall   /* Retrieve color table entries. */
57694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor   /* XXX alloca candidate. */
57733500955d731c73717af52088b7fc0e7a85681e7John McCall#ifdef XFree86Server
57833500955d731c73717af52088b7fc0e7a85681e7John McCall   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
57933500955d731c73717af52088b7fc0e7a85681e7John McCall   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
58033500955d731c73717af52088b7fc0e7a85681e7John McCall   for (i = 0; i < cmapSize; i++) {
58144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis      ppixIn[i] = i;
58244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis   }
58333500955d731c73717af52088b7fc0e7a85681e7John McCall   QueryColors(cmap, cmapSize, ppixIn, ctable);
5847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor#else
5857536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor   if (prevDisplay != dpy || prevCmap != cmap
5867536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor       || prevCmapSize != cmapSize || !ctable) {
58751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      /* free previously cached color table */
58851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      if (ctable)
589c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall         _mesa_free(ctable);
590c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      /* Get the color table from X */
591c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
59254e14c4db764c0636160d26c5bbf491637c83a76John McCall      assert(ctable);
59354e14c4db764c0636160d26c5bbf491637c83a76John McCall      for (i = 0; i < cmapSize; i++) {
59454e14c4db764c0636160d26c5bbf491637c83a76John McCall         ctable[i].pixel = i;
59554e14c4db764c0636160d26c5bbf491637c83a76John McCall      }
596a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      XQueryColors(dpy, cmap, ctable, cmapSize);
59751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      prevDisplay = dpy;
59851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      prevCmap = cmap;
599a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      prevCmapSize = cmapSize;
600a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   }
6014dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner#endif
602a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
6032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* Find best match. */
6042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   bestmatch = -1;
605b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   mindist = 0.0;
606b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   for (i = 0; i < cmapSize; i++) {
60789eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
608b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
609b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
610b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      double dist = dr * dr + dg * dg + db * db;
611b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      if (bestmatch < 0 || dist < mindist) {
612b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         bestmatch = i;
613b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         mindist = dist;
614b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      }
615b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
616b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
617b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* Return result. */
618b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   subColor.red   = ctable[bestmatch].red;
619b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   subColor.green = ctable[bestmatch].green;
620b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   subColor.blue  = ctable[bestmatch].blue;
621b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* Try to allocate the closest match color.  This should only
62289eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis    * fail if the cell is read/write.  Otherwise, we're incrementing
623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    * the cell's reference count.
624b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    */
625b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#ifdef XFree86Server
626b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   if (AllocColor(cmap,
627b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner		  &subColor.red, &subColor.green, &subColor.blue,
6280558df2da807646e65d4fa290f4e92114af1a746Chris Lattner		  &subColor.pixel,
6290558df2da807646e65d4fa290f4e92114af1a746Chris Lattner		  client) == Success) {
6300558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else
63189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis   if (XAllocColor(dpy, cmap, &subColor)) {
6328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif
6330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      *alloced = 1;
6340558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
6350558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   else {
6360558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      /* do this to work around a problem reported by Frank Ortega */
6370558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.pixel = (unsigned long) bestmatch;
6380558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.red   = ctable[bestmatch].red;
6390558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.green = ctable[bestmatch].green;
6400558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.blue  = ctable[bestmatch].blue;
6410558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.flags = DoRed | DoGreen | DoBlue;
6420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      *alloced = 0;
6430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
6440558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server
6450558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   _mesa_free(ppixIn);
6460558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   _mesa_free(ctable);
6470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else
6480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   /* don't free table, save it for next time */
6490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif
6500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   *color = subColor;
6520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   *exact = 0;
6530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
6540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner/**
6580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Do setup for PF_GRAYSCALE pixel format.
6590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Note that buffer may be NULL.
6600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner */
6610558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic GLboolean
6620558df2da807646e65d4fa290f4e92114af1a746Chris Lattnersetup_grayscale(int client, XMesaVisual v,
6630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                XMesaBuffer buffer, XMesaColormap cmap)
6640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner{
6650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
6660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      return GL_FALSE;
6670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
6680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   if (buffer) {
6700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      XMesaBuffer prevBuffer;
6710558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6720558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      if (!cmap) {
6730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         return GL_FALSE;
6740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      }
6750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
6770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      if (prevBuffer &&
6780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner          (buffer->xm_visual->mesa_visual.rgbMode ==
6790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
6800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         /* Copy colormap stuff from previous XMesaBuffer which uses same
6810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
6820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner          */
683f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         copy_colortable_info(buffer, prevBuffer);
6840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      }
6850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      else {
6860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         /* Allocate 256 shades of gray */
6870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         int gray;
6880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         int colorsfailed = 0;
6890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         for (gray=0;gray<256;gray++) {
6900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
6910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
6920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
6930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            int exact, alloced;
6940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            XMesaColor xcol;
6950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            xcol.red   = (r << 8) | r;
6960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            xcol.green = (g << 8) | g;
6970558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            xcol.blue  = (b << 8) | b;
698eb7f96141f754150a92433286fa385910a22f494Sam Weinig            noFaultXAllocColor( client, v->display,
699eb7f96141f754150a92433286fa385910a22f494Sam Weinig                                cmap, GET_COLORMAP_SIZE(v),
700eb7f96141f754150a92433286fa385910a22f494Sam Weinig                                &xcol, &exact, &alloced );
701eb7f96141f754150a92433286fa385910a22f494Sam Weinig            if (!exact) {
702eb7f96141f754150a92433286fa385910a22f494Sam Weinig               colorsfailed++;
703eb7f96141f754150a92433286fa385910a22f494Sam Weinig            }
704eb7f96141f754150a92433286fa385910a22f494Sam Weinig            if (alloced) {
705eb7f96141f754150a92433286fa385910a22f494Sam Weinig               assert(buffer->num_alloced<256);
706eb7f96141f754150a92433286fa385910a22f494Sam Weinig               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
707b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor               buffer->num_alloced++;
708b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            }
709b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
710b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            /*OLD
711b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            assert(gray < 576);
712b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->color_table[gray*3+0] = xcol.pixel;
713b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->color_table[gray*3+1] = xcol.pixel;
714b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->color_table[gray*3+2] = xcol.pixel;
715b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            assert(xcol.pixel < 65536);
716b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
717b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
718b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
719b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            */
720b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->color_table[gray] = xcol.pixel;
721b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            assert(xcol.pixel < 65536);
722b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_r[xcol.pixel] = gray;
723b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_g[xcol.pixel] = gray;
724b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_b[xcol.pixel] = gray;
725b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         }
726b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
727b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
728b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            _mesa_warning(NULL,
729b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  "Note: %d out of 256 needed colors do not match exactly.\n",
730b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  colorsfailed );
731b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         }
732e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne      }
7330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
734b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   v->dithered_pf = PF_Grayscale;
736a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   v->undithered_pf = PF_Grayscale;
737b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   return GL_TRUE;
738b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
7418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/**
7433397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Setup RGB rendering for a window with a PseudoColor, StaticColor,
744f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
74551e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
74631d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * color.  While this function was originally designed just for 8-bit
747b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
748b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Dithering code contributed by Bob Mercier.
749b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */
750ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregorstatic GLboolean
751b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnersetup_dithered_color(int client, XMesaVisual v,
752b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                     XMesaBuffer buffer, XMesaColormap cmap)
753b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{
754b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
755b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      return GL_FALSE;
756b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
75749b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis
758b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   if (buffer) {
759b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      XMesaBuffer prevBuffer;
760b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
761b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      if (!cmap) {
7627f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         return GL_FALSE;
7637f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      }
7644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
765b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
7665b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek      if (prevBuffer &&
7676a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor          (buffer->xm_visual->mesa_visual.rgbMode ==
768a93e3b5bde9f0a7b59215f19f176f7d69881b81cSebastian Redl           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
769320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian         /* Copy colormap stuff from previous, matching XMesaBuffer.
770b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor          * Do this to avoid time spent in noFaultXAllocColor.
771b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor          */
772b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         copy_colortable_info(buffer, prevBuffer);
773b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      }
774b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      else {
775b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         /* Allocate X colors and initialize color_table[], red_table[], etc */
776b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         int r, g, b, i;
777b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         int colorsfailed = 0;
778b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         for (r = 0; r < DITH_R; r++) {
779b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            for (g = 0; g < DITH_G; g++) {
780b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor               for (b = 0; b < DITH_B; b++) {
78184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne                  XMesaColor xcol;
782cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                  int exact, alloced;
783837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(DITH_R-1),65535);
78484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535);
78584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(DITH_B-1),65535);
786ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt                  noFaultXAllocColor( client, v->display,
787d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor                                      cmap, GET_COLORMAP_SIZE(v),
788d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor                                      &xcol, &exact, &alloced );
789837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor                  if (!exact) {
790837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor                     colorsfailed++;
791cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                  }
792b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  if (alloced) {
7932f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner                     assert(buffer->num_alloced<256);
794b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
795b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                     buffer->num_alloced++;
796b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  }
797f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth                  i = DITH_MIX( r, g, b );
7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  assert(i < 576);
799b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  buffer->color_table[i] = xcol.pixel;
8002f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner                  assert(xcol.pixel < 65536);
801b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1);
802b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1);
803b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1);
804b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor               }
80561d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor            }
80661d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor         }
807b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
808b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
809b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            _mesa_warning(NULL,
810b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  "Note: %d out of %d needed colors do not match exactly.\n",
811b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  colorsfailed, DITH_R * DITH_G * DITH_B );
812b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         }
813b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      }
814b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
815b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
816b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   v->dithered_pf = PF_Dither;
817b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   v->undithered_pf = PF_Lookup;
818b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   return GL_TRUE;
819b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
820b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
821b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
822b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/**
823b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
824b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
825b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Special dithering tables have to be initialized.
826b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */
827a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCallstatic void
828d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffsetup_8bit_hpcr(XMesaVisual v)
829b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor{
830b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
831b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
832b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    * on the root window AND the colormap obtainable by XGetRGBColormaps
833b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    * for that atom must be set on the window.  (see also tkInitWindow)
834b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    * If that colormap is not set, the output will look stripy.
835b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    */
836b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
837b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* Setup color tables with gamma correction */
838b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   int i;
839b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   double g;
840b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
841b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   g = 1.0 / v->RedGamma;
842b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   for (i=0; i<256; i++) {
843b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g ));
8440ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
8450ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   }
8460ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8470ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   g = 1.0 / v->GreenGamma;
8480ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   for (i=0; i<256; i++) {
8490ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g ));
8500ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
8510ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   }
8520ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8530ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   g = 1.0 / v->BlueGamma;
8540ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   for (i=0; i<256; i++) {
8550ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g ));
8560ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
8570ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   }
8580ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
8590ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   v->dithered_pf = PF_HPCR;
8600ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8610ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   /* which method should I use to clear */
862b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* GL_FALSE: keep the ordinary method  */
863b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* GL_TRUE : clear with dither pattern */
8640ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
865b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
8660ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   if (v->hpcr_clear_flag) {
8670ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
8680ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner                                               DefaultRootWindow(v->display),
8690ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner                                               16, 2, 8);
870b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#ifndef XFree86Server
871b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
872b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                                       0, 0, 16, 2, AllPlanes, ZPixmap);
873b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#endif
874b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   }
875b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
876b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
877b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
878b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor/**
879b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * Setup RGB rendering for a window with a True/DirectColor visual.
880b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor */
881b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregorstatic void
882b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregorsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap)
883b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor{
884b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   unsigned long rmask, gmask, bmask;
885b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   (void) buffer;
886b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   (void) cmap;
887b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
888b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* Compute red multiplier (mask) and bit shift */
889b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->rshift = 0;
890b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   rmask = GET_REDMASK(v);
891b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   while ((rmask & 1)==0) {
892b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      v->rshift++;
893b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      rmask = rmask >> 1;
894b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   }
895b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
896b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* Compute green multiplier (mask) and bit shift */
897b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->gshift = 0;
898a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor   gmask = GET_GREENMASK(v);
899a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor   while ((gmask & 1)==0) {
900a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor      v->gshift++;
9014800a5c79023271408af49797e09be32aca93232Douglas Gregor      gmask = gmask >> 1;
902f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth   }
9034800a5c79023271408af49797e09be32aca93232Douglas Gregor
9044800a5c79023271408af49797e09be32aca93232Douglas Gregor   /* Compute blue multiplier (mask) and bit shift */
9054800a5c79023271408af49797e09be32aca93232Douglas Gregor   v->bshift = 0;
906b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   bmask = GET_BLUEMASK(v);
907b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   while ((bmask & 1)==0) {
908b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      v->bshift++;
909b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      bmask = bmask >> 1;
910b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
911e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
912e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   /*
9131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    * Compute component-to-pixel lookup tables and dithering kernel
914e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    */
915e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   {
916e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      static GLubyte kernel[16] = {
917e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor          0*16,  8*16,  2*16, 10*16,
918e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         12*16,  4*16, 14*16,  6*16,
919e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor          3*16, 11*16,  1*16,  9*16,
920e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         15*16,  7*16, 13*16,  5*16,
9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      };
922832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor      GLint rBits = _mesa_bitcount(rmask);
923e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      GLint gBits = _mesa_bitcount(gmask);
9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      GLint bBits = _mesa_bitcount(bmask);
925832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor      GLint maxBits;
926e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      GLuint i;
9271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
928e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
929e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=0; i<=rmask; i++)
930832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
931e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=0; i<=gmask; i++)
932e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      for (i=0; i<=bmask; i++)
934e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
935e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
936e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      /* convert RGB values from [0,255] to pixel components */
9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
938e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=0;i<256;i++) {
939e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         GLint r = gamma_adjust(v->RedGamma,   i, 255);
940e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         GLint g = gamma_adjust(v->GreenGamma, i, 255);
941e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
942e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
944e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
945e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      }
946b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      /* overflow protection */
9473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      for (i=256;i<512;i++) {
948832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor         v->RtoPixel[i] = v->RtoPixel[255];
9498e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis         v->GtoPixel[i] = v->GtoPixel[255];
9502bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor         v->BtoPixel[i] = v->BtoPixel[255];
951b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      }
952e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
953e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      /* setup dithering kernel */
954e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      maxBits = rBits;
95577f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl      if (gBits > maxBits)  maxBits = gBits;
9568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (bBits > maxBits)  maxBits = bBits;
9573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      for (i=0;i<16;i++) {
9583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         v->Kernel[i] = kernel[i] >> maxBits;
959e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      }
960e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
961e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      v->undithered_pf = PF_Truecolor;
96277f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor;
96377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl   }
964e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
9651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   /*
966e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    * Now check for TrueColor visuals which we can optimize.
9678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    */
9688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (   GET_REDMASK(v)  ==0x0000ff
9698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl       && GET_GREENMASK(v)==0x00ff00
970e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor       && GET_BLUEMASK(v) ==0xff0000
971e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor       && CHECK_BYTE_ORDER(v)
972832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor       && v->BitsPerPixel==32
97377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
97448d2c3f7c3ca48da05436afdc8426a245294ee65Jonathan D. Turner      /* common 32 bpp config used on SGI, Sun */
97548d2c3f7c3ca48da05436afdc8426a245294ee65Jonathan D. Turner      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */
97677f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl   }
9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   else if (GET_REDMASK(v)  == 0xff0000
97831d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor         && GET_GREENMASK(v)== 0x00ff00
979b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         && GET_BLUEMASK(v) == 0x0000ff
980b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         && CHECK_BYTE_ORDER(v)
981b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){
9828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (v->BitsPerPixel==32) {
983b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         /* if 32 bpp, and visual indicates 8 bpp alpha channel */
984b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8)
985b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor            v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */
986fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer         else
9871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */
988fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer      }
989b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      else if (v->BitsPerPixel == 24) {
990aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam         v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */
9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
992e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   }
993b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor   else if (GET_REDMASK(v)  ==0xf800
9948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl       &&   GET_GREENMASK(v)==0x07e0
995ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar       &&   GET_BLUEMASK(v) ==0x001f
99631d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor       && CHECK_BYTE_ORDER(v)
99731d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor       && v->BitsPerPixel==16
99831d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
99931d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor      /* 5-6-5 RGB */
1000b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor      v->undithered_pf = PF_5R6G5B;
100111a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam      v->dithered_pf = PF_Dither_5R6G5B;
10028e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   }
10038e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   else if (GET_REDMASK(v)  ==0xe0
10048e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis       &&   GET_GREENMASK(v)==0x1c
10058e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis       &&   GET_BLUEMASK(v) ==0x03
10068e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis       && CHECK_FOR_HPCR(v)) {
10078e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis      /* 8-bit HP color recovery */
10088e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis      setup_8bit_hpcr( v );
10098e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   }
10108e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis}
10118e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10128e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10138e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10148e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis/**
10158e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis * Setup RGB rendering for a window with a monochrome visual.
10168e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis */
10178e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidisstatic void
10188e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidissetup_monochrome( XMesaVisual v, XMesaBuffer b )
1019f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek{
1020f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek   (void) b;
10218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   v->dithered_pf = v->undithered_pf = PF_1Bit;
1022f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek   /* if black=1 then we must flip pixel values */
1023f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
1024445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor}
10258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1026f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek
1027f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek
10282bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor/**
10292bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * When a context is bound for the first time, we can finally finish
10302bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * initializing the context's visual and buffer information.
1031a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * \param v  the XMesaVisual to initialize
10320a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \param b  the XMesaBuffer to initialize (may be NULL)
10330a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \param rgb_flag  TRUE = RGBA mode, FALSE = color index mode
10340a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \param window  the window/pixmap we're rendering into
10350a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \param cmap  the colormap associated with the window/pixmap
10360a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \return GL_TRUE=success, GL_FALSE=failure
10370a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor */
1038eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruthstatic GLboolean
10390a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregorinitialize_visual_and_buffer(int client, XMesaVisual v, XMesaBuffer b,
10400a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                             GLboolean rgb_flag, XMesaDrawable window,
10410a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                             XMesaColormap cmap)
10420a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor{
10437e7fbd05a5dfdb0addfc8b5af2fcbed8c7b5fb87Peter Collingbourne   ASSERT(!b || b->xm_visual == v);
10440a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
1045dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer   /* Save true bits/pixel */
1046dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer   v->BitsPerPixel = bits_per_pixel(v);
10470a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   assert(v->BitsPerPixel > 0);
10480a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10490a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   if (rgb_flag == GL_FALSE) {
10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      /* COLOR-INDEXED WINDOW:
10510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor       * Even if the visual is TrueColor or DirectColor we treat it as
10520a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor       * being color indexed.  This is weird but might be useful to someone.
105311a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam       */
1054412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian      v->dithered_pf = v->undithered_pf = PF_Index;
105511a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam      v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v);
1056412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian   }
1057f84109ee6aeffb09366bd70c8593ce1b7818b1adFariborz Jahanian   else {
1058c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek      /* RGB WINDOW:
1059c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek       * We support RGB rendering into almost any kind of visual.
106074da19fc3a52d7e3005eeb7a7833859da84fd12aDouglas Gregor       */
10614c9d8d0eca5ca635d9a30222f690db9140e98325Fariborz Jahanian      const int xclass = v->mesa_visual.visualType;
10621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
10630a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor	 setup_truecolor( v, b, cmap );
10640a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      }
10650a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) {
1066b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman	 setup_monochrome( v, b );
10670a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      }
1068da4b7cf09ebfd4e4098b516081fa9dae2f5c99e0Anders Carlsson      else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) {
10697da99b05aa9482e76b2954223b5652469004aec2Anders Carlsson         if (!setup_grayscale( client, v, b, cmap )) {
10707da99b05aa9482e76b2954223b5652469004aec2Anders Carlsson            return GL_FALSE;
10710a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor         }
10726f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor      }
10730a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR)
10740a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
10750a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor	 if (!setup_dithered_color( client, v, b, cmap )) {
10760a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor            return GL_FALSE;
1077ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner         }
1078ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner      }
1079972d954bd216c86a961bb7f81c53af85de17c2f0Douglas Gregor      else {
10800a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor	 _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n");
10810a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor	 return GL_FALSE;
10820a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      }
10830a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      v->mesa_visual.indexBits = 0;
10840a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10850a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      if (_mesa_getenv("MESA_NO_DITHER")) {
1086a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner	 v->dithered_pf = v->undithered_pf;
1087a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner      }
10880a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   }
10890a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10910a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   /*
10920a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    * If MESA_INFO env var is set print out some debugging info
10930a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    * which can help Brian figure out what's going on when a user
10940a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    * reports bugs.
10950a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    */
10960a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   if (_mesa_getenv("MESA_INFO")) {
10970a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      _mesa_printf("X/Mesa visual = %p\n", (void *) v);
10980a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
10990d2d1bcef51993ca3fd957e45fb7ec85e45016e5Chandler Carruth      _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
1100a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson      _mesa_printf("X/Mesa level = %d\n", v->mesa_visual.level);
1101a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson      _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
110215b91764d08e886391c865c4a444d7b51141c284Eli Friedman      _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
110315b91764d08e886391c865c4a444d7b51141c284Eli Friedman   }
1104a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson
1105b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis   if (b && window) {
1106b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis      /* Do window-specific initializations */
1107b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis
11080a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      /* these should have been set in create_xmesa_buffer */
11090a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      ASSERT(b->frontxrb->drawable == window);
1110ab8e281b32a3d3b9b18257d26844362bf806ecdcDaniel Dunbar      ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window);
11110a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
1112b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman      /* Setup for single/double buffering */
111308a53269b1f8241e2e6797e845abbe640fb18253Peter Collingbourne      if (v->mesa_visual.doubleBufferMode) {
11149c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump         /* Double buffered */
111584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne         b->shm = check_for_xshm( v->display );
111692f5822df6a0d7571df44b5d279ed4f017fbb0e6Anders Carlsson      }
1117a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor
1118cfe9af250f466e7e38becea4428990448ae07737Roman Divacky      /* X11 graphics contexts */
1119f85e193739c953358c865005855253af4f68a497John McCall#ifdef XFree86Server
1120f85e193739c953358c865005855253af4f68a497John McCall      b->gc = CreateScratchGC(v->display, window->depth);
11218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#else
11220a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      b->gc = XCreateGC( v->display, window, 0, NULL );
11230a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor#endif
112414f79002e58556798e86168c63e48d533287eda5Douglas Gregor      XMesaSetFunction( v->display, b->gc, GXcopy );
11254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /* cleargc - for glClear() */
11274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server
11284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      b->cleargc = CreateScratchGC(v->display, window->depth);
11294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#else
11303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      b->cleargc = XCreateGC( v->display, window, 0, NULL );
11314fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#endif
11324fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      XMesaSetFunction( v->display, b->cleargc, GXcopy );
11334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      /*
113574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
113674e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner       * Patch contributed by Michael Pichler May 15, 1995.
11374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       */
11384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server
11392596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar      b->swapgc = CreateScratchGC(v->display, window->depth);
11404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      {
11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         CARD32 v[1];
11421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         v[0] = FALSE;
11435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner         dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
11444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
11454fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#else
11464fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      {
114774e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner         XGCValues gcvalues;
11484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         gcvalues.graphics_exposures = False;
11494fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         b->swapgc = XCreateGC(v->display, window,
11504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                               GCGraphicsExposures, &gcvalues);
11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
11525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#endif
11534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      XMesaSetFunction( v->display, b->swapgc, GXcopy );
11544fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /*
11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump       * Set fill style and tile pixmap once for all for HPCR stuff
11565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner       * (instead of doing it each time in clear_color_HPCR_pixmap())
11574fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       * Initialize whole stuff
11584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       * Patch contributed by Jacques Leroy March 8, 1998.
11594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       */
11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) {
116174e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner         int i;
116274e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner         for (i = 0; i < 16; i++) {
116374e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner            XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
116474e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner            XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
116574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner         }
11664fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap,
11674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                       b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
11684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
11694fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
11704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
11714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      /* Initialize the row buffer XImage for use in write_color_span() */
1173a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#ifdef XFree86Server
11744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1,
11754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor				     (char *)MALLOC(MAX_WIDTH*4));
11763397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#else
11774fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      b->rowimage = XCreateImage( v->display,
11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  v->visinfo->visual,
11794fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                                  v->visinfo->depth,
1180e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                                  ZPixmap, 0,           /*format, offset*/
11815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                  (char*) MALLOC(MAX_WIDTH*4),  /*data*/
11821e5f83ba515157dc7f263dc91b1d51c7a5754c35Chris Lattner                                  MAX_WIDTH, 1,         /*width, height*/
1183e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                                  32,                   /*bitmap_pad*/
11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  0                     /*bytes_per_line*/ );
11854fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#endif
11861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (!b->rowimage)
11874fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         return GL_FALSE;
11884fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   }
11894fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11904fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   return GL_TRUE;
11914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
11924fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor/*
11964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Convert an RGBA color to a pixel value.
11974fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor */
11988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlunsigned long
11994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorxmesa_color_to_pixel(GLcontext *ctx,
12004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                     GLubyte r, GLubyte g, GLubyte b, GLubyte a,
12014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                     GLuint pixelFormat)
12024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{
12034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   XMesaContext xmesa = XMESA_CONTEXT(ctx);
12044fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   switch (pixelFormat) {
12054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      case PF_Index:
12068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         return 0;
12074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      case PF_Truecolor:
12084fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         {
1209ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar            unsigned long p;
12104fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            PACK_TRUECOLOR( p, r, g, b );
12114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            return p;
12124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         }
121314f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_8A8B8G8R:
121414f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return PACK_8A8B8G8R( r, g, b, a );
121514f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_8A8R8G8B:
121614f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return PACK_8A8R8G8B( r, g, b, a );
121714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_8R8G8B:
1218c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor         /* fall through */
121914f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_8R8G8B24:
122014f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return PACK_8R8G8B( r, g, b );
12218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PF_5R6G5B:
122214f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return PACK_5R6G5B( r, g, b );
122314f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_Dither:
122414f79002e58556798e86168c63e48d533287eda5Douglas Gregor         {
122514f79002e58556798e86168c63e48d533287eda5Douglas Gregor            DITHER_SETUP;
12262d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor            return DITHER( 1, 0, r, g, b );
12272d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor         }
12282d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor      case PF_1Bit:
122914f79002e58556798e86168c63e48d533287eda5Douglas Gregor         /* 382 = (3*255)/2 */
1230c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
123114f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_HPCR:
123214f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return DITHER_HPCR(1, 1, r, g, b);
123314f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_Lookup:
123414f79002e58556798e86168c63e48d533287eda5Douglas Gregor         {
1235c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor            LOOKUP_SETUP;
123614f79002e58556798e86168c63e48d533287eda5Douglas Gregor            return LOOKUP( r, g, b );
123714f79002e58556798e86168c63e48d533287eda5Douglas Gregor         }
12388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PF_Grayscale:
123914f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return GRAY_RGB( r, g, b );
124014f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_Dither_True:
124114f79002e58556798e86168c63e48d533287eda5Douglas Gregor         /* fall through */
124214f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_Dither_5R6G5B:
124314f79002e58556798e86168c63e48d533287eda5Douglas Gregor         {
1244c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor            unsigned long p;
124514f79002e58556798e86168c63e48d533287eda5Douglas Gregor            PACK_TRUEDITHER(p, 1, 0, r, g, b);
124614f79002e58556798e86168c63e48d533287eda5Douglas Gregor            return p;
124714f79002e58556798e86168c63e48d533287eda5Douglas Gregor         }
124814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      default:
1249c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor         _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel");
125014f79002e58556798e86168c63e48d533287eda5Douglas Gregor   }
125114f79002e58556798e86168c63e48d533287eda5Douglas Gregor   return 0;
12528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
125314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1254c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
125514f79002e58556798e86168c63e48d533287eda5Douglas Gregor#define NUM_VISUAL_TYPES   6
125614f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1257f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth/**
1258f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth * Convert an X visual type to a GLX visual type.
1259f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth *
126014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.)
126114f79002e58556798e86168c63e48d533287eda5Douglas Gregor *        to be converted.
1262f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth * \return If \c visualType is a valid X visual type, a GLX visual type will
126314f79002e58556798e86168c63e48d533287eda5Douglas Gregor *         be returned.  Otherwise \c GLX_NONE will be returned.
126414f79002e58556798e86168c63e48d533287eda5Douglas Gregor *
126514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \note
126614f79002e58556798e86168c63e48d533287eda5Douglas Gregor * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the
1267f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor * DRI CVS tree.
1268c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor */
126914f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic GLint
127014f79002e58556798e86168c63e48d533287eda5Douglas Gregorxmesa_convert_from_x_visual_type( int visualType )
1271cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{
1272cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    static const int glx_visual_types[ NUM_VISUAL_TYPES ] = {
1273cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor	GLX_STATIC_GRAY,  GLX_GRAY_SCALE,
1274cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor	GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
1275cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor	GLX_TRUE_COLOR,   GLX_DIRECT_COLOR
1276cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    };
1277b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1278b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    return ( (unsigned) visualType < NUM_VISUAL_TYPES )
1279b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor	? glx_visual_types[ visualType ] : GLX_NONE;
1280b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor}
1281cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1282cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1283cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/**********************************************************************/
1284cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/*****                       Public Functions                     *****/
1285cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/**********************************************************************/
1286cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1287cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1288cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/*
1289cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Create a new X/Mesa visual.
1290cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Input:  display - X11 display
1291cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         visinfo - an XVisualInfo pointer
1292cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         rgb_flag - GL_TRUE = RGB mode,
1293cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *                    GL_FALSE = color index mode
1294cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         alpha_flag - alpha buffer requested?
1295cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         db_flag - GL_TRUE = double-buffered,
1296cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *                   GL_FALSE = single buffered
1297cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         stereo_flag - stereo visual?
1298cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1299cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *                       GL_FALSE = use an off-screen pixmap for back buffer
13005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner *         depth_size - requested bits/depth values, or zero
1301cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         stencil_size - requested bits/stencil values, or zero
1302cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         accum_red_size - requested bits/red accum values, or zero
1303cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         accum_green_size - requested bits/green accum values, or zero
1304b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         accum_blue_size - requested bits/blue accum values, or zero
1305cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         accum_alpha_size - requested bits/alpha accum values, or zero
1306cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         num_samples - number of samples/pixel if multisampling, or zero
1307cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         level - visual level, usually 0
1308cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         visualCaveat - ala the GLX extension, usually GLX_NONE
13095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * Return;  a new XMesaVisual or 0 if error.
1310cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */
1311cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorPUBLIC
1312cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
13135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                               XMesaVisualInfo visinfo,
1314cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLboolean rgb_flag,
1315cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLboolean alpha_flag,
1316cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLboolean db_flag,
1317cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLboolean stereo_flag,
1318b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                               GLboolean ximage_flag,
1319b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                               GLint depth_size,
1320b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                               GLint stencil_size,
1321b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                               GLint accum_red_size,
1322b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                               GLint accum_green_size,
1323cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint accum_blue_size,
1324cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint accum_alpha_size,
1325cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint num_samples,
1326cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint level,
1327cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint visualCaveat )
1328cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{
1329cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   char *gamma;
1330b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   XMesaVisual v;
1331b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   GLint red_bits, green_bits, blue_bits, alpha_bits;
1332b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1333b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor#ifndef XFree86Server
1334b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   /* For debugging only */
1335b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   if (_mesa_getenv("MESA_XSYNC")) {
1336b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      /* This makes debugging X easier.
1337b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor       * In your debugger, set a breakpoint on _XError to stop when an
1338b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor       * X protocol error is generated.
1339b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor       */
1340b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      XSynchronize( display, 1 );
1341b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   }
1342b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor#endif
1343b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1344b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1345b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   if (!v) {
1346b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      return NULL;
1347b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   }
1348cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1349cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->display = display;
1350b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1351b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   /* Save a copy of the XVisualInfo struct because the user may X_mesa_free()
1352b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    * the struct but we may need some of the information contained in it
1353cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    * at a later time.
1354cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    */
1355cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#ifndef XFree86Server
1356cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1357cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   if(!v->visinfo) {
1358cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      _mesa_free(v);
1359cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      return NULL;
1360cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   }
1361832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
13625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#endif
1363cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1364cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   /* check for MESA_GAMMA environment variable */
1365cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   gamma = _mesa_getenv("MESA_GAMMA");
1366cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   if (gamma) {
1367cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1368cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1369cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
13705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1371cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1372cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   }
1373cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   else {
1374cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1375cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   }
1376cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1377cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->ximage_flag = ximage_flag;
1378cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1379cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#ifdef XFree86Server
1380cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   /* We could calculate these values by ourselves.  nplanes is either the sum
1381cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    * of the red, green, and blue bits or the number index bits.
1382cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    * ColormapEntries is either (1U << index_bits) or
1383cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    * (1U << max(redBits, greenBits, blueBits)).
1384cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    */
1385cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   assert(visinfo->nplanes > 0);
1386cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->nplanes = visinfo->nplanes;
1387cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->ColormapEntries = visinfo->ColormapEntries;
1388cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1389cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.redMask = visinfo->redMask;
1390cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.greenMask = visinfo->greenMask;
1391cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.blueMask = visinfo->blueMask;
1392cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.visualID = visinfo->vid;
1393cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.screen = 0; /* FIXME: What should be done here? */
1394cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#else
1395cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.redMask = visinfo->red_mask;
1396cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.greenMask = visinfo->green_mask;
1397cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.blueMask = visinfo->blue_mask;
1398cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.visualID = visinfo->visualid;
1399cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.screen = visinfo->screen;
1400cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#endif
1401cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1402cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus))
1403cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class);
1404cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#else
1405cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class);
1406cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#endif
1407cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1408cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.visualRating = visualCaveat;
1409cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1410cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   if (alpha_flag)
1411cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      v->mesa_visual.alphaBits = 8;
1412b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1413cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
1414cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1415cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   {
1416b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      const int xclass = v->mesa_visual.visualType;
1417cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
1418cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         red_bits   = _mesa_bitcount(GET_REDMASK(v));
1419cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         green_bits = _mesa_bitcount(GET_GREENMASK(v));
1420cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         blue_bits  = _mesa_bitcount(GET_BLUEMASK(v));
1421b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      }
1422b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      else {
1423cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         /* this is an approximation */
1424cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         int depth;
1425cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         depth = GET_VISUAL_DEPTH(v);
1426cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         red_bits = depth / 3;
1427cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         depth -= red_bits;
1428cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         green_bits = depth / 2;
1429cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         depth -= green_bits;
143014f79002e58556798e86168c63e48d533287eda5Douglas Gregor         blue_bits = depth;
143114f79002e58556798e86168c63e48d533287eda5Douglas Gregor         alpha_bits = 0;
143214f79002e58556798e86168c63e48d533287eda5Douglas Gregor         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
143314f79002e58556798e86168c63e48d533287eda5Douglas Gregor      }
143414f79002e58556798e86168c63e48d533287eda5Douglas Gregor      alpha_bits = v->mesa_visual.alphaBits;
143514f79002e58556798e86168c63e48d533287eda5Douglas Gregor   }
143614f79002e58556798e86168c63e48d533287eda5Douglas Gregor
143714f79002e58556798e86168c63e48d533287eda5Douglas Gregor   _mesa_initialize_visual( &v->mesa_visual,
1438a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl                            rgb_flag, db_flag, stereo_flag,
1439e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                            red_bits, green_bits,
1440832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor                            blue_bits, alpha_bits,
14417f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                            v->mesa_visual.indexBits,
14427f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                            depth_size,
1443f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner                            stencil_size,
14448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                            accum_red_size, accum_green_size,
144514f79002e58556798e86168c63e48d533287eda5Douglas Gregor                            accum_blue_size, accum_alpha_size,
144614f79002e58556798e86168c63e48d533287eda5Douglas Gregor                            0 );
1447828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner
1448828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner   /* XXX minor hack */
1449828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner   v->mesa_visual.level = level;
1450f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth   return v;
14517f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor}
145214f79002e58556798e86168c63e48d533287eda5Douglas Gregor
145314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1454090d9b53e32bb30d9e74de895bb59b409bd49e00Chris LattnerPUBLIC
14554cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidisvoid XMesaDestroyVisual( XMesaVisual v )
14564cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis{
14574cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis#ifndef XFree86Server
14587f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   _mesa_free(v->visinfo);
1459f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif
1460f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   _mesa_free(v);
14610fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl}
1462bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor
1463f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
146411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam
14657f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor/**
14667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor * Create a new XMesaContext.
14677f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor * \param v  the XMesaVisual
146814f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param share_list  another XMesaContext with which to share display
146914f79002e58556798e86168c63e48d533287eda5Douglas Gregor *                    lists or NULL if no sharing is wanted.
147014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \return an XMesaContext or NULL if error.
14714cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis */
14728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlPUBLIC
14734cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
14744cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis{
14758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   static GLboolean firstTime = GL_TRUE;
147614f79002e58556798e86168c63e48d533287eda5Douglas Gregor   XMesaContext c;
1477f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth   GLcontext *mesaCtx;
14787f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   struct dd_function_table functions;
147914f79002e58556798e86168c63e48d533287eda5Douglas Gregor   TNLcontext *tnl;
148014f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1481f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   if (firstTime) {
1482f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      _glthread_INIT_MUTEX(_xmesa_lock);
148314f79002e58556798e86168c63e48d533287eda5Douglas Gregor      firstTime = GL_FALSE;
148414f79002e58556798e86168c63e48d533287eda5Douglas Gregor   }
148514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
148614f79002e58556798e86168c63e48d533287eda5Douglas Gregor   /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */
1487bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
148814f79002e58556798e86168c63e48d533287eda5Douglas Gregor   if (!c)
148914f79002e58556798e86168c63e48d533287eda5Douglas Gregor      return NULL;
1490b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis
1491b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis   mesaCtx = &(c->mesa);
1492b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis
1493b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis   /* initialize with default driver functions, then plug in XMesa funcs */
149414f79002e58556798e86168c63e48d533287eda5Douglas Gregor   _mesa_init_driver_functions(&functions);
149514f79002e58556798e86168c63e48d533287eda5Douglas Gregor   xmesa_init_driver_functions(v, &functions);
14961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual,
14972d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor                      share_list ? &(share_list->mesa) : (GLcontext *) NULL,
1498b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis                      &functions, (void *) c)) {
1499b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis      _mesa_free(c);
15002d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor      return NULL;
1501e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   }
1502b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis
1503fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer   _mesa_enable_sw_extensions(mesaCtx);
15042c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson   _mesa_enable_1_3_extensions(mesaCtx);
15052c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson   _mesa_enable_1_4_extensions(mesaCtx);
15062c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson   _mesa_enable_1_5_extensions(mesaCtx);
15072c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson   _mesa_enable_2_0_extensions(mesaCtx);
15082c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson#if ENABLE_EXT_texure_compression_s3tc
15092c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson    if (c->Mesa_DXTn) {
15102c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson       _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc");
1511fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer       _mesa_enable_extension(mesaCtx, "GL_S3_s3tc");
1512aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam    }
15131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1");
1514e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor#endif
1515ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar#if ENABLE_EXT_timer_query
151614f79002e58556798e86168c63e48d533287eda5Douglas Gregor    _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query");
151714f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif
151814f79002e58556798e86168c63e48d533287eda5Douglas Gregor
151914f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server
152014f79002e58556798e86168c63e48d533287eda5Douglas Gregor   /* If we're running in the X server, do bounds checking to prevent
152114f79002e58556798e86168c63e48d533287eda5Douglas Gregor    * segfaults and server crashes!
152214f79002e58556798e86168c63e48d533287eda5Douglas Gregor    */
152336c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor   mesaCtx->Const.CheckArrayBounds = GL_TRUE;
1524e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner#endif
152514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1526ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar   /* finish up xmesa context initializations */
15275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner   c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE;
152814f79002e58556798e86168c63e48d533287eda5Douglas Gregor   c->xm_visual = v;
15298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1530c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor   c->display = v->display;
15315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1532ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar
15337f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   /* Initialize the software rasterizer and helper modules.
1534f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    */
1535f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   if (!_swrast_CreateContext( mesaCtx ) ||
1536f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor       !_vbo_CreateContext( mesaCtx ) ||
153714f79002e58556798e86168c63e48d533287eda5Douglas Gregor       !_tnl_CreateContext( mesaCtx ) ||
153814f79002e58556798e86168c63e48d533287eda5Douglas Gregor       !_swsetup_CreateContext( mesaCtx )) {
1539f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth      _mesa_free_context_data(&c->mesa);
15401728762d5a8cfaf8d64385f47b311e84de1ae7a2Chandler Carruth      _mesa_free(c);
154178df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth      return NULL;
154278df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth   }
154378df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth
154414f79002e58556798e86168c63e48d533287eda5Douglas Gregor   /* tnl setup */
1545f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor   tnl = TNL_CONTEXT(mesaCtx);
1546f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   tnl->Driver.RunPipeline = _tnl_run_pipeline;
1547bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor   /* swrast setup */
1548f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   xmesa_register_swrast_functions( mesaCtx );
1549f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor   _swsetup_Wakeup(mesaCtx);
1550f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
155114f79002e58556798e86168c63e48d533287eda5Douglas Gregor   return c;
155214f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
155314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
15547f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
1555bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor
15567f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas GregorPUBLIC
15577f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregorvoid XMesaDestroyContext( XMesaContext c )
15582eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor{
15593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   GLcontext *mesaCtx = &c->mesa;
15607f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#ifdef FX
15617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   XMesaBuffer xmbuf = XMESA_BUFFER(mesaCtx->DrawBuffer);
15627f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
15638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (xmbuf && xmbuf->FXctx)
15647f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      fxMesaDestroyContext(xmbuf->FXctx);
1565f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif
15667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   _swsetup_DestroyContext( mesaCtx );
15677f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   _swrast_DestroyContext( mesaCtx );
15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   _tnl_DestroyContext( mesaCtx );
15697f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   _vbo_DestroyContext( mesaCtx );
15708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   _mesa_free_context_data( mesaCtx );
15717f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   _mesa_free( c );
1572f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor}
15736e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
15747f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
15754cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15764cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis/**
15774cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * Private function for creating an XMesaBuffer which corresponds to an
15784cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * X window or pixmap.
15794cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * \param v  the window's XMesaVisual
15804cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * \param w  the window we're wrapping
15814cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * \return  new XMesaBuffer or NULL if error
15824cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis */
15834cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisPUBLIC XMesaBuffer
15844cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w)
15854cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis{
15864cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis#ifndef XFree86Server
15873397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   XWindowAttributes attr;
15887f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#endif
15898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   int client = 0;
1590f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   XMesaBuffer b;
1591f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   XMesaColormap cmap;
1592f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1593f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   assert(v);
1594f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   assert(w);
1595f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1596f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   /* Check that window depth matches visual depth */
1597f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#ifdef XFree86Server
1598f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   client = CLIENT_ID(((XMesaDrawable)w)->id);
1599f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1600f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) {
1601f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
1602f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                    GET_VISUAL_DEPTH(v), ((XMesaDrawable) w)->depth);
1603f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      return NULL;
1604f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   }
1605f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#else
1606f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   XGetWindowAttributes( v->display, w, &attr );
1607f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1608f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   if (GET_VISUAL_DEPTH(v) != attr.depth) {
1609f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
1610f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                    GET_VISUAL_DEPTH(v), attr.depth);
1611f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      return NULL;
1612f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   }
1613f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif
1614f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1615f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   /* Find colormap */
1616f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#ifdef XFree86Server
1617f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1618f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#else
1619f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   if (attr.colormap) {
1620f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      cmap = attr.colormap;
1621f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   }
1622f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   else {
1623f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
1624f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      /* this is weird, a window w/out a colormap!? */
1625f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      /* OK, let's just allocate a new one and hope for the best */
1626f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1627f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   }
1628f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif
1629f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1630f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap);
1631f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   if (!b)
1632f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      return NULL;
163314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
163414f79002e58556798e86168c63e48d533287eda5Douglas Gregor   if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
16354fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                                      (XMesaDrawable) w, cmap )) {
16364fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      xmesa_free_buffer(b);
16374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      return NULL;
16384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   }
16399c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16409c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   return b;
16419c7361006b8cd95333958150dd0c803261807b68Douglas Gregor}
16429c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16439c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16449c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16459c7361006b8cd95333958150dd0c803261807b68Douglas Gregor/**
16469c7361006b8cd95333958150dd0c803261807b68Douglas Gregor * Create a new XMesaBuffer from an X pixmap.
16470b1fb988012da21d996c43e36867787a7a07b889Chris Lattner *
16480b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * \param v    the XMesaVisual
16490b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * \param p    the pixmap
1650a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or
16517c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *             \c GLX_DIRECT_COLOR visual for the pixmap
16527c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * \returns new XMesaBuffer or NULL if error
1653c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner */
1654c1f9d828c733ec1eba06d01070735d1f36fda733Chris LattnerPUBLIC XMesaBuffer
1655c1f9d828c733ec1eba06d01070735d1f36fda733Chris LattnerXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap)
16568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{
1657c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner   int client = 0;
16582eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor   XMesaBuffer b;
16592eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor
16602eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor   assert(v);
1661ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
16621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap);
16633397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (!b)
16642eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor      return NULL;
16652eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor
16662eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor#ifdef XFree86Server
16671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   client = CLIENT_ID(((XMesaDrawable)p)->id);
1668ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor#endif
16697c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
16707c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
16716a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor				     (XMesaDrawable) p, cmap)) {
167220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer      xmesa_free_buffer(b);
16739c7361006b8cd95333958150dd0c803261807b68Douglas Gregor      return NULL;
16745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner   }
16759c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16769c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   return b;
1677040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor}
1678040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
16797c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
16809c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16819c7361006b8cd95333958150dd0c803261807b68Douglas GregorXMesaBuffer
16829c7361006b8cd95333958150dd0c803261807b68Douglas GregorXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
16839c7361006b8cd95333958150dd0c803261807b68Douglas Gregor                   unsigned int width, unsigned int height)
16849c7361006b8cd95333958150dd0c803261807b68Douglas Gregor{
16859c7361006b8cd95333958150dd0c803261807b68Douglas Gregor#ifdef XFree86Server
16869c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   return 0;
16879c7361006b8cd95333958150dd0c803261807b68Douglas Gregor#else
16889c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   int client = 0;
1689040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   XMesaWindow root;
1690040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   XMesaDrawable drawable;  /* X Pixmap Drawable */
1691040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   XMesaBuffer b;
1692040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
1693040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   /* allocate pixmap for front buffer */
1694040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   root = RootWindow( v->display, v->visinfo->screen );
1695040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   drawable = XCreatePixmap(v->display, root, width, height,
1696040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor                            v->visinfo->depth);
1697040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   if (!drawable)
16989c7361006b8cd95333958150dd0c803261807b68Douglas Gregor      return NULL;
16999c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
17009c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   b = create_xmesa_buffer(drawable, PBUFFER, v, cmap);
1701040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   if (!b)
1702040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor      return NULL;
1703040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
17043397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
17057c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner				     drawable, cmap)) {
17063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      xmesa_free_buffer(b);
1707ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor      return NULL;
1708ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor   }
1709ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor
1710ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor   return b;
1711ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor#endif
171220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer}
17139c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
17147c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17157c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17169c7361006b8cd95333958150dd0c803261807b68Douglas Gregor/*
17179c7361006b8cd95333958150dd0c803261807b68Douglas Gregor * Deallocate an XMesaBuffer structure and all related info.
17187c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner */
17197c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris LattnerPUBLIC void
17201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpXMesaDestroyBuffer(XMesaBuffer b)
17217c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner{
17227c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   xmesa_free_buffer(b);
17238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
17247c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/**
17277c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * Query the current window size and update the corresponding GLframebuffer
17287c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * and all attached renderbuffers.
17297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * Called when:
17307c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *  1. the first time a buffer is bound to a context.
17317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *  2. from glViewport to poll for window size changes
17327356a31327be9b3c3434a0c88746028980da5684Chris Lattner *  3. from the XMesaResizeBuffers() API function.
17337c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * Note: it's possible (and legal) for xmctx to be NULL.  That can happen
173420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer * when resizing a buffer when no rendering context is bound.
17356a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor */
17366a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregorvoid
17376a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregorxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer)
17386a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor{
173920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer   GLuint width, height;
1740c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor   xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height);
17417c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   if (drawBuffer->mesa_buffer.Width != width ||
1742f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner       drawBuffer->mesa_buffer.Height != height) {
1743df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner      GLcontext *ctx = xmctx ? &xmctx->mesa : NULL;
1744df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner      _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height);
1745df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   }
1746df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */
1747df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner}
1748df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner
17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1750df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner/*
1751df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner * Bind buffer b to context c and make c the current rendering context.
1752df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner */
1753df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
1754df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner{
17557356a31327be9b3c3434a0c88746028980da5684Chris Lattner   return XMesaMakeCurrent2( c, b, b );
1756df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner}
1757df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner
1758df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner
1759df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner/*
17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Bind buffer b to context c and make c the current rendering context.
17618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */
1762df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerPUBLIC
1763df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
176437e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor                             XMesaBuffer readBuffer )
17657c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner{
17664800a5c79023271408af49797e09be32aca93232Douglas Gregor   if (c) {
17674800a5c79023271408af49797e09be32aca93232Douglas Gregor      if (!drawBuffer || !readBuffer)
17684800a5c79023271408af49797e09be32aca93232Douglas Gregor         return GL_FALSE;  /* must specify buffers! */
17694800a5c79023271408af49797e09be32aca93232Douglas Gregor
17704800a5c79023271408af49797e09be32aca93232Douglas Gregor#ifdef FX
17714800a5c79023271408af49797e09be32aca93232Douglas Gregor      if (drawBuffer->FXctx) {
17724800a5c79023271408af49797e09be32aca93232Douglas Gregor         fxMesaMakeCurrent(drawBuffer->FXctx);
17734800a5c79023271408af49797e09be32aca93232Douglas Gregor
17744800a5c79023271408af49797e09be32aca93232Douglas Gregor         c->xm_buffer = drawBuffer;
17754800a5c79023271408af49797e09be32aca93232Douglas Gregor
17764800a5c79023271408af49797e09be32aca93232Douglas Gregor         return GL_TRUE;
17774800a5c79023271408af49797e09be32aca93232Douglas Gregor      }
177820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer#endif
17796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      if (&(c->mesa) == _mesa_get_current_context()
17806a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor          && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer
17814800a5c79023271408af49797e09be32aca93232Douglas Gregor          && c->mesa.ReadBuffer == &readBuffer->mesa_buffer
17824800a5c79023271408af49797e09be32aca93232Douglas Gregor          && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) {
17834800a5c79023271408af49797e09be32aca93232Douglas Gregor         /* same context and buffer, do nothing */
17844800a5c79023271408af49797e09be32aca93232Douglas Gregor         return GL_TRUE;
17854800a5c79023271408af49797e09be32aca93232Douglas Gregor      }
17864800a5c79023271408af49797e09be32aca93232Douglas Gregor
17874800a5c79023271408af49797e09be32aca93232Douglas Gregor      c->xm_buffer = drawBuffer;
17884800a5c79023271408af49797e09be32aca93232Douglas Gregor
17894800a5c79023271408af49797e09be32aca93232Douglas Gregor      /* Call this periodically to detect when the user has begun using
17904800a5c79023271408af49797e09be32aca93232Douglas Gregor       * GL rendering from multiple threads.
17914800a5c79023271408af49797e09be32aca93232Douglas Gregor       */
17924800a5c79023271408af49797e09be32aca93232Douglas Gregor      _glapi_check_multithread();
17934800a5c79023271408af49797e09be32aca93232Douglas Gregor
17944800a5c79023271408af49797e09be32aca93232Douglas Gregor      xmesa_check_and_update_buffer_size(c, drawBuffer);
17954800a5c79023271408af49797e09be32aca93232Douglas Gregor      if (readBuffer != drawBuffer)
17964800a5c79023271408af49797e09be32aca93232Douglas Gregor         xmesa_check_and_update_buffer_size(c, readBuffer);
17974800a5c79023271408af49797e09be32aca93232Douglas Gregor
1798272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor      _mesa_make_current(&(c->mesa),
1799272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor                         &drawBuffer->mesa_buffer,
1800272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor                         &readBuffer->mesa_buffer);
1801272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor
18024800a5c79023271408af49797e09be32aca93232Douglas Gregor      if (c->xm_visual->mesa_visual.rgbMode) {
18038f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor         /*
18044800a5c79023271408af49797e09be32aca93232Douglas Gregor          * Must recompute and set these pixel values because colormap
18054800a5c79023271408af49797e09be32aca93232Douglas Gregor          * can be different for different windows.
18067338a922dd1164002922163200b18a2c24eb0209Douglas Gregor          */
18077338a922dd1164002922163200b18a2c24eb0209Douglas Gregor         c->clearpixel = xmesa_color_to_pixel( &c->mesa,
18084800a5c79023271408af49797e09be32aca93232Douglas Gregor                                               c->clearcolor[0],
180920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer                                               c->clearcolor[1],
18104800a5c79023271408af49797e09be32aca93232Douglas Gregor                                               c->clearcolor[2],
18114800a5c79023271408af49797e09be32aca93232Douglas Gregor                                               c->clearcolor[3],
18124800a5c79023271408af49797e09be32aca93232Douglas Gregor                                               c->xm_visual->undithered_pf);
18134800a5c79023271408af49797e09be32aca93232Douglas Gregor         XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel);
18144800a5c79023271408af49797e09be32aca93232Douglas Gregor      }
18154800a5c79023271408af49797e09be32aca93232Douglas Gregor
18166a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
18174800a5c79023271408af49797e09be32aca93232Douglas Gregor      drawBuffer->wasCurrent = GL_TRUE;
181889d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor   }
181989d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor   else {
182089d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor      /* Detach */
18218f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor      _mesa_make_current( NULL, NULL, NULL );
182289d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor   }
18234800a5c79023271408af49797e09be32aca93232Douglas Gregor   return GL_TRUE;
18244800a5c79023271408af49797e09be32aca93232Douglas Gregor}
18254800a5c79023271408af49797e09be32aca93232Douglas Gregor
18264800a5c79023271408af49797e09be32aca93232Douglas Gregor
18274800a5c79023271408af49797e09be32aca93232Douglas Gregor/*
18284800a5c79023271408af49797e09be32aca93232Douglas Gregor * Unbind the context c from its buffer.
18294800a5c79023271408af49797e09be32aca93232Douglas Gregor */
18304800a5c79023271408af49797e09be32aca93232Douglas GregorGLboolean XMesaUnbindContext( XMesaContext c )
183189d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor{
18327338a922dd1164002922163200b18a2c24eb0209Douglas Gregor   /* A no-op for XFree86 integration purposes */
18334800a5c79023271408af49797e09be32aca93232Douglas Gregor   return GL_TRUE;
18344800a5c79023271408af49797e09be32aca93232Douglas Gregor}
18354800a5c79023271408af49797e09be32aca93232Douglas Gregor
18364800a5c79023271408af49797e09be32aca93232Douglas Gregor
18374800a5c79023271408af49797e09be32aca93232Douglas GregorXMesaContext XMesaGetCurrentContext( void )
18384800a5c79023271408af49797e09be32aca93232Douglas Gregor{
18394800a5c79023271408af49797e09be32aca93232Douglas Gregor   GET_CURRENT_CONTEXT(ctx);
18404800a5c79023271408af49797e09be32aca93232Douglas Gregor   if (ctx) {
18414800a5c79023271408af49797e09be32aca93232Douglas Gregor      XMesaContext xmesa = XMESA_CONTEXT(ctx);
18424800a5c79023271408af49797e09be32aca93232Douglas Gregor      return xmesa;
18434800a5c79023271408af49797e09be32aca93232Douglas Gregor   }
18444800a5c79023271408af49797e09be32aca93232Douglas Gregor   else {
18458f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor      return 0;
18464800a5c79023271408af49797e09be32aca93232Douglas Gregor   }
18479e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth}
18487338a922dd1164002922163200b18a2c24eb0209Douglas Gregor
18499e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth
18509e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler CarruthXMesaBuffer XMesaGetCurrentBuffer( void )
18519e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth{
18529e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth   GET_CURRENT_CONTEXT(ctx);
1853f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth   if (ctx) {
18544800a5c79023271408af49797e09be32aca93232Douglas Gregor      XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
18556a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      return xmbuf;
185620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer   }
18574800a5c79023271408af49797e09be32aca93232Douglas Gregor   else {
18584800a5c79023271408af49797e09be32aca93232Douglas Gregor      return 0;
18597338a922dd1164002922163200b18a2c24eb0209Douglas Gregor   }
18604800a5c79023271408af49797e09be32aca93232Douglas Gregor}
18614800a5c79023271408af49797e09be32aca93232Douglas Gregor
18624800a5c79023271408af49797e09be32aca93232Douglas Gregor
18634800a5c79023271408af49797e09be32aca93232Douglas Gregor/* New in Mesa 3.1 */
18644800a5c79023271408af49797e09be32aca93232Douglas GregorXMesaBuffer XMesaGetCurrentReadBuffer( void )
18654800a5c79023271408af49797e09be32aca93232Douglas Gregor{
18664800a5c79023271408af49797e09be32aca93232Douglas Gregor   GET_CURRENT_CONTEXT(ctx);
18674800a5c79023271408af49797e09be32aca93232Douglas Gregor   if (ctx) {
18684800a5c79023271408af49797e09be32aca93232Douglas Gregor      return XMESA_BUFFER(ctx->ReadBuffer);
18694800a5c79023271408af49797e09be32aca93232Douglas Gregor   }
18704800a5c79023271408af49797e09be32aca93232Douglas Gregor   else {
18714800a5c79023271408af49797e09be32aca93232Douglas Gregor      return 0;
18724800a5c79023271408af49797e09be32aca93232Douglas Gregor   }
18734800a5c79023271408af49797e09be32aca93232Douglas Gregor}
1874c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
187520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
18766a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#ifdef XFree86Server
18776a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorPUBLIC
18786a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorGLboolean XMesaForceCurrent(XMesaContext c)
18796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor{
18806a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   if (c) {
18818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#ifdef XGLServer
18826a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      _glapi_set_dispatch(c->mesa.CurrentDispatch);
1883272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor#endif
18846a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
1885fb2d9e092f19cfcdd11ebd5ceac40456c090c7dbDouglas Gregor      if (&(c->mesa) != _mesa_get_current_context()) {
18866a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor	 _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer);
18876a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      }
188820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer   }
18896a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   else {
18908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      _mesa_make_current(NULL, NULL, NULL);
18916a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   }
1892272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor   return GL_TRUE;
18936a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor}
1894fb2d9e092f19cfcdd11ebd5ceac40456c090c7dbDouglas Gregor
18956a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
18966e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin KramerPUBLIC
18976a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorGLboolean XMesaLoseCurrent(XMesaContext c)
18980b1fb988012da21d996c43e36867787a7a07b889Chris Lattner{
18990b1fb988012da21d996c43e36867787a7a07b889Chris Lattner   (void) c;
19003efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis   _mesa_make_current(NULL, NULL, NULL);
1901f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis   return GL_TRUE;
19023efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis}
19033efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis
19043efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis
19053efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios KyrtzidisPUBLIC
19063efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios KyrtzidisGLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask )
19073efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis{
19083efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis   _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask);
19093efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis   return GL_TRUE;
19103efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis}
19113efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis#endif /* XFree86Server */
19123efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis
19133efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis
19143efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis#ifndef FX
19153efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios KyrtzidisGLboolean XMesaSetFXmode( GLint mode )
19163efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis{
1917f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis   (void) mode;
19183efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis   return GL_FALSE;
19193efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis}
1920f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis#endif
1921f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis
192260f7684881f9f6bc779e91212aea89d9afc723ddArgyrios Kyrtzidis
19233efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis
1924f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis/*
1925f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis * Copy the back buffer to the front buffer.  If there's no back buffer
1926c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson * this is a no-op.
1927c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson */
1928c850578dbfa68cf2d2776f59a5cb0009134d970eAnders CarlssonPUBLIC
1929c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlssonvoid XMesaSwapBuffers( XMesaBuffer b )
1930c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson{
1931c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson   GET_CURRENT_CONTEXT(ctx);
1932c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson
1933c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson   if (!b->backxrb) {
1934c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson      /* single buffered */
1935c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson      return;
1936c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson   }
1937c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson
1938c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson   /* If we're swapping the buffer associated with the current context
1939c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson    * we have to flush any pending rendering commands first.
1940c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson    */
1941e92b8a1dbba150e213c4980710fcb59ec5c5c570Douglas Gregor   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
1942c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson      _mesa_notifySwapBuffers(ctx);
1943c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson
1944c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson   if (b->db_mode) {
1945c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson#ifdef FX
19466e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer      if (FXswapBuffers(b))
1947c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson         return;
1948c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson#endif
19494fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      if (b->backxrb->ximage) {
19504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor	 /* Copy Ximage (back buf) from client memory to server window */
19514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#if defined(USE_XSHM) && !defined(XFree86Server)
19520b1fb988012da21d996c43e36867787a7a07b889Chris Lattner	 if (b->shm) {
19533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
1954a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl	    XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
195501b81c4d074bba9c18372d521405dfe32fc4f552Argyrios Kyrtzidis			  b->swapgc,
1956c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis			  b->backxrb->ximage, 0, 0,
1957c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis			  0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
19581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                          False );
195997475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
196055f48de5f6b10b50f4d88a9f7235f4532f799550Douglas Gregor	 }
19612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor	 else
1962c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis#endif
1963681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl         {
1964c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
1965681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
1966681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl			   b->swapgc,
1967681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl			   b->backxrb->ximage, 0, 0,
19682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor			   0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height );
19692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
19702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor         }
19711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
19722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      else if (b->backxrb->pixmap) {
19733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl	 /* Copy pixmap (back buf) to window (front buf) on server */
19740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
1975a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor	 XMesaCopyArea( b->xm_visual->display,
1976a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor			b->backxrb->pixmap,   /* source drawable */
1977a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor			b->frontxrb->drawable,  /* dest. drawable */
19780953e767ff7817f97b3ab20896b229891eeff45bJohn McCall			b->swapgc,
19798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl			0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
19800953e767ff7817f97b3ab20896b229891eeff45bJohn McCall			0, 0                 /* dest region */
19810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall		      );
19820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
19830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      }
19842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1985b7166334d897e1e4e6a5b428fe2d0ec752ef187fMike Stump      if (b->swAlpha)
19862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor         _mesa_copy_soft_alpha_renderbuffers(ctx, &b->mesa_buffer);
19872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
19880953e767ff7817f97b3ab20896b229891eeff45bJohn McCall#if !defined(XFree86Server)
19892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   XSync( b->xm_visual->display, False );
19902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
19912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1992c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
19930b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
19940b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
1995c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/*
19962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Copy sub-region of back buffer to front buffer
19972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
19984fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
19994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{
20004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   GET_CURRENT_CONTEXT(ctx);
20014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
20022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* If we're swapping the buffer associated with the current context
20032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    * we have to flush any pending rendering commands first.
20042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    */
20052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
20062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      _mesa_notifySwapBuffers(ctx);
2007a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
20082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (!b->backxrb) {
200917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      /* single buffered */
20102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return;
20112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
2012c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
20132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (b->db_mode) {
20148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      int yTop = b->mesa_buffer.Height - y - height;
20155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#ifdef FX
201617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      if (FXswapBuffers(b))
201717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis         return;
2018eb5e9986e577b1e2bff3cca5973a2494fb593fbbArgyrios Kyrtzidis#endif
20192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      if (b->backxrb->ximage) {
20202512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor         /* Copy Ximage from host's memory to server's window */
20216e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#if defined(USE_XSHM) && !defined(XFree86Server)
20222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor         if (b->shm) {
20232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            /* XXX assuming width and height aren't too large! */
20242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
2025a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl                          b->swapgc,
20261476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl                          b->backxrb->ximage, x, yTop,
20271476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl                          x, yTop, width, height, False );
20281476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl            /* wait for finished event??? */
20291476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         }
20301476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         else
20318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif
20321476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         {
2033a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor            /* XXX assuming width and height aren't too large! */
20341476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
20351476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl			   b->swapgc,
20361476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl			   b->backxrb->ximage, x, yTop,
20378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl			   x, yTop, width, height );
20381476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         }
2039a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor      }
20406e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer      else {
20411476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         /* Copy pixmap to window on server */
20421476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         XMesaCopyArea( b->xm_visual->display,
20431476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl			b->backxrb->pixmap,           /* source drawable */
20448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl			b->frontxrb->drawable,        /* dest. drawable */
20451476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl			b->swapgc,
2046496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor			x, yTop, width, height,  /* source region */
20471476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl			x, yTop                  /* dest region */
20481476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl                      );
20491476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl      }
20508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   }
20511476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl}
20520a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor
20536e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
20541476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl/*
20551476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
20564fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * is a way to get "under the hood" of X/Mesa so one can manipulate the
20574fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * back buffer directly.
20584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Output:  pixmap - pointer to back buffer's Pixmap, or 0
20594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor *          ximage - pointer to back buffer's XImage, or NULL
20603251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * Return:  GL_TRUE = context is double buffered
2061f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *          GL_FALSE = context is single buffered
20623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */
2063a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#ifndef XFree86Server
2064f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorGLboolean XMesaGetBackBuffer( XMesaBuffer b,
2065f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                              XMesaPixmap *pixmap,
2066f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                              XMesaImage **ximage )
2067f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
20681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   if (b->db_mode) {
20695d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      if (pixmap)
20708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         *pixmap = b->backxrb->pixmap;
20715d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      if (ximage)
20725d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl         *ximage = b->backxrb->ximage;
2073f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return GL_TRUE;
2074f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
20753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   else {
20761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      *pixmap = 0;
2077f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      *ximage = NULL;
20780eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis      return GL_FALSE;
2079f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
20801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
20811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#endif /* XFree86Server */
20825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
2083f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2084f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor/*
2085f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * Return the depth buffer associated with an XMesaBuffer.
20865d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * Input:  b - the XMesa buffer handle
20875d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * Output:  width, height - size of buffer in pixels
2088f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *          bytesPerValue - bytes per depth value (2 or 4)
2089f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *          buffer - pointer to depth buffer values
2090f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
20915d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl */
2092f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2093f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                               GLint *bytesPerValue, void **buffer )
2094f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
2095f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   struct gl_renderbuffer *rb
2096f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer;
2097f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   if (!rb || !rb->Data) {
20981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      *width = 0;
20995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      *height = 0;
21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      *bytesPerValue = 0;
210183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      *buffer = 0;
210283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      return GL_FALSE;
2103f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
2104f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   else {
2105f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      *width = b->mesa_buffer.Width;
2106f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      *height = b->mesa_buffer.Height;
2107f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16
21081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         ? sizeof(GLushort) : sizeof(GLuint);
2109f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      *buffer = rb->Data;
2110f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return GL_TRUE;
21111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   }
21125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner}
2113a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor
2114a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor
21155d05007b7a7883159154e3f65f338a2542d53913Sebastian Redlvoid XMesaFlush( XMesaContext c )
2116f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
21175d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   if (c && c->xm_visual) {
2118f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#ifdef XFree86Server
2119f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      /* NOT_NEEDED */
2120f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#else
2121f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      XSync( c->xm_visual->display, False );
2122f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#endif
21235d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   }
2124f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor}
2125f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2126f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2127f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2128f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorconst char *XMesaGetString( XMesaContext c, int name )
2129f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
21305d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   (void) c;
2131f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   if (name==XMESA_VERSION) {
2132f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return "5.0";
2133f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
21345d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   else if (name==XMESA_EXTENSIONS) {
2135f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return "";
2136f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
2137f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   else {
2138a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor      return NULL;
2139a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor   }
2140f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor}
2141f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2142f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2143f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2144059612dd3429cef2d61f11950f3d93a40182bf69Sebastian RedlXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2145f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
2146f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   XMesaBuffer b;
2147059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   for (b=XMesaBufferList; b; b=b->Next) {
2148059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl      if (b->frontxrb->drawable == d && b->display == dpy) {
2149a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl         return b;
2150f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      }
2151f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
2152059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   return NULL;
21535d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl}
2154059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl
2155e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
2156059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl/**
2157f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * Free/destroy all XMesaBuffers associated with given display.
21583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */
21595d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidisvoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy)
21601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{
2161059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   XMesaBuffer b, next;
2162059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   for (b = XMesaBufferList; b; b = next) {
2163e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      next = b->Next;
21648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (b->display == dpy) {
21655d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl         xmesa_free_buffer(b);
21665d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      }
21675d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   }
2168059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl}
21693397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
21705d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl
21715d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl/*
21725d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * Look for XMesaBuffers whose X window has been destroyed.
21735d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * Deallocate any such XMesaBuffers.
21745d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl */
21755d05007b7a7883159154e3f65f338a2542d53913Sebastian Redlvoid XMesaGarbageCollect( void )
21765d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl{
21775d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   XMesaBuffer b, next;
21783397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   for (b=XMesaBufferList; b; b=next) {
2179e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      next = b->Next;
2180e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      if (b->display && b->frontxrb->drawable && b->type == WINDOW) {
2181e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#ifdef XFree86Server
2182e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl	 /* NOT_NEEDED */
2183e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#else
2184e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl         XSync(b->display, False);
2185e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl         if (!window_exists( b->display, b->frontxrb->drawable )) {
2186e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl            /* found a dead window, free the ancillary info */
2187e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl            XMesaDestroyBuffer( b );
2188e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl         }
2189e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#endif
2190e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      }
2191e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   }
2192e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl}
2193e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
2194e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
2195fa78dec572259aca763457b435744f79d822c5d4Sebastian Redlunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2196fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl                                GLfloat red, GLfloat green,
2197fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl                                GLfloat blue, GLfloat alpha )
2198e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl{
21995d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   GLcontext *ctx = &xmesa->mesa;
2200f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   GLint r = (GLint) (red   * 255.0F);
2201f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   GLint g = (GLint) (green * 255.0F);
2202f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   GLint b = (GLint) (blue  * 255.0F);
22031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   GLint a = (GLint) (alpha * 255.0F);
2204f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2205f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   switch (xmesa->pixelformat) {
22063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      case PF_Index:
2207f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         return 0;
2208f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_Truecolor:
2209a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor         {
2210f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            unsigned long p;
2211f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            PACK_TRUECOLOR( p, r, g, b );
2212f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            return p;
2213f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         }
2214f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_8A8B8G8R:
22158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         return PACK_8A8B8G8R( r, g, b, a );
2216f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_8A8R8G8B:
221783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         return PACK_8A8R8G8B( r, g, b, a );
2218f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_8R8G8B:
2219f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         return PACK_8R8G8B( r, g, b );
2220f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_5R6G5B:
222183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         return PACK_5R6G5B( r, g, b );
2222f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_Dither:
22238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         {
2224f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            DITHER_SETUP;
2225e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl            return DITHER( x, y, r, g, b );
2226ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar         }
222783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      case PF_1Bit:
222883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         /* 382 = (3*255)/2 */
222983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
22308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PF_HPCR:
22317c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor         return DITHER_HPCR(x, y, r, g, b);
2232b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor      case PF_Lookup:
223383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         {
223483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor            LOOKUP_SETUP;
223583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor            return LOOKUP( r, g, b );
223683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         }
223783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      case PF_Grayscale:
22388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         return GRAY_RGB( r, g, b );
223983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      case PF_Dither_5R6G5B:
2240b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor         /* fall through */
224183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      case PF_Dither_True:
22426e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer         {
2243f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            unsigned long p;
2244f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            PACK_TRUEDITHER(p, x, y, r, g, b);
2245f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            return p;
22463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         }
2247a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      default:
2248320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
2249320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   }
2250320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   return 0;
2251725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl}
2252320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian
2253725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl
22543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/*
2255a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl * This is typically called when the window size changes and we need
2256a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl * to reallocate the buffer's back/depth/stencil/accum buffers.
2257320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian */
2258320198303df7c16950d83ae79c3f702b84badcf7Fariborz JahanianPUBLIC void
2259320198303df7c16950d83ae79c3f702b84badcf7Fariborz JahanianXMesaResizeBuffers( XMesaBuffer b )
2260320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian{
2261320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   GET_CURRENT_CONTEXT(ctx);
2262320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   XMesaContext xmctx = XMESA_CONTEXT(ctx);
2263320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   if (!xmctx)
2264320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      return;
22658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   xmesa_check_and_update_buffer_size(xmctx, b);
2266320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian}
2267320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian
22684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor