xm_api.c revision fcf438e9e03f6e75bca4a49ad372fe7c4b1abbf8
14ee2ad04344446e610172a0e73949212923014dfSebastian Redl/*
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Mesa 3-D graphics library
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Version:  7.1
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Copyright (C) 1999-2007  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
150eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis * in all copies or substantial portions of the Software.
16e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor *
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas 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
212a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2289eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
230b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor */
247a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall
252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
26a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall * \file xm_api.c
276ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl *
287c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * All the XMesa* API functions.
296a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *
307c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *
3183d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff * NOTES:
3214f79002e58556798e86168c63e48d533287eda5Douglas Gregor *
3310e286aa8d39fb51a21412850265d9dae74613eeChris Lattner * The window coordinate system origin (0,0) is in the lower-left corner
343251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * of the window.  X11's window coordinate origin is in the upper-left
3514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * corner of the window.  Therefore, most drawing functions in this
36bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor * file have to flip Y coordinates.
372bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor *
38ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
390a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor * in support for the MIT Shared Memory extension.  If enabled, when you
4017fc223395d51be582fc666bb6ea21bd1dff26dcDouglas 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.
422596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar *
432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Byte swapping:  If the Mesa host and the X display use a different
44fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer * byte order then there's some trickiness to be aware of when using
4514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * XImages.  The byte ordering used for the XImage is that of the X
4603013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer * display, not the Mesa host.
47f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * The color-to-pixel encoding for True/DirectColor must be done
483c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner * according to the display's visual red_mask, green_mask, and blue_mask.
49cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
50f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * do byte swapping if needed.  If one wants to directly "poke" the pixel
512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * into the XImage's buffer then the pixel must be byte swapped first.  In
528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * and use XPutPixel everywhere except in the implementation of
54ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
555f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * instead of using XPutPixel we "poke" our values after byte-swapping
565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * the clear pixel value if needed.
575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner *
586e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer */
59ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
606e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#ifdef __CYGWIN__
616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#undef WIN32
625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#undef __WIN32__
635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#endif
646e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
65ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#include "glxheader.h"
66ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#include "xmesaP.h"
672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/context.h"
682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/extensions.h"
692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/framebuffer.h"
7012b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner#include "main/imports.h"
712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/macros.h"
723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#include "main/renderbuffer.h"
73a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include "main/teximage.h"
7489eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "glapi/glthread.h"
752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast/swrast.h"
762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast_setup/swrast_setup.h"
772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "vbo/vbo.h"
788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "tnl/tnl.h"
792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/t_context.h"
8089eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "tnl/t_pipeline.h"
818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "drivers/common/driverfuncs.h"
822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "drivers/common/meta.h"
832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Global X driver lock
862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor_glthread_Mutex _xmesa_lock;
882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Lookup tables for HPCR pixel format:
933397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */
94b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikiestatic short hpcr_rgbTbl[3][256] = {
952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
973397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
1123397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl},
113df1550fc59b51681d37225934fe4e3acac321621Richard Smith{
114df1550fc59b51681d37225934fe4e3acac321621Richard Smith 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
1158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
1162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
1172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1183397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
119df1550fc59b51681d37225934fe4e3acac321621Richard Smith 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1233397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1293397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor},
1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
1320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
1332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 40,  40,  41,  41,  42,  42,  43,  43,  44,  44,  45,  45,  46,  46,  47,  47,
1342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
1353397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
1362cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
1372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
1388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  86,  86,  87,  87,
1392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
1487e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor}
1497e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor};
150c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
1518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/
1543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/*****                     X Utility Functions                    *****/
1552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/
1562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
157e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson
1588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**
1592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Return the host's byte order as LSBFirst or MSBFirst ala X.
1602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
1613397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#ifndef XFree86Server
1622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic int host_byte_order( void )
1638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{
1642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   int i = 1;
1652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   char *cptr = (char *) &i;
1663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   return (*cptr==1) ? LSBFirst : MSBFirst;
1672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
168264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola#endif
169264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola
170a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman
171425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola/**
172ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor * Check if the X Shared Memory extension is available.
173264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola * Return:  0 = not available
174f85e193739c953358c865005855253af4f68a497John McCall *          1 = shared XImage support available
1752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *          2 = shared Pixmap support available also
1762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
1773397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlstatic int check_for_xshm( XMesaDisplay *display )
1782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
1798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#if defined(USE_XSHM) && !defined(XFree86Server)
1802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   int major, minor, ignore;
1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   Bool pixmaps;
1823397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
1852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor	 return (pixmaps==True) ? 2 : 1;
1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      }
1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      else {
188eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith	 return 0;
1892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      }
190c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor   }
19160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl   else {
19260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      return 0;
19360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl   }
19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl#else
19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl   /* No  XSHM support */
19660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl   return 0;
19760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl#endif
19860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl}
1998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
2023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Apply gamma correction to an intensity value in [0..max].  Return the
203ed97649e9574b9d854fa4d6109c9333ae0993554John McCall * new intensity value.
2048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */
205ed97649e9574b9d854fa4d6109c9333ae0993554John McCallstatic GLint
206ed97649e9574b9d854fa4d6109c9333ae0993554John McCallgamma_adjust( GLfloat gamma, GLint value, GLint max )
2073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{
2082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (gamma == 1.0) {
2099763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis      return value;
2109763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   }
2118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   else {
2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      double x = (double) value / (double) max;
2132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma));
2143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   }
215c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor}
2168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/**
2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Return the true number of bits per pixel for XImages.
2218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * For example, if we request a 24-bit deep visual we may actually need/get
2222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * 32bpp XImages.  This function returns the appropriate bpp.
2232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Input:  dpy - the X display
2243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl *         visinfo - desribes the visual to be used for XImages
225f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor * Return:  true number of bits per pixel for XImages
226395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson */
2278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic int
228395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlssonbits_per_pixel( XMesaVisual xmv )
229395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson{
230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt#ifdef XFree86Server
231ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   const int depth = xmv->nplanes;
232ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   int i;
233ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   assert(depth > 0);
234ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
235ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt      if (screenInfo.formats[i].depth == depth)
236ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt         return screenInfo.formats[i].bitsPerPixel;
23734b41d939a1328f484511c6002ba2456db879a29Richard Smith   }
23834b41d939a1328f484511c6002ba2456db879a29Richard Smith   return depth;  /* should never get here, but this should be safe */
23934b41d939a1328f484511c6002ba2456db879a29Richard Smith#else
24034b41d939a1328f484511c6002ba2456db879a29Richard Smith   XMesaDisplay *dpy = xmv->display;
24134b41d939a1328f484511c6002ba2456db879a29Richard Smith   XMesaVisualInfo visinfo = xmv->visinfo;
2423397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   XMesaImage *img;
243be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis   int bitsPerPixel;
24456ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor   /* Create a temporary XImage */
2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
2462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor		       ZPixmap, 0,           /*format, offset*/
2472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor		       (char*) MALLOC(8),    /*data*/
2482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor		       1, 1,                 /*width, height*/
2493397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl		       32,                   /*bitmap_pad*/
2502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor		       0                     /*bytes_per_line*/
2518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                     );
2522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   assert(img);
2532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* grab the bits/pixel value */
2543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   bitsPerPixel = img->bits_per_pixel;
2552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* free the XImage */
2568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   free( img->data );
2572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   img->data = NULL;
2582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   XMesaDestroyImage( img );
2599d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall   return bitsPerPixel;
2609d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall#endif
2619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall}
2629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2639d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2649d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2659d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall/*
2661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Determine if a given X window ID is valid (window exists).
2673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Do this by calling XGetWindowAttributes() for the window and
26849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * checking if we catch an X error.
26949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * Input:  dpy - the display
27049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall *         win - the window to check for existance
2718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Return:  GL_TRUE - window exists
27249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall *          GL_FALSE - window doesn't exist
27349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall */
27449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall#ifndef XFree86Server
275c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic GLboolean WindowExistsFlag;
276c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
277c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
278c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor{
279c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   (void) dpy;
280c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   if (xerr->error_code == BadWindow) {
281c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor      WindowExistsFlag = GL_FALSE;
282c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   }
2833397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   return 0;
2842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
285be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis
28690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
28790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{
28890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   XWindowAttributes wa;
28990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
29090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   WindowExistsFlag = GL_TRUE;
2913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith   old_handler = XSetErrorHandler(window_exists_err_handler);
2923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
2939763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   XSetErrorHandler(old_handler);
2949763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   return WindowExistsFlag;
2958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
29690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
29790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstatic Status
29890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisget_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height )
2993397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{
300ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis   Window root;
301ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis   Status stat;
302ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis   int xpos, ypos;
3038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   unsigned int w, h, bw, depth;
30490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth);
30590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   *width = w;
30690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   *height = h;
3073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   return stat;
30890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
30990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif
310b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie
31190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
31290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis/**
31390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * Return the size of the window (or pixmap) that corresponds to the
3143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * given XMesaBuffer.
31590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * \param width  returns width in pixels
31690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * \param height  returns height in pixels
31790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis */
3184fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthvoid
3198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b,
32090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis                      GLuint *width, GLuint *height)
32190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{
32290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#ifdef XFree86Server
3233397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH);
3248dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis   *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT);
3258dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis#else
3268dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis   Status stat;
327f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis
328f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis   _glthread_LOCK_MUTEX(_xmesa_lock);
329f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis   XSync(b->xm_visual->display, 0); /* added for Chromium */
3308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height);
33190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   _glthread_UNLOCK_MUTEX(_xmesa_lock);
33290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
33390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   if (!stat) {
3343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      /* probably querying a window that's recently been destroyed */
33590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis      _mesa_warning(NULL, "XGetGeometry failed!\n");
3363acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis      *width = *height = 1;
3373acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   }
3383acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis#endif
3393acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis}
3403acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3413acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3423acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**********************************************************************/
3442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/*****                Linked list of XMesaBuffers                 *****/
3452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/
3467536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
3477536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorXMesaBuffer XMesaBufferList = NULL;
348cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor
349cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor
350cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor/**
351cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * Allocate a new XMesaBuffer object which corresponds to the given drawable.
3527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * Note that XMesaBuffer is derived from GLframebuffer.
3537536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * The new XMesaBuffer will not have any size (Width=Height=0).
3547536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor *
355075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \param d  the corresponding X drawable (window or pixmap)
356075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \param type  either WINDOW, PIXMAP or PBUFFER, describing d
357075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \param vis  the buffer's visual
358075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \param cmap  the window's colormap, if known.
359075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \return new XMesaBuffer or NULL if any problem
3603397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */
361465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnarastatic XMesaBuffer
3623acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidiscreate_xmesa_buffer(XMesaDrawable d, BufferType type,
3633acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis                    XMesaVisual vis, XMesaColormap cmap)
3648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{
3652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   XMesaBuffer b;
3662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
3673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER);
3683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
36931f17ecbef57b5679c017c375db330546b7b5145John McCall   b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
3708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (!b)
3713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall      return NULL;
3723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
3733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   b->display = vis->display;
37456ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor   b->xm_visual = vis;
3758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   b->type = type;
376c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall   b->cmap = cmap;
377c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
3783397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   _mesa_initialize_window_framebuffer(&b->mesa_buffer, &vis->mesa_visual);
379c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall   b->mesa_buffer.Delete = xmesa_delete_framebuffer;
3802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
381c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall   /*
382446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff    * Front renderbuffer
383446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff    */
3848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE);
3852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (!b->frontxrb) {
3862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      free(b);
387d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff      return NULL;
3883397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   }
3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   b->frontxrb->Parent = b;
3908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   b->frontxrb->drawable = d;
3912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   b->frontxrb->pixmap = (XMesaPixmap) d;
3922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT,
393b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman                          &b->frontxrb->Base);
394b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
395b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman   /*
396b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    * Back renderbuffer
397b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    */
398b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman   if (vis->mesa_visual.doubleBufferMode) {
399a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE);
400a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      if (!b->backxrb) {
401a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall         /* XXX free front xrb too */
402a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl         free(b);
40389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis         return NULL;
404a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      }
405a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      b->backxrb->Parent = b;
40689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis      /* determine back buffer implementation */
407a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP;
408a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
40951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT,
410a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall                             &b->backxrb->Base);
41151bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
412a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
413a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   /*
41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    * Software alpha planes
41551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    */
416a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   if (vis->mesa_visual.alphaBits > 0
417a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall       && vis->undithered_pf != PF_8A8B8G8R
418a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall       && vis->undithered_pf != PF_8A8R8G8B) {
419a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      /* Visual has alpha, but pixel format doesn't support it.
42051bd803fbdade51d674598ed45da3d54190a656cJohn McCall       * We'll use an alpha renderbuffer wrapper.
42151bd803fbdade51d674598ed45da3d54190a656cJohn McCall       */
42251bd803fbdade51d674598ed45da3d54190a656cJohn McCall      b->swAlpha = GL_TRUE;
42351bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
424ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor   else {
425ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      b->swAlpha = GL_FALSE;
426ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor   }
427ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
428ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor   /*
429ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    * Other renderbuffer (depth, stencil, etc)
430ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    */
43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall   _mesa_add_soft_renderbuffers(&b->mesa_buffer,
43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                GL_FALSE,  /* color */
43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.haveDepthBuffer,
43451bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.haveStencilBuffer,
43551bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.haveAccumBuffer,
43651bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                b->swAlpha,
43751bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.numAuxBuffers > 0 );
43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /* GLX_EXT_texture_from_pixmap */
44051bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->TextureTarget = 0;
44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT;
44251bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->TextureMipmap = 0;
44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
44451bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /* insert buffer into linked list */
44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->Next = XMesaBufferList;
44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall   XMesaBufferList = b;
44751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   return b;
449b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara}
45051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45251bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**
45351bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Find an XMesaBuffer by matching X display and colormap but NOT matching
45451bd803fbdade51d674598ed45da3d54190a656cJohn McCall * the notThis buffer.
45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */
45651bd803fbdade51d674598ed45da3d54190a656cJohn McCallXMesaBuffer
45751bd803fbdade51d674598ed45da3d54190a656cJohn McCallxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis)
45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
45951bd803fbdade51d674598ed45da3d54190a656cJohn McCall   XMesaBuffer b;
46051bd803fbdade51d674598ed45da3d54190a656cJohn McCall   for (b=XMesaBufferList; b; b=b->Next) {
46151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
46251bd803fbdade51d674598ed45da3d54190a656cJohn McCall         return b;
46351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      }
46451bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
46551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   return NULL;
46651bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
46751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
46851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
46951bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**
47051bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Remove buffer from linked list, delete if no longer referenced.
47151bd803fbdade51d674598ed45da3d54190a656cJohn McCall */
47251bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic void
47351bd803fbdade51d674598ed45da3d54190a656cJohn McCallxmesa_free_buffer(XMesaBuffer buffer)
47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
47551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   XMesaBuffer prev = NULL, b;
47651bd803fbdade51d674598ed45da3d54190a656cJohn McCall
47751bd803fbdade51d674598ed45da3d54190a656cJohn McCall   for (b = XMesaBufferList; b; b = b->Next) {
47851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      if (b == buffer) {
47951bd803fbdade51d674598ed45da3d54190a656cJohn McCall         struct gl_framebuffer *fb = &buffer->mesa_buffer;
48051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
48151bd803fbdade51d674598ed45da3d54190a656cJohn McCall         /* unlink buffer from list */
482796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara         if (prev)
483796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara            prev->Next = buffer->Next;
484dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor         else
48551bd803fbdade51d674598ed45da3d54190a656cJohn McCall            XMesaBufferList = buffer->Next;
48651bd803fbdade51d674598ed45da3d54190a656cJohn McCall
48751bd803fbdade51d674598ed45da3d54190a656cJohn McCall         /* mark as delete pending */
48851bd803fbdade51d674598ed45da3d54190a656cJohn McCall         fb->DeletePending = GL_TRUE;
48951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
49051bd803fbdade51d674598ed45da3d54190a656cJohn McCall         /* Since the X window for the XMesaBuffer is going away, we don't
49151bd803fbdade51d674598ed45da3d54190a656cJohn McCall          * want to dereference this pointer in the future.
49251bd803fbdade51d674598ed45da3d54190a656cJohn McCall          */
49351bd803fbdade51d674598ed45da3d54190a656cJohn McCall         b->frontxrb->drawable = 0;
494ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
495ed97649e9574b9d854fa4d6109c9333ae0993554John McCall         /* Unreference.  If count = zero we'll really delete the buffer */
496ed97649e9574b9d854fa4d6109c9333ae0993554John McCall         _mesa_reference_framebuffer(&fb, NULL);
49751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall         return;
49951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      }
50051bd803fbdade51d674598ed45da3d54190a656cJohn McCall      /* continue search */
501cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall      prev = b;
502cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall   }
503cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall   /* buffer not found in XMesaBufferList */
50451bd803fbdade51d674598ed45da3d54190a656cJohn McCall   _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n");
50551bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
506cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
507cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
508cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall/**
509cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall * Copy X color table stuff from one XMesaBuffer to another.
51051bd803fbdade51d674598ed45da3d54190a656cJohn McCall */
51151bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic void
51251bd803fbdade51d674598ed45da3d54190a656cJohn McCallcopy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
513a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall{
514ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   memcpy(dst->color_table, src->color_table, sizeof(src->color_table));
515ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   memcpy(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
516ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   memcpy(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
517ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   memcpy(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
518ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   dst->num_alloced = src->num_alloced;
519ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt   memcpy(dst->alloced_colors, src->alloced_colors,
52034b41d939a1328f484511c6002ba2456db879a29Richard Smith          sizeof(src->alloced_colors));
52134b41d939a1328f484511c6002ba2456db879a29Richard Smith}
52234b41d939a1328f484511c6002ba2456db879a29Richard Smith
52351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
52451bd803fbdade51d674598ed45da3d54190a656cJohn McCall
525a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall/**********************************************************************/
52651bd803fbdade51d674598ed45da3d54190a656cJohn McCall/*****                   Misc Private Functions                   *****/
52751bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**********************************************************************/
528a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
5299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall/**
5319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * A replacement for XAllocColor.  This function should never
5329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * fail to allocate a color.  When XAllocColor fails, we return
5339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * the nearest matching color.  If we have to allocate many colors
5349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * this function isn't too efficient; the XQueryColors() could be
5359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * done just once.
5369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Written by Michael Pichler, Brian Paul, Mark Kilgard
5379d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Input:  dpy - X display
5389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall *         cmap - X colormap
5399d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall *         cmapSize - size of colormap
5409d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * In/Out: color - the XColor struct
5419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Output:  exact - 1=exact color match, 0=closest match
5429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall *          alloced - 1=XAlloc worked, 0=XAlloc failed
5439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall */
54451bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic void
54551bd803fbdade51d674598ed45da3d54190a656cJohn McCallnoFaultXAllocColor( int client,
546a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall                    XMesaDisplay *dpy,
54749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                    XMesaColormap cmap,
54849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                    int cmapSize,
54949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                    XMesaColor *color,
55049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                    int *exact, int *alloced )
551c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor{
552c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifdef XFree86Server
553c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   Pixel *ppixIn;
554c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor   xrgb *ctable;
55551bd803fbdade51d674598ed45da3d54190a656cJohn McCall#else
55651bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /* we'll try to cache ctable for better remote display performance */
55755d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara   static Display *prevDisplay = NULL;
558833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall   static XMesaColormap prevCmap = 0;
559833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall   static int prevCmapSize = 0;
560833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall   static XMesaColor *ctable = NULL;
561833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#endif
56244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis   XMesaColor subColor;
56344f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis   int i, bestmatch;
564a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   double mindist;       /* 3*2^16^2 exceeds long int precision. */
565075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
566075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   (void) client;
567075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara
568075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara   /* First try just using XAllocColor. */
569465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara#ifdef XFree86Server
57038a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara   if (AllocColor(cmap,
5719e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor		  &color->red, &color->green, &color->blue,
572a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall		  &color->pixel,
5733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall		  client) == Success)
5743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#else
5753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   if (XAllocColor(dpy, cmap, color))
5764714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor#endif
57738a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara   {
5782494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor      *exact = 1;
57951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      *alloced = 1;
580a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      return;
58133500955d731c73717af52088b7fc0e7a85681e7John McCall   }
58233500955d731c73717af52088b7fc0e7a85681e7John McCall
58355d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara   /* Alloc failed, search for closest match */
58494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor
58566581d41527628d4b37f7b05c288f77be7415d7dAbramo Bagnara   /* Retrieve color table entries. */
58655d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara   /* XXX alloca candidate. */
58733500955d731c73717af52088b7fc0e7a85681e7John McCall#ifdef XFree86Server
58833500955d731c73717af52088b7fc0e7a85681e7John McCall   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
58933500955d731c73717af52088b7fc0e7a85681e7John McCall   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
59044f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis   for (i = 0; i < cmapSize; i++) {
59144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis      ppixIn[i] = i;
59233500955d731c73717af52088b7fc0e7a85681e7John McCall   }
5937536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor   QueryColors(cmap, cmapSize, ppixIn, ctable);
5947536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor#else
5957536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor   if (prevDisplay != dpy || prevCmap != cmap
59651bd803fbdade51d674598ed45da3d54190a656cJohn McCall       || prevCmapSize != cmapSize || !ctable) {
59751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      /* free previously cached color table */
598c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      if (ctable)
599c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall         free(ctable);
600c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      /* Get the color table from X */
60154e14c4db764c0636160d26c5bbf491637c83a76John McCall      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
60254e14c4db764c0636160d26c5bbf491637c83a76John McCall      assert(ctable);
60354e14c4db764c0636160d26c5bbf491637c83a76John McCall      for (i = 0; i < cmapSize; i++) {
60454e14c4db764c0636160d26c5bbf491637c83a76John McCall         ctable[i].pixel = i;
605a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      }
60651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      XQueryColors(dpy, cmap, ctable, cmapSize);
60751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      prevDisplay = dpy;
608a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      prevCmap = cmap;
609b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman      prevCmapSize = cmapSize;
610b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman   }
611b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman#endif
612b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
613b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman   /* Find best match. */
614a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   bestmatch = -1;
6154dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner   mindist = 0.0;
616a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   for (i = 0; i < cmapSize; i++) {
6172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
6182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
619b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
620b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      double dist = dr * dr + dg * dg + db * db;
62189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis      if (bestmatch < 0 || dist < mindist) {
622b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         bestmatch = i;
623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         mindist = dist;
624b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      }
625b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
626b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
627b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* Return result. */
628b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   subColor.red   = ctable[bestmatch].red;
629b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   subColor.green = ctable[bestmatch].green;
630b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   subColor.blue  = ctable[bestmatch].blue;
631b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* Try to allocate the closest match color.  This should only
632b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    * fail if the cell is read/write.  Otherwise, we're incrementing
633b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    * the cell's reference count.
634b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    */
635b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#ifdef XFree86Server
63689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis   if (AllocColor(cmap,
637b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner		  &subColor.red, &subColor.green, &subColor.blue,
638b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner		  &subColor.pixel,
639b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner		  client) == Success) {
640b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#else
641b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   if (XAllocColor(dpy, cmap, &subColor)) {
6420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif
6430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      *alloced = 1;
6440558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
64589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis   else {
6468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      /* do this to work around a problem reported by Frank Ortega */
6470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.pixel = (unsigned long) bestmatch;
6480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.red   = ctable[bestmatch].red;
6490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.green = ctable[bestmatch].green;
6500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.blue  = ctable[bestmatch].blue;
6510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      subColor.flags = DoRed | DoGreen | DoBlue;
6520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      *alloced = 0;
6530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
6540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server
6550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   free(ppixIn);
6560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   free(ctable);
6570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else
6580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   /* don't free table, save it for next time */
6590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif
6600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6610558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   *color = subColor;
6620558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   *exact = 0;
6630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
6640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner/**
6680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Do setup for PF_GRAYSCALE pixel format.
6690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Note that buffer may be NULL.
6700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner */
6710558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic GLboolean
6720558df2da807646e65d4fa290f4e92114af1a746Chris Lattnersetup_grayscale(int client, XMesaVisual v,
6730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                XMesaBuffer buffer, XMesaColormap cmap)
6740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner{
6750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
6760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      return GL_FALSE;
6770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
6780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   if (buffer) {
6800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      XMesaBuffer prevBuffer;
6810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      if (!cmap) {
6830558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         return GL_FALSE;
6840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      }
6850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
6870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      if (prevBuffer) {
6880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         /* Copy colormap stuff from previous XMesaBuffer which uses same
6890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
6900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner          */
6910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         copy_colortable_info(buffer, prevBuffer);
6920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      }
6930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      else {
6940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         /* Allocate 256 shades of gray */
6950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         int gray;
6960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner         int colorsfailed = 0;
697f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         for (gray=0;gray<256;gray++) {
6980558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
699ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
700ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
701ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek            int exact, alloced;
7020558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            XMesaColor xcol;
7030558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            xcol.red   = (r << 8) | r;
7040558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            xcol.green = (g << 8) | g;
7050558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            xcol.blue  = (b << 8) | b;
7060558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            noFaultXAllocColor( client, v->display,
7070558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                                cmap, GET_COLORMAP_SIZE(v),
7080558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                                &xcol, &exact, &alloced );
7090558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            if (!exact) {
7100558df2da807646e65d4fa290f4e92114af1a746Chris Lattner               colorsfailed++;
7110558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            }
7120558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            if (alloced) {
7130558df2da807646e65d4fa290f4e92114af1a746Chris Lattner               assert(buffer->num_alloced<256);
7140558df2da807646e65d4fa290f4e92114af1a746Chris Lattner               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
715ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek               buffer->num_alloced++;
716eb7f96141f754150a92433286fa385910a22f494Sam Weinig            }
717eb7f96141f754150a92433286fa385910a22f494Sam Weinig
718eb7f96141f754150a92433286fa385910a22f494Sam Weinig            /*OLD
719eb7f96141f754150a92433286fa385910a22f494Sam Weinig            assert(gray < 576);
720eb7f96141f754150a92433286fa385910a22f494Sam Weinig            buffer->color_table[gray*3+0] = xcol.pixel;
721eb7f96141f754150a92433286fa385910a22f494Sam Weinig            buffer->color_table[gray*3+1] = xcol.pixel;
722eb7f96141f754150a92433286fa385910a22f494Sam Weinig            buffer->color_table[gray*3+2] = xcol.pixel;
7239fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith            assert(xcol.pixel < 65536);
724eb7f96141f754150a92433286fa385910a22f494Sam Weinig            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
725eb7f96141f754150a92433286fa385910a22f494Sam Weinig            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
726b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
727b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            */
728b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->color_table[gray] = xcol.pixel;
729b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            assert(xcol.pixel < 65536);
730b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_r[xcol.pixel] = gray;
731b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_g[xcol.pixel] = gray;
732b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            buffer->pixel_to_b[xcol.pixel] = gray;
733b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         }
734b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
735b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
736b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            _mesa_warning(NULL,
737b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  "Note: %d out of 256 needed colors do not match exactly.\n",
738b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  colorsfailed );
739b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor         }
740b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      }
741b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   }
742b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
743b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->dithered_pf = PF_Grayscale;
744b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->undithered_pf = PF_Grayscale;
745b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   return GL_TRUE;
746b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
747b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
748b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
749b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
750b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor/**
751e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne * Setup RGB rendering for a window with a PseudoColor, StaticColor,
7520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
753b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * color.  While this function was originally designed just for 8-bit
755a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
756b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Dithering code contributed by Bob Mercier.
757b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */
7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic GLboolean
7598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlsetup_dithered_color(int client, XMesaVisual v,
7608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                     XMesaBuffer buffer, XMesaColormap cmap)
7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{
7623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
763f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl      return GL_FALSE;
76451e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu   }
76531d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor
766b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   if (buffer) {
767b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      XMesaBuffer prevBuffer;
768b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
769ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor      if (!cmap) {
770b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         return GL_FALSE;
771b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      }
772b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
773b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
774b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      if (prevBuffer) {
775b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         /* Copy colormap stuff from previous, matching XMesaBuffer.
77649b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis          * Do this to avoid time spent in noFaultXAllocColor.
777b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner          */
778b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         copy_colortable_info(buffer, prevBuffer);
779b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      }
780b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      else {
7817f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         /* Allocate X colors and initialize color_table[], red_table[], etc */
7827f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         int r, g, b, i;
7834fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         int colorsfailed = 0;
784b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor         for (r = 0; r < DITH_R; r++) {
7855b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek            for (g = 0; g < DITH_G; g++) {
786e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis               for (b = 0; b < DITH_B; b++) {
787e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor                  XMesaColor xcol;
788320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian                  int exact, alloced;
789b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(DITH_R-1),65535);
7902171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535);
791b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(DITH_B-1),65535);
792b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  noFaultXAllocColor( client, v->display,
793b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                                      cmap, GET_COLORMAP_SIZE(v),
794b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                                      &xcol, &exact, &alloced );
795b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  if (!exact) {
796b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                     colorsfailed++;
797b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  }
798b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                  if (alloced) {
799b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                     assert(buffer->num_alloced<256);
80084bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
801cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                     buffer->num_alloced++;
802837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor                  }
80384bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne                  i = DITH_MIX( r, g, b );
80484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne                  assert(i < 576);
805ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt                  buffer->color_table[i] = xcol.pixel;
806d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor                  assert(xcol.pixel < 65536);
807d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1);
808837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1);
809837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1);
810cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor               }
811a126651270acf17c434f60f86a3ab3687f87813aDouglas Gregor            }
812a126651270acf17c434f60f86a3ab3687f87813aDouglas Gregor         }
8132171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor
8142171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
815cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor            _mesa_warning(NULL,
8162171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor                  "Note: %d out of %d needed colors do not match exactly.\n",
817b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                  colorsfailed, DITH_R * DITH_G * DITH_B );
8182f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner         }
819b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      }
820b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
821b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
822f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth   v->dithered_pf = PF_Dither;
8231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   v->undithered_pf = PF_Lookup;
824b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   return GL_TRUE;
8252f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner}
826b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
827b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
828b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/**
829b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
83061d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
83161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor * Special dithering tables have to be initialized.
832b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */
833b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic void
834b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnersetup_8bit_hpcr(XMesaVisual v)
835b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{
836b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
837b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
838b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    * on the root window AND the colormap obtainable by XGetRGBColormaps
839b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    * for that atom must be set on the window.  (see also tkInitWindow)
840b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    * If that colormap is not set, the output will look stripy.
841b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    */
842b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
843b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* Setup color tables with gamma correction */
844b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   int i;
845b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   double g;
846b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
847b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   g = 1.0 / v->RedGamma;
848b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   for (i=0; i<256; i++) {
849b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g ));
850b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
851b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
852a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCall
853d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff   g = 1.0 / v->GreenGamma;
854b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   for (i=0; i<256; i++) {
855b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g ));
856b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
857b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   }
858b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
859b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   g = 1.0 / v->BlueGamma;
860b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   for (i=0; i<256; i++) {
861b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g ));
862b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
863b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   }
864b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
865b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->dithered_pf = PF_HPCR;
866b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
867b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* which method should I use to clear */
868b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* GL_FALSE: keep the ordinary method  */
869b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman   /* GL_TRUE : clear with dither pattern */
8700ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
8710ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8720ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   if (v->hpcr_clear_flag) {
8730ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
8740ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner                                               DefaultRootWindow(v->display),
8750ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner                                               16, 2, 8);
8760ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner#ifndef XFree86Server
8770ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
8780ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner                                       0, 0, 16, 2, AllPlanes, ZPixmap);
8790ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner#endif
8800ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   }
8810ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner}
8820ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8830ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8840ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner/**
8850ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner * Setup RGB rendering for a window with a True/DirectColor visual.
886b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */
887b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic void
8880ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattnersetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap)
889b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{
8900ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   unsigned long rmask, gmask, bmask;
8910ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   (void) buffer;
8920ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner   (void) cmap;
8930ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
894b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* Compute red multiplier (mask) and bit shift */
895b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->rshift = 0;
896b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   rmask = GET_REDMASK(v);
897b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   while ((rmask & 1)==0) {
898b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      v->rshift++;
899b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      rmask = rmask >> 1;
900b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   }
901b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
902b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* Compute green multiplier (mask) and bit shift */
903b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->gshift = 0;
904b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   gmask = GET_GREENMASK(v);
905b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   while ((gmask & 1)==0) {
906b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      v->gshift++;
907b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      gmask = gmask >> 1;
908b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   }
909b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
910b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /* Compute blue multiplier (mask) and bit shift */
911b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   v->bshift = 0;
912b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   bmask = GET_BLUEMASK(v);
913b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   while ((bmask & 1)==0) {
914b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      v->bshift++;
915b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor      bmask = bmask >> 1;
916b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   }
917b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
918b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   /*
919b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    * Compute component-to-pixel lookup tables and dithering kernel
920b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor    */
921b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor   {
922a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor      static GLubyte kernel[16] = {
923a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor          0*16,  8*16,  2*16, 10*16,
924a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor         12*16,  4*16, 14*16,  6*16,
9254800a5c79023271408af49797e09be32aca93232Douglas Gregor          3*16, 11*16,  1*16,  9*16,
926f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth         15*16,  7*16, 13*16,  5*16,
9274800a5c79023271408af49797e09be32aca93232Douglas Gregor      };
9284800a5c79023271408af49797e09be32aca93232Douglas Gregor      GLint rBits = _mesa_bitcount(rmask);
9294800a5c79023271408af49797e09be32aca93232Douglas Gregor      GLint gBits = _mesa_bitcount(gmask);
930b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      GLint bBits = _mesa_bitcount(bmask);
931b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      GLint maxBits;
932b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      GLuint i;
933b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
934b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
935e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=0; i<=rmask; i++)
936e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      for (i=0; i<=gmask; i++)
938e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
939e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=0; i<=bmask; i++)
940e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
941e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
942e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      /* convert RGB values from [0,255] to pixel components */
943e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
944e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=0;i<256;i++) {
9451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         GLint r = gamma_adjust(v->RedGamma,   i, 255);
946832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor         GLint g = gamma_adjust(v->GreenGamma, i, 255);
947e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
949832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
950e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
9511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
952e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      /* overflow protection */
953e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=256;i<512;i++) {
954832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor         v->RtoPixel[i] = v->RtoPixel[255];
955e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->GtoPixel[i] = v->GtoPixel[255];
956e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->BtoPixel[i] = v->BtoPixel[255];
9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
958e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
959e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      /* setup dithering kernel */
960e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      maxBits = rBits;
9611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (gBits > maxBits)  maxBits = gBits;
962e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      if (bBits > maxBits)  maxBits = bBits;
963e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=0;i<16;i++) {
964e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->Kernel[i] = kernel[i] >> maxBits;
965e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      }
966e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
9671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      v->undithered_pf = PF_Truecolor;
968e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor;
969e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   }
970b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
9713397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   /*
972832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor    * Now check for TrueColor visuals which we can optimize.
9738e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis    */
9742bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor   if (   GET_REDMASK(v)  ==0x0000ff
975b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor       && GET_GREENMASK(v)==0x00ff00
976e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor       && GET_BLUEMASK(v) ==0xff0000
977bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor       && CHECK_BYTE_ORDER(v)
978e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor       && v->BitsPerPixel==32
979e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
9803397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      /* common 32 bpp config used on SGI, Sun */
9813397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */
982e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   }
983e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   else if (GET_REDMASK(v)  == 0xff0000
984e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         && GET_GREENMASK(v)== 0x00ff00
985bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis         && GET_BLUEMASK(v) == 0x0000ff
986e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor         && CHECK_BYTE_ORDER(v)
987e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){
9881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (v->BitsPerPixel==32) {
989e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         /* if 32 bpp, and visual indicates 8 bpp alpha channel */
990e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor         if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8)
9918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */
9928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         else
993e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */
994e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      }
995832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor      else if (v->BitsPerPixel == 24) {
996bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis         v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */
997e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor      }
998e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor   }
999e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor   else if (GET_REDMASK(v)  ==0xf800
1000e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor       &&   GET_GREENMASK(v)==0x07e0
1001e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor       &&   GET_BLUEMASK(v) ==0x001f
1002e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor       && CHECK_BYTE_ORDER(v)
1003e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor       && v->BitsPerPixel==16
100410bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
100510bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor      /* 5-6-5 RGB */
100610bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor      v->undithered_pf = PF_5R6G5B;
100710bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor      v->dithered_pf = PF_Dither_5R6G5B;
100810bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor   }
100910bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor   else if (GET_REDMASK(v)  ==0xe0
101010bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor       &&   GET_GREENMASK(v)==0x1c
101110bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor       &&   GET_BLUEMASK(v) ==0x03
101210bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor       && CHECK_FOR_HPCR(v)) {
101310bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor      /* 8-bit HP color recovery */
101410bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor      setup_8bit_hpcr( v );
101510bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor   }
101610bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor}
101710bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor
1018e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor
1019e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor
10201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/**
102131d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * Setup RGB rendering for a window with a monochrome visual.
1022b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor */
1023b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregorstatic void
1024b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregorsetup_monochrome( XMesaVisual v, XMesaBuffer b )
10258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{
1026b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor   (void) b;
1027b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor   v->dithered_pf = v->undithered_pf = PF_1Bit;
1028b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor   /* if black=1 then we must flip pixel values */
1029f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
1031fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer
1032b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
1033aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam
10341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/**
1035e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor * When a context is bound for the first time, we can finally finish
1036b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor * initializing the context's visual and buffer information.
10378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * \param v  the XMesaVisual to initialize
1038ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar * \param b  the XMesaBuffer to initialize (may be NULL)
103931d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * \param rgb_flag  TRUE = RGBA mode, FALSE = color index mode
104031d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * \param window  the window/pixmap we're rendering into
104131d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * \param cmap  the colormap associated with the window/pixmap
104231d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * \return GL_TRUE=success, GL_FALSE=failure
1043b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor */
104411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnamstatic GLboolean
10458e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidisinitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
10468e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                             XMesaDrawable window,
10478e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                             XMesaColormap cmap)
10488e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis{
10498e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   int client = 0;
10508e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   const int xclass = v->mesa_visual.visualType;
10518e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
1052f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith#ifdef XFree86Server
10538e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   client = (window) ? CLIENT_ID(window->id) : 0;
10548e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis#endif
10558e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10568e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   ASSERT(!b || b->xm_visual == v);
10578e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10588e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   /* Save true bits/pixel */
10598e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   v->BitsPerPixel = bits_per_pixel(v);
10608e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis   assert(v->BitsPerPixel > 0);
10618e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
1062f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek   /* RGB WINDOW:
1063f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek    * We support RGB rendering into almost any kind of visual.
10648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    */
1065f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek   if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
1066f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek      setup_truecolor( v, b, cmap );
1067445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor   }
10688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) {
1069f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek      setup_monochrome( v, b );
1070f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek   }
10712bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor   else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) {
10722bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor      if (!setup_grayscale( client, v, b, cmap )) {
10732bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor	 return GL_FALSE;
1074a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      }
10750a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   }
10767d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor   else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR)
10777d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor	    && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
10787d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor      if (!setup_dithered_color( client, v, b, cmap )) {
10797d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor	 return GL_FALSE;
10807d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor      }
1081b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor   }
1082b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor   else {
1083b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor      _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n");
10848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      return GL_FALSE;
10850a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   }
10860a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   v->mesa_visual.indexBits = 0;
108714f79002e58556798e86168c63e48d533287eda5Douglas Gregor
10884fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   if (_mesa_getenv("MESA_NO_DITHER")) {
10894fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      v->dithered_pf = v->undithered_pf;
10904fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   }
10914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
10924fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
10933397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   /*
10944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    * If MESA_INFO env var is set print out some debugging info
10954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    * which can help Brian figure out what's going on when a user
10964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    * reports bugs.
10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    */
109874e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner   if (_mesa_getenv("MESA_INFO")) {
109974e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner      printf("X/Mesa visual = %p\n", (void *) v);
11004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
11014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
11022596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar      printf("X/Mesa level = %d\n", v->mesa_visual.level);
11034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
11051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   }
11065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
11074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   if (b && window) {
11084fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      char *data;
11094fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
111074e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner      /* Do window-specific initializations */
11114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /* these should have been set in create_xmesa_buffer */
11134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      ASSERT(b->frontxrb->drawable == window);
11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window);
11155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
11164fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /* Setup for single/double buffering */
11174fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      if (v->mesa_visual.doubleBufferMode) {
11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         /* Double buffered */
11195f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner         b->shm = check_for_xshm( v->display );
11204fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
11214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11224fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /* X11 graphics contexts */
11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#ifdef XFree86Server
112474e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner      b->gc = CreateScratchGC(v->display, window->depth);
112574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner#else
112674e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner      b->gc = XCreateGC( v->display, window, 0, NULL );
112774e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner#endif
112874e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner      XMesaSetFunction( v->display, b->gc, GXcopy );
11294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11304fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /* cleargc - for glClear() */
11314fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server
11324fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      b->cleargc = CreateScratchGC(v->display, window->depth);
11334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#else
11344fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      b->cleargc = XCreateGC( v->display, window, 0, NULL );
11353397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif
1136a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      XMesaSetFunction( v->display, b->cleargc, GXcopy );
11374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /*
11393397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
11404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       * Patch contributed by Michael Pichler May 15, 1995.
11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump       */
11424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server
1143e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      b->swapgc = CreateScratchGC(v->display, window->depth);
11445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      {
11451e5f83ba515157dc7f263dc91b1d51c7a5754c35Chris Lattner         CARD32 v[1];
1146e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v[0] = FALSE;
11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
11484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
1149f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith#else
11504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      {
11514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         XGCValues gcvalues;
11524fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         gcvalues.graphics_exposures = False;
11534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         b->swapgc = XCreateGC(v->display, window,
11544fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                               GCGraphicsExposures, &gcvalues);
11554fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
11564fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#endif
11574fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      XMesaSetFunction( v->display, b->swapgc, GXcopy );
11584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /*
11594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       * Set fill style and tile pixmap once for all for HPCR stuff
11604fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       * (instead of doing it each time in clear_color_HPCR_pixmap())
11618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl       * Initialize whole stuff
11624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       * Patch contributed by Jacques Leroy March 8, 1998.
11634fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       */
11644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) {
11654fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         int i;
11664fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         for (i = 0; i < 16; i++) {
11674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
11684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
11698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         }
11704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap,
11714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                       b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
1172ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar         XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
11734fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
11744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
11754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
117614f79002e58556798e86168c63e48d533287eda5Douglas Gregor      /* Initialize the row buffer XImage for use in write_color_span() */
117714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      data = (char*) MALLOC(MAX_WIDTH*4);
117814f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server
117914f79002e58556798e86168c63e48d533287eda5Douglas Gregor      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, data);
118014f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else
1181c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      b->rowimage = XCreateImage( v->display,
118214f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  v->visinfo->visual,
118314f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  v->visinfo->depth,
11848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                                  ZPixmap, 0,           /*format, offset*/
118514f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  data,                 /*data*/
118614f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  MAX_WIDTH, 1,         /*width, height*/
118714f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  32,                   /*bitmap_pad*/
118814f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  0                     /*bytes_per_line*/ );
11892d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor#endif
11902d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor      if (!b->rowimage)
11912d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor         return GL_FALSE;
1192a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor   }
1193d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis
119410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis   return GL_TRUE;
119510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis}
119614f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1197c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
119814f79002e58556798e86168c63e48d533287eda5Douglas Gregor
119914f79002e58556798e86168c63e48d533287eda5Douglas Gregor/*
120014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * Convert an RGBA color to a pixel value.
120114f79002e58556798e86168c63e48d533287eda5Douglas Gregor */
1202c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregorunsigned long
120314f79002e58556798e86168c63e48d533287eda5Douglas Gregorxmesa_color_to_pixel(GLcontext *ctx,
120414f79002e58556798e86168c63e48d533287eda5Douglas Gregor                     GLubyte r, GLubyte g, GLubyte b, GLubyte a,
12058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                     GLuint pixelFormat)
120614f79002e58556798e86168c63e48d533287eda5Douglas Gregor{
120714f79002e58556798e86168c63e48d533287eda5Douglas Gregor   XMesaContext xmesa = XMESA_CONTEXT(ctx);
120814f79002e58556798e86168c63e48d533287eda5Douglas Gregor   switch (pixelFormat) {
120914f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_Index:
121014f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return 0;
1211c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      case PF_Truecolor:
121214f79002e58556798e86168c63e48d533287eda5Douglas Gregor         {
121314f79002e58556798e86168c63e48d533287eda5Douglas Gregor            unsigned long p;
121414f79002e58556798e86168c63e48d533287eda5Douglas Gregor            PACK_TRUECOLOR( p, r, g, b );
121514f79002e58556798e86168c63e48d533287eda5Douglas Gregor            return p;
1216c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor         }
121714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_8A8B8G8R:
121814f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return PACK_8A8B8G8R( r, g, b, a );
12198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PF_8A8R8G8B:
122014f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return PACK_8A8R8G8B( r, g, b, a );
1221c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      case PF_8R8G8B:
122214f79002e58556798e86168c63e48d533287eda5Douglas Gregor         /* fall through */
122314f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_8R8G8B24:
1224f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth         return PACK_8R8G8B( r, g, b );
1225f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth      case PF_5R6G5B:
1226f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth         return PACK_5R6G5B( r, g, b );
122714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_Dither:
122814f79002e58556798e86168c63e48d533287eda5Douglas Gregor         {
1229f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth            DITHER_SETUP;
123014f79002e58556798e86168c63e48d533287eda5Douglas Gregor            return DITHER( 1, 0, r, g, b );
123114f79002e58556798e86168c63e48d533287eda5Douglas Gregor         }
123214f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_1Bit:
123314f79002e58556798e86168c63e48d533287eda5Douglas Gregor         /* 382 = (3*255)/2 */
1234f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1235c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      case PF_HPCR:
123614f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return DITHER_HPCR(1, 1, r, g, b);
123714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_Lookup:
1238cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         {
1239cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            LOOKUP_SETUP;
1240cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            return LOOKUP( r, g, b );
1241cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         }
1242590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis      case PF_Grayscale:
1243cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         return GRAY_RGB( r, g, b );
1244b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      case PF_Dither_True:
1245b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor         /* fall through */
1246b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor      case PF_Dither_5R6G5B:
1247b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor         {
1248cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            unsigned long p;
1249590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis            PACK_TRUEDITHER(p, 1, 0, r, g, b);
1250cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            return p;
1251cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         }
1252cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      default:
1253cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor         _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel");
1254cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   }
1255cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   return 0;
1256cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1257cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1258cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1259cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#define NUM_VISUAL_TYPES   6
1260cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1261cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/**
1262cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Convert an X visual type to a GLX visual type.
1263cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *
1264cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.)
1265cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *        to be converted.
1266cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * \return If \c visualType is a valid X visual type, a GLX visual type will
12675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner *         be returned.  Otherwise \c GLX_NONE will be returned.
1268cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *
1269cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * \note
1270cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the
1271b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * DRI CVS tree.
1272cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */
1273cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregorstatic GLint
1274cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregorxmesa_convert_from_x_visual_type( int visualType )
1275cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{
12765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    static const int glx_visual_types[ NUM_VISUAL_TYPES ] = {
1277cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor	GLX_STATIC_GRAY,  GLX_GRAY_SCALE,
1278cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor	GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
1279cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor	GLX_TRUE_COLOR,   GLX_DIRECT_COLOR
12805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    };
1281cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1282cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    return ( (unsigned) visualType < NUM_VISUAL_TYPES )
1283cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor	? glx_visual_types[ visualType ] : GLX_NONE;
1284cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1285b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1286b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1287b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor/**********************************************************************/
1288b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor/*****                       Public Functions                     *****/
1289b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor/**********************************************************************/
1290cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1291cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1292cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/*
1293cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Create a new X/Mesa visual.
1294cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Input:  display - X11 display
1295cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         visinfo - an XVisualInfo pointer
1296cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor *         rgb_flag - GL_TRUE = RGB mode,
1297b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *                    GL_FALSE = color index mode
1298b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         alpha_flag - alpha buffer requested?
1299b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         db_flag - GL_TRUE = double-buffered,
1300b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *                   GL_FALSE = single buffered
1301b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         stereo_flag - stereo visual?
1302b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1303b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *                       GL_FALSE = use an off-screen pixmap for back buffer
1304b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         depth_size - requested bits/depth values, or zero
1305b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         stencil_size - requested bits/stencil values, or zero
1306b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         accum_red_size - requested bits/red accum values, or zero
1307b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         accum_green_size - requested bits/green accum values, or zero
1308b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         accum_blue_size - requested bits/blue accum values, or zero
1309b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         accum_alpha_size - requested bits/alpha accum values, or zero
1310b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         num_samples - number of samples/pixel if multisampling, or zero
1311b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         level - visual level, usually 0
1312b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor *         visualCaveat - ala the GLX extension, usually GLX_NONE
1313b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * Return;  a new XMesaVisual or 0 if error.
1314b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor */
1315cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorPUBLIC
1316cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
1317b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                               XMesaVisualInfo visinfo,
1318b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                               GLboolean rgb_flag,
1319b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                               GLboolean alpha_flag,
1320cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLboolean db_flag,
1321cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLboolean stereo_flag,
1322cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLboolean ximage_flag,
1323cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint depth_size,
1324cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint stencil_size,
1325cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint accum_red_size,
1326cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint accum_green_size,
1327cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint accum_blue_size,
1328590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis                               GLint accum_alpha_size,
13295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                               GLint num_samples,
1330cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint level,
1331cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                               GLint visualCaveat )
1332cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{
1333cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   char *gamma;
1334cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   XMesaVisual v;
1335cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   GLint red_bits, green_bits, blue_bits, alpha_bits;
1336cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
13375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#ifndef XFree86Server
1338cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   /* For debugging only */
1339cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   if (_mesa_getenv("MESA_XSYNC")) {
1340cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      /* This makes debugging X easier.
1341cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor       * In your debugger, set a breakpoint on _XError to stop when an
1342cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor       * X protocol error is generated.
1343cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor       */
1344590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis      XSynchronize( display, 1 );
1345590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis   }
1346590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis#endif
1347cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1348cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   /* Color-index rendering not supported. */
1349cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   if (!rgb_flag)
1350cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      return NULL;
1351cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1352cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1353cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   if (!v) {
1354cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      return NULL;
1355cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   }
1356cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1357cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->display = display;
1358cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1359cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   /* Save a copy of the XVisualInfo struct because the user may Xfree()
1360cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    * the struct but we may need some of the information contained in it
1361cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    * at a later time.
1362cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    */
1363cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#ifndef XFree86Server
1364cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1365cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   if(!v->visinfo) {
1366f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith      free(v);
1367cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      return NULL;
1368cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   }
1369cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   memcpy(v->visinfo, visinfo, sizeof(*visinfo));
1370cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#endif
1371cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1372cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   /* check for MESA_GAMMA environment variable */
1373cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   gamma = _mesa_getenv("MESA_GAMMA");
1374cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   if (gamma) {
1375cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1376cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1377cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1378cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1379cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1380cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   }
1381b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   else {
1382cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1383cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   }
1384cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1385b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor   v->ximage_flag = ximage_flag;
1386cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1387cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#ifdef XFree86Server
1388cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   /* We could calculate these values by ourselves.  nplanes is either the sum
1389cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    * of the red, green, and blue bits or the number index bits.
1390b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    * ColormapEntries is either (1U << index_bits) or
1391b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor    * (1U << max(redBits, greenBits, blueBits)).
1392cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor    */
1393cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   assert(visinfo->nplanes > 0);
1394cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->nplanes = visinfo->nplanes;
1395cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->ColormapEntries = visinfo->ColormapEntries;
1396cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1397cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.redMask = visinfo->redMask;
1398cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor   v->mesa_visual.greenMask = visinfo->greenMask;
139914f79002e58556798e86168c63e48d533287eda5Douglas Gregor   v->mesa_visual.blueMask = visinfo->blueMask;
140014f79002e58556798e86168c63e48d533287eda5Douglas Gregor   v->mesa_visual.visualID = visinfo->vid;
140114f79002e58556798e86168c63e48d533287eda5Douglas Gregor   v->mesa_visual.screen = 0; /* FIXME: What should be done here? */
140214f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else
140314f79002e58556798e86168c63e48d533287eda5Douglas Gregor   v->mesa_visual.redMask = visinfo->red_mask;
140414f79002e58556798e86168c63e48d533287eda5Douglas Gregor   v->mesa_visual.greenMask = visinfo->green_mask;
140514f79002e58556798e86168c63e48d533287eda5Douglas Gregor   v->mesa_visual.blueMask = visinfo->blue_mask;
140614f79002e58556798e86168c63e48d533287eda5Douglas Gregor   v->mesa_visual.visualID = visinfo->visualid;
1407a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   v->mesa_visual.screen = visinfo->screen;
1408e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor#endif
1409832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor
14107f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus))
14117f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class);
1412f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner#else
14138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class);
141414f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif
141514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1416828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner   v->mesa_visual.visualRating = visualCaveat;
1417828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner
1418828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner   if (alpha_flag)
1419f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth      v->mesa_visual.alphaBits = 8;
14207f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
142114f79002e58556798e86168c63e48d533287eda5Douglas Gregor   (void) initialize_visual_and_buffer( v, NULL, 0, 0 );
142214f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1423090d9b53e32bb30d9e74de895bb59b409bd49e00Chris Lattner   {
14244cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis      const int xclass = v->mesa_visual.visualType;
14254cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
14264cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis         red_bits   = _mesa_bitcount(GET_REDMASK(v));
14277f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         green_bits = _mesa_bitcount(GET_GREENMASK(v));
1428f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor         blue_bits  = _mesa_bitcount(GET_BLUEMASK(v));
1429f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      }
14300fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl      else {
1431bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor         /* this is an approximation */
1432f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor         int depth;
143311a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam         depth = GET_VISUAL_DEPTH(v);
14347f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         red_bits = depth / 3;
14357f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         depth -= red_bits;
14367f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         green_bits = depth / 2;
143714f79002e58556798e86168c63e48d533287eda5Douglas Gregor         depth -= green_bits;
143814f79002e58556798e86168c63e48d533287eda5Douglas Gregor         blue_bits = depth;
143914f79002e58556798e86168c63e48d533287eda5Douglas Gregor         alpha_bits = 0;
1440a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
1441a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      }
14428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      alpha_bits = v->mesa_visual.alphaBits;
14434cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis   }
14444cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
14458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   _mesa_initialize_visual( &v->mesa_visual,
144614f79002e58556798e86168c63e48d533287eda5Douglas Gregor                            db_flag, stereo_flag,
1447f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth                            red_bits, green_bits,
14487f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                            blue_bits, alpha_bits,
144914f79002e58556798e86168c63e48d533287eda5Douglas Gregor                            depth_size,
145014f79002e58556798e86168c63e48d533287eda5Douglas Gregor                            stencil_size,
1451f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                            accum_red_size, accum_green_size,
1452f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                            accum_blue_size, accum_alpha_size,
145314f79002e58556798e86168c63e48d533287eda5Douglas Gregor                            0 );
145414f79002e58556798e86168c63e48d533287eda5Douglas Gregor
145514f79002e58556798e86168c63e48d533287eda5Douglas Gregor   /* XXX minor hack */
145614f79002e58556798e86168c63e48d533287eda5Douglas Gregor   v->mesa_visual.level = level;
1457bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor   return v;
145814f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
145914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1460b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis
1461b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios KyrtzidisPUBLIC
1462a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregorvoid XMesaDestroyVisual( XMesaVisual v )
1463b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis{
146414f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifndef XFree86Server
146514f79002e58556798e86168c63e48d533287eda5Douglas Gregor   free(v->visinfo);
14661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#endif
14672d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor   free(v);
1468b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis}
1469b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis
1470a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor
1471d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis
147210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis/**
147310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * Create a new XMesaContext.
147410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * \param v  the XMesaVisual
147510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * \param share_list  another XMesaContext with which to share display
147610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis *                    lists or NULL if no sharing is wanted.
147710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * \return an XMesaContext or NULL if error.
147810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis */
147910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios KyrtzidisPUBLIC
148010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios KyrtzidisXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1481a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor{
1482e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   static GLboolean firstTime = GL_TRUE;
1483b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis   XMesaContext c;
1484f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith   GLcontext *mesaCtx;
14852c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson   struct dd_function_table functions;
14862c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson   TNLcontext *tnl;
14872c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson
14882c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson   if (firstTime) {
14892c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson      _glthread_INIT_MUTEX(_xmesa_lock);
14902c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson      firstTime = GL_FALSE;
14912c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson   }
1492fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer
1493aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam   /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */
14941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1495e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   if (!c)
1496ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar      return NULL;
1497a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor
1498a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor   mesaCtx = &(c->mesa);
1499a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor
1500a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor   /* initialize with default driver functions, then plug in XMesa funcs */
1501a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor   _mesa_init_driver_functions(&functions);
1502a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor   xmesa_init_driver_functions(v, &functions);
1503a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor   if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual,
1504a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor                      share_list ? &(share_list->mesa) : (GLcontext *) NULL,
1505a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor                      &functions, (void *) c)) {
1506a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor      free(c);
150714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      return NULL;
150814f79002e58556798e86168c63e48d533287eda5Douglas Gregor   }
150914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
151014f79002e58556798e86168c63e48d533287eda5Douglas Gregor   /* Enable this to exercise fixed function -> shader translation
151114f79002e58556798e86168c63e48d533287eda5Douglas Gregor    * with software rendering.
151214f79002e58556798e86168c63e48d533287eda5Douglas Gregor    */
151314f79002e58556798e86168c63e48d533287eda5Douglas Gregor   if (0) {
151436c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor      mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE;
1515e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner      mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
151614f79002e58556798e86168c63e48d533287eda5Douglas Gregor   }
1517ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar
15185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner   _mesa_enable_sw_extensions(mesaCtx);
151914f79002e58556798e86168c63e48d533287eda5Douglas Gregor   _mesa_enable_1_3_extensions(mesaCtx);
15208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   _mesa_enable_1_4_extensions(mesaCtx);
1521c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor   _mesa_enable_1_5_extensions(mesaCtx);
15225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner   _mesa_enable_2_0_extensions(mesaCtx);
1523ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar   _mesa_enable_2_1_extensions(mesaCtx);
15247f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#if ENABLE_EXT_texure_compression_s3tc
1525f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    if (mesaCtx->Mesa_DXTn) {
1526f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor       _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc");
1527f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor       _mesa_enable_extension(mesaCtx, "GL_S3_s3tc");
152814f79002e58556798e86168c63e48d533287eda5Douglas Gregor    }
152914f79002e58556798e86168c63e48d533287eda5Douglas Gregor    _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1");
1530f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth#endif
15311728762d5a8cfaf8d64385f47b311e84de1ae7a2Chandler Carruth#if ENABLE_EXT_timer_query
153278df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth    _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query");
153378df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth#endif
1534d21683cdc0ff4217bfd98a9d8d0c1083b642caacArgyrios Kyrtzidis
1535d21683cdc0ff4217bfd98a9d8d0c1083b642caacArgyrios Kyrtzidis#ifdef XFree86Server
153614f79002e58556798e86168c63e48d533287eda5Douglas Gregor   /* If we're running in the X server, do bounds checking to prevent
1537f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor    * segfaults and server crashes!
1538f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor    */
1539bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor   mesaCtx->Const.CheckArrayBounds = GL_TRUE;
1540f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif
1541f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor
1542f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth   /* finish up xmesa context initializations */
154314f79002e58556798e86168c63e48d533287eda5Douglas Gregor   c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE;
154414f79002e58556798e86168c63e48d533287eda5Douglas Gregor   c->xm_visual = v;
154514f79002e58556798e86168c63e48d533287eda5Douglas Gregor   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
15467f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   c->display = v->display;
1547bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
15487f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
15497f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   /* Initialize the software rasterizer and helper modules.
15502eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor    */
15513397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (!_swrast_CreateContext( mesaCtx ) ||
15527f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor       !_vbo_CreateContext( mesaCtx ) ||
15537f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor       !_tnl_CreateContext( mesaCtx ) ||
15547f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor       !_swsetup_CreateContext( mesaCtx )) {
15558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      _mesa_free_context_data(&c->mesa);
15567f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      free(c);
1557f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      return NULL;
15587f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   }
15597f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
15601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   /* tnl setup */
15617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   tnl = TNL_CONTEXT(mesaCtx);
15628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   tnl->Driver.RunPipeline = _tnl_run_pipeline;
15637f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   /* swrast setup */
1564f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   xmesa_register_swrast_functions( mesaCtx );
15656e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer   _swsetup_Wakeup(mesaCtx);
15667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
15674cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis   _mesa_meta_init(mesaCtx);
15684cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15694cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis   return c;
15704cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis}
15714cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15724cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15734cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15744cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisPUBLIC
15754cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidisvoid XMesaDestroyContext( XMesaContext c )
15764cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis{
15774cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis   GLcontext *mesaCtx = &c->mesa;
15784cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15793397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#ifdef FX
15807f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   FXdestroyContext( XMESA_BUFFER(mesaCtx->DrawBuffer) );
15818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif
1582f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1583f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   _mesa_meta_free( mesaCtx );
1584f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1585f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   _swsetup_DestroyContext( mesaCtx );
1586f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   _swrast_DestroyContext( mesaCtx );
1587f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   _tnl_DestroyContext( mesaCtx );
1588f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   _vbo_DestroyContext( mesaCtx );
1589f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   _mesa_free_context_data( mesaCtx );
1590f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   free( c );
1591f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor}
1592f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1593f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1594f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1595f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor/**
1596f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * Private function for creating an XMesaBuffer which corresponds to an
1597f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * X window or pixmap.
1598f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * \param v  the window's XMesaVisual
1599f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * \param w  the window we're wrapping
1600f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * \return  new XMesaBuffer or NULL if error
1601f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor */
1602f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas GregorPUBLIC XMesaBuffer
1603f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas GregorXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w)
1604f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor{
1605f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#ifndef XFree86Server
1606f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   XWindowAttributes attr;
1607f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif
1608f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   XMesaBuffer b;
1609f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   XMesaColormap cmap;
1610f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   int depth;
1611f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1612f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   assert(v);
1613f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   assert(w);
1614f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1615f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   /* Check that window depth matches visual depth */
1616f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#ifdef XFree86Server
1617f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   depth = ((XMesaDrawable)w)->depth;
1618f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#else
1619f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   XGetWindowAttributes( v->display, w, &attr );
1620f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   depth = attr.depth;
1621f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif
1622f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor   if (GET_VISUAL_DEPTH(v) != depth) {
1623f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
1624f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                    GET_VISUAL_DEPTH(v), depth);
162514f79002e58556798e86168c63e48d533287eda5Douglas Gregor      return NULL;
162614f79002e58556798e86168c63e48d533287eda5Douglas Gregor   }
16274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
16284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   /* Find colormap */
16294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server
16304fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
16319c7361006b8cd95333958150dd0c803261807b68Douglas Gregor#else
16329c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   if (attr.colormap) {
16339c7361006b8cd95333958150dd0c803261807b68Douglas Gregor      cmap = attr.colormap;
16349c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   }
16359c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   else {
16369c7361006b8cd95333958150dd0c803261807b68Douglas Gregor      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
16379c7361006b8cd95333958150dd0c803261807b68Douglas Gregor      /* this is weird, a window w/out a colormap!? */
16389c7361006b8cd95333958150dd0c803261807b68Douglas Gregor      /* OK, let's just allocate a new one and hope for the best */
16390b1fb988012da21d996c43e36867787a7a07b889Chris Lattner      cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
16400b1fb988012da21d996c43e36867787a7a07b889Chris Lattner   }
16410b1fb988012da21d996c43e36867787a7a07b889Chris Lattner#endif
16427143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor
1643e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis   b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap);
1644e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis   if (!b)
1645e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      return NULL;
1646e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis
16477c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   if (!initialize_visual_and_buffer( v, b, (XMesaDrawable) w, cmap )) {
16487c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner      xmesa_free_buffer(b);
1649c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner      return NULL;
1650c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner   }
1651c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner
16528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   return b;
1653c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner}
16542eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor
16552eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor
16562eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor
1657ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor/**
16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Create a new XMesaBuffer from an X pixmap.
16593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl *
16602eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor * \param v    the XMesaVisual
16612eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor * \param p    the pixmap
16622eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or
16631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump *             \c GLX_DIRECT_COLOR visual for the pixmap
1664ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor * \returns new XMesaBuffer or NULL if error
16657c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner */
16667c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris LattnerPUBLIC XMesaBuffer
166720249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. SpencerXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap)
16689c7361006b8cd95333958150dd0c803261807b68Douglas Gregor{
16695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner   XMesaBuffer b;
16709c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16719c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   assert(v);
1672040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
1673040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap);
16747c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   if (!b)
16751d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor      return NULL;
1676aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor
16771d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor   if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) {
16787143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor      xmesa_free_buffer(b);
16797143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor      return NULL;
16809c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   }
16819c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16829c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   return b;
16839c7361006b8cd95333958150dd0c803261807b68Douglas Gregor}
16849c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16859c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16869c7361006b8cd95333958150dd0c803261807b68Douglas Gregor/**
1687040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor * For GLX_EXT_texture_from_pixmap
1688040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor */
1689040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas GregorXMesaBuffer
1690040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas GregorXMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p,
1691040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor                               XMesaColormap cmap,
1692040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor                               int format, int target, int mipmap)
1693040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor{
1694040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   GET_CURRENT_CONTEXT(ctx);
1695040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   XMesaBuffer b;
16969c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   GLuint width, height;
16979c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16989c7361006b8cd95333958150dd0c803261807b68Douglas Gregor   assert(v);
1699040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
1700040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap);
1701040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor   if (!b)
17023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      return NULL;
17037c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17043397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   /* get pixmap size, update framebuffer/renderbuffer dims */
1705ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor   xmesa_get_window_size(v->display, b, &width, &height);
1706ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor   _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height);
1707ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor
1708ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor   if (target == 0) {
1709ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor      /* examine dims */
171020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer      if (ctx->Extensions.ARB_texture_non_power_of_two) {
1711eee242ff426bf79149f221798966e58688383c1eDouglas Gregor         target = GLX_TEXTURE_2D_EXT;
1712eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      }
1713eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      else if (   _mesa_bitcount(width)  == 1
17147c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner               && _mesa_bitcount(height) == 1) {
17157c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         /* power of two size */
17169c7361006b8cd95333958150dd0c803261807b68Douglas Gregor         if (height == 1) {
17179c7361006b8cd95333958150dd0c803261807b68Douglas Gregor            target = GLX_TEXTURE_1D_EXT;
17187c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         }
17197c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         else {
1720aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor            target = GLX_TEXTURE_2D_EXT;
1721aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor         }
17227c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner      }
17237c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner      else if (ctx->Extensions.NV_texture_rectangle) {
17248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         target = GLX_TEXTURE_RECTANGLE_EXT;
17257c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner      }
17268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      else {
17271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         /* non power of two textures not supported */
17287c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         XMesaDestroyBuffer(b);
17297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         return 0;
17307c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner      }
17317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   }
17327c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17337356a31327be9b3c3434a0c88746028980da5684Chris Lattner   b->TextureTarget = target;
17347c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   b->TextureFormat = format;
173520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer   b->TextureMipmap = mipmap;
17366a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
17376a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) {
17386a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      xmesa_free_buffer(b);
1739e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      return NULL;
174020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer   }
1741c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
17427c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   return b;
1743f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner}
1744df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner
1745df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner
1746df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner
1747df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerXMesaBuffer
1748df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
1749df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner                   unsigned int width, unsigned int height)
17501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{
1751df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#ifndef XFree86Server
1752df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   XMesaWindow root;
1753df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   XMesaDrawable drawable;  /* X Pixmap Drawable */
1754df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   XMesaBuffer b;
1755df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner
17567356a31327be9b3c3434a0c88746028980da5684Chris Lattner   /* allocate pixmap for front buffer */
1757df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   root = RootWindow( v->display, v->visinfo->screen );
1758df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   drawable = XCreatePixmap(v->display, root, width, height,
1759df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner                            v->visinfo->depth);
1760df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   if (!drawable)
17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return NULL;
17628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1763df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   b = create_xmesa_buffer(drawable, PBUFFER, v, cmap);
1764df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner   if (!b)
176537e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      return NULL;
17667c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17674800a5c79023271408af49797e09be32aca93232Douglas Gregor   if (!initialize_visual_and_buffer(v, b, drawable, cmap)) {
17684800a5c79023271408af49797e09be32aca93232Douglas Gregor      xmesa_free_buffer(b);
17694800a5c79023271408af49797e09be32aca93232Douglas Gregor      return NULL;
17704800a5c79023271408af49797e09be32aca93232Douglas Gregor   }
1771b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis
17724800a5c79023271408af49797e09be32aca93232Douglas Gregor   return b;
1773e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis#else
17742dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis   return 0;
1775e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis#endif
17764800a5c79023271408af49797e09be32aca93232Douglas Gregor}
17774800a5c79023271408af49797e09be32aca93232Douglas Gregor
177820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
17796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
17806a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor/*
17814800a5c79023271408af49797e09be32aca93232Douglas Gregor * Deallocate an XMesaBuffer structure and all related info.
17824800a5c79023271408af49797e09be32aca93232Douglas Gregor */
17834800a5c79023271408af49797e09be32aca93232Douglas GregorPUBLIC void
17844800a5c79023271408af49797e09be32aca93232Douglas GregorXMesaDestroyBuffer(XMesaBuffer b)
17854800a5c79023271408af49797e09be32aca93232Douglas Gregor{
17864800a5c79023271408af49797e09be32aca93232Douglas Gregor   xmesa_free_buffer(b);
17874800a5c79023271408af49797e09be32aca93232Douglas Gregor}
17884800a5c79023271408af49797e09be32aca93232Douglas Gregor
17894800a5c79023271408af49797e09be32aca93232Douglas Gregor
17904800a5c79023271408af49797e09be32aca93232Douglas Gregor/**
17914800a5c79023271408af49797e09be32aca93232Douglas Gregor * Query the current window size and update the corresponding GLframebuffer
17924800a5c79023271408af49797e09be32aca93232Douglas Gregor * and all attached renderbuffers.
17934800a5c79023271408af49797e09be32aca93232Douglas Gregor * Called when:
17944800a5c79023271408af49797e09be32aca93232Douglas Gregor *  1. the first time a buffer is bound to a context.
1795272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor *  2. from glViewport to poll for window size changes
1796272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor *  3. from the XMesaResizeBuffers() API function.
1797272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor * Note: it's possible (and legal) for xmctx to be NULL.  That can happen
1798272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor * when resizing a buffer when no rendering context is bound.
17994800a5c79023271408af49797e09be32aca93232Douglas Gregor */
1800b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidisvoid
1801b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidisxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer)
18027338a922dd1164002922163200b18a2c24eb0209Douglas Gregor{
18037338a922dd1164002922163200b18a2c24eb0209Douglas Gregor   GLuint width, height;
18044800a5c79023271408af49797e09be32aca93232Douglas Gregor   xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height);
180520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer   if (drawBuffer->mesa_buffer.Width != width ||
18062dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis       drawBuffer->mesa_buffer.Height != height) {
18072dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis      GLcontext *ctx = xmctx ? &xmctx->mesa : NULL;
1808e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height);
18094800a5c79023271408af49797e09be32aca93232Douglas Gregor   }
1810e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis   drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */
1811e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis}
18124800a5c79023271408af49797e09be32aca93232Douglas Gregor
18134800a5c79023271408af49797e09be32aca93232Douglas Gregor
18144800a5c79023271408af49797e09be32aca93232Douglas Gregor/*
18154800a5c79023271408af49797e09be32aca93232Douglas Gregor * Bind buffer b to context c and make c the current rendering context.
18164800a5c79023271408af49797e09be32aca93232Douglas Gregor */
18174800a5c79023271408af49797e09be32aca93232Douglas GregorGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
18189e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth{
18198f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis   return XMesaMakeCurrent2( c, b, b );
18208f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis}
18218f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis
18228f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis
1823e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis/*
1824f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth * Bind buffer b to context c and make c the current rendering context.
18254800a5c79023271408af49797e09be32aca93232Douglas Gregor */
18266a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorPUBLIC
182720249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. SpencerGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
18284800a5c79023271408af49797e09be32aca93232Douglas Gregor                             XMesaBuffer readBuffer )
18294800a5c79023271408af49797e09be32aca93232Douglas Gregor{
18304800a5c79023271408af49797e09be32aca93232Douglas Gregor   if (c) {
18314800a5c79023271408af49797e09be32aca93232Douglas Gregor      if (!drawBuffer || !readBuffer)
18324800a5c79023271408af49797e09be32aca93232Douglas Gregor         return GL_FALSE;  /* must specify buffers! */
1833f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith
18344800a5c79023271408af49797e09be32aca93232Douglas Gregor      if (&(c->mesa) == _mesa_get_current_context()
183529f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis          && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer
183629f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis          && c->mesa.ReadBuffer == &readBuffer->mesa_buffer
183729f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis          && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) {
183829f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis         /* same context and buffer, do nothing */
18394800a5c79023271408af49797e09be32aca93232Douglas Gregor         return GL_TRUE;
18404800a5c79023271408af49797e09be32aca93232Douglas Gregor      }
18414800a5c79023271408af49797e09be32aca93232Douglas Gregor
18424800a5c79023271408af49797e09be32aca93232Douglas Gregor      c->xm_buffer = drawBuffer;
18434800a5c79023271408af49797e09be32aca93232Douglas Gregor
18444800a5c79023271408af49797e09be32aca93232Douglas Gregor#ifdef FX
1845c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      if (FXmakeCurrent( drawBuffer ))
184620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer         return GL_TRUE;
18476a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#endif
18486a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
1849e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      /* Call this periodically to detect when the user has begun using
1850e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis       * GL rendering from multiple threads.
18516a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor       */
18526a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      _glapi_check_multithread();
18536a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
1854e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      xmesa_check_and_update_buffer_size(c, drawBuffer);
1855272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor      if (readBuffer != drawBuffer)
18566a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor         xmesa_check_and_update_buffer_size(c, readBuffer);
1857e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis
185820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer      _mesa_make_current(&(c->mesa),
18596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor                         &drawBuffer->mesa_buffer,
1860e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis                         &readBuffer->mesa_buffer);
1861272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor
1862e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis      /*
1863e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis       * Must recompute and set these pixel values because colormap
18646a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor       * can be different for different windows.
18650b1fb988012da21d996c43e36867787a7a07b889Chris Lattner       */
18660b1fb988012da21d996c43e36867787a7a07b889Chris Lattner      c->clearpixel = xmesa_color_to_pixel( &c->mesa,
1867e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor					    c->clearcolor[0],
1868e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor					    c->clearcolor[1],
1869e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor					    c->clearcolor[2],
1870e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor					    c->clearcolor[3],
1871e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor					    c->xm_visual->undithered_pf);
1872e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel);
1873e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
1874e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
187526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      drawBuffer->wasCurrent = GL_TRUE;
187626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor   }
187726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor   else {
187826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      /* Detach */
1879b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor      _mesa_make_current( NULL, NULL, NULL );
1880b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor   }
188126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor   return GL_TRUE;
1882b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor}
188326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
188426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor
188526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor/*
188626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor * Unbind the context c from its buffer.
18871a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor */
18884bc8738d837e5d401235f99e55277338e20e3651Douglas GregorGLboolean XMesaUnbindContext( XMesaContext c )
188955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor{
189055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor   /* A no-op for XFree86 integration purposes */
189155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor   return GL_TRUE;
189255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor}
189355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
189455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
189555988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorXMesaContext XMesaGetCurrentContext( void )
189655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor{
189755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor   GET_CURRENT_CONTEXT(ctx);
189855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor   if (ctx) {
189955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      XMesaContext xmesa = XMESA_CONTEXT(ctx);
190055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      return xmesa;
190155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor   }
190255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor   else {
1903392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      return 0;
1904392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   }
1905392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor}
1906392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1907392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1908392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorXMesaBuffer XMesaGetCurrentBuffer( void )
1909392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{
1910e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor   GET_CURRENT_CONTEXT(ctx);
1911392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   if (ctx) {
1912392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
1913392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      return xmbuf;
1914a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor   }
1915a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor   else {
19161e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      return 0;
19171e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor   }
1918392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor}
1919392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1920392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1921392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor/* New in Mesa 3.1 */
192277d029f6a24dbf70d97e61757945df53fb250ea0Douglas GregorXMesaBuffer XMesaGetCurrentReadBuffer( void )
1923392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{
1924392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   GET_CURRENT_CONTEXT(ctx);
1925392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   if (ctx) {
1926392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      return XMESA_BUFFER(ctx->ReadBuffer);
1927392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   }
1928392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   else {
1929392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      return 0;
193077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor   }
193177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor}
193277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
193377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
193477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor#ifdef XFree86Server
193577d029f6a24dbf70d97e61757945df53fb250ea0Douglas GregorPUBLIC
193651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas GregorGLboolean XMesaForceCurrent(XMesaContext c)
193751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor{
193851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor   if (c) {
193951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      _glapi_set_dispatch(c->mesa.CurrentDispatch);
194051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
194126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      if (&(c->mesa) != _mesa_get_current_context()) {
194226ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor	 _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer);
194326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      }
194426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor   }
194526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor   else {
194626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor      _mesa_make_current(NULL, NULL, NULL);
1947392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   }
19481a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor   return GL_TRUE;
1949392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor}
1950392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
19511a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor
1952392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorPUBLIC
1953e209e5026892cb07294f733c72bd51359c0f0e72Douglas GregorGLboolean XMesaLoseCurrent(XMesaContext c)
1954392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{
1955392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   (void) c;
1956392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   _mesa_make_current(NULL, NULL, NULL);
1957392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   return GL_TRUE;
1958e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor}
1959392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1960392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1961392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorPUBLIC
1962392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorGLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask )
1963392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{
1964392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask);
1965392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   return GL_TRUE;
1966392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor}
1967a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor#endif /* XFree86Server */
19681e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
19691e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
19701e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor#ifndef FX
1971392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorGLboolean XMesaSetFXmode( GLint mode )
1972392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{
197351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor   (void) mode;
197451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor   return GL_FALSE;
197551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor}
197651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor#endif
197751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
197851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
197951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
198051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/*
198151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor * Copy the back buffer to the front buffer.  If there's no back buffer
1982392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor * this is a no-op.
198310694cee2588442bee1e717f5042c58ffee25279Douglas Gregor */
1984392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorPUBLIC
198577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid XMesaSwapBuffers( XMesaBuffer b )
1986392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{
198710694cee2588442bee1e717f5042c58ffee25279Douglas Gregor   GET_CURRENT_CONTEXT(ctx);
198877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
198977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor   if (!b->backxrb) {
199077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      /* single buffered */
199177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      return;
199277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor   }
1993392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1994392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   /* If we're swapping the buffer associated with the current context
1995392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    * we have to flush any pending rendering commands first.
1996392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    */
1997392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
1998392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor      _mesa_notifySwapBuffers(ctx);
1999392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
2000392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   if (b->db_mode) {
2001392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor#ifdef FX
200255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      if (FXswapBuffers(b))
200355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor         return;
200455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor#endif
200555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor      if (b->backxrb->ximage) {
200655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor	 /* Copy Ximage (back buf) from client memory to server window */
2007bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor#if defined(USE_XSHM) && !defined(XFree86Server)
200855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor	 if (b->shm) {
200955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
201055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor	    XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
201155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor			  b->swapgc,
201255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor			  b->backxrb->ximage, 0, 0,
201355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor			  0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
2014af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor                          False );
2015af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2016af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor	 }
2017af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor	 else
2018bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor#endif
2019bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor         {
2020bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2021bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
2022bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor			   b->swapgc,
2023bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor			   b->backxrb->ximage, 0, 0,
2024bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor			   0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height );
2025bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2026af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor         }
2027af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      }
2028af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor      else if (b->backxrb->pixmap) {
2029af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor	 /* Copy pixmap (back buf) to window (front buf) on server */
2030af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2031392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor	 XMesaCopyArea( b->xm_visual->display,
2032b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor			b->backxrb->pixmap,   /* source drawable */
2033b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor			b->frontxrb->drawable,  /* dest. drawable */
2034392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor			b->swapgc,
2035b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor			0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
2036392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor			0, 0                 /* dest region */
2037392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor		      );
2038392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2039e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      }
2040e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
2041e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      if (b->swAlpha)
2042392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor         _mesa_copy_soft_alpha_renderbuffers(ctx, &b->mesa_buffer);
2043392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor   }
2044185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor#if !defined(XFree86Server)
2045185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor   XSync( b->xm_visual->display, False );
2046e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor#endif
2047185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor}
204855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
204955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
2050185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor
205155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor/*
205255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor * Copy sub-region of back buffer to front buffer
2053185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor */
2054185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregorvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2055185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor{
2056e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor   GET_CURRENT_CONTEXT(ctx);
2057e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
2058185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor   /* If we're swapping the buffer associated with the current context
2059185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor    * we have to flush any pending rendering commands first.
2060e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    */
2061185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
2062185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor      _mesa_notifySwapBuffers(ctx);
2063d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie
2064f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis   if (!b->backxrb) {
2065d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie      /* single buffered */
20663efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis      return;
20673efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis   }
2068d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie
20693efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis   if (b->db_mode) {
20703efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis      int yTop = b->mesa_buffer.Height - y - height;
20713efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis#ifdef FX
20723efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis      if (FXswapBuffers(b))
2073ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar         return;
20743efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis#endif
2075b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar      if (b->backxrb->ximage) {
2076b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar         /* Copy Ximage from host's memory to server's window */
2077b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar#if defined(USE_XSHM) && !defined(XFree86Server)
20783efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis         if (b->shm) {
2079f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis            /* XXX assuming width and height aren't too large! */
20803efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis            XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
20813efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis                          b->swapgc,
2082f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis                          b->backxrb->ximage, x, yTop,
2083f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis                          x, yTop, width, height, False );
208460f7684881f9f6bc779e91212aea89d9afc723ddArgyrios Kyrtzidis            /* wait for finished event??? */
20853efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis         }
2086f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis         else
2087f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis#endif
2088c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson         {
2089c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson            /* XXX assuming width and height aren't too large! */
2090c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
2091c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson			   b->swapgc,
2092c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson			   b->backxrb->ximage, x, yTop,
2093c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson			   x, yTop, width, height );
2094c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson         }
2095c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson      }
2096c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson      else {
2097c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson         /* Copy pixmap to window on server */
2098c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson         XMesaCopyArea( b->xm_visual->display,
2099c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson			b->backxrb->pixmap,           /* source drawable */
2100c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson			b->frontxrb->drawable,        /* dest. drawable */
2101c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson			b->swapgc,
2102c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson			x, yTop, width, height,  /* source region */
2103e92b8a1dbba150e213c4980710fcb59ec5c5c570Douglas Gregor			x, yTop                  /* dest region */
2104c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson                      );
2105c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson      }
2106c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson   }
2107c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson}
21086e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
2109c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson
2110c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson/*
21114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
21124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * is a way to get "under the hood" of X/Mesa so one can manipulate the
21134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * back buffer directly.
21140b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * Output:  pixmap - pointer to back buffer's Pixmap, or 0
21153397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl *          ximage - pointer to back buffer's XImage, or NULL
2116a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * Return:  GL_TRUE = context is double buffered
211701b81c4d074bba9c18372d521405dfe32fc4f552Argyrios Kyrtzidis *          GL_FALSE = context is single buffered
2118c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis */
2119c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis#ifndef XFree86Server
21201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpGLboolean XMesaGetBackBuffer( XMesaBuffer b,
212197475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor                              XMesaPixmap *pixmap,
212255f48de5f6b10b50f4d88a9f7235f4532f799550Douglas Gregor                              XMesaImage **ximage )
21232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
2124c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis   if (b->db_mode) {
2125681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      if (pixmap)
2126c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor         *pixmap = b->backxrb->pixmap;
2127681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      if (ximage)
2128681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl         *ximage = b->backxrb->ximage;
2129681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      return GL_TRUE;
21302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
21312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   else {
21322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      *pixmap = 0;
21331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      *ximage = NULL;
21342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return GL_FALSE;
21353397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   }
21360953e767ff7817f97b3ab20896b229891eeff45bJohn McCall}
2137a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor#endif /* XFree86Server */
2138a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor
2139a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor
21400953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/*
21418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Return the depth buffer associated with an XMesaBuffer.
21420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall * Input:  b - the XMesa buffer handle
21430953e767ff7817f97b3ab20896b229891eeff45bJohn McCall * Output:  width, height - size of buffer in pixels
21440953e767ff7817f97b3ab20896b229891eeff45bJohn McCall *          bytesPerValue - bytes per depth value (2 or 4)
21450953e767ff7817f97b3ab20896b229891eeff45bJohn McCall *          buffer - pointer to depth buffer values
21462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2147b7166334d897e1e4e6a5b428fe2d0ec752ef187fMike Stump */
21482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
21492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                               GLint *bytesPerValue, void **buffer )
21500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall{
21512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   struct gl_renderbuffer *rb
21522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer;
21532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (!rb || !rb->Data) {
2154c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      *width = 0;
21550b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor      *height = 0;
21560b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor      *bytesPerValue = 0;
2157c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      *buffer = 0;
21582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return GL_FALSE;
21592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
21604fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   else {
21614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      *width = b->mesa_buffer.Width;
21624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      *height = b->mesa_buffer.Height;
21634fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16
21642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor         ? sizeof(GLushort) : sizeof(GLuint);
21652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      *buffer = rb->Data;
21662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return GL_TRUE;
21672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
21682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
2169a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
21702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
217117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidisvoid XMesaFlush( XMesaContext c )
21722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
21732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (c && c->xm_visual) {
2174c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor#ifdef XFree86Server
21752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      /* NOT_NEEDED */
21768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#else
21775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      XSync( c->xm_visual->display, False );
217817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis#endif
217917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis   }
2180eb5e9986e577b1e2bff3cca5973a2494fb593fbbArgyrios Kyrtzidis}
21812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
21822512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor
21836e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer
21842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorconst char *XMesaGetString( XMesaContext c, int name )
21852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
21862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   (void) c;
2187a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   if (name==XMESA_VERSION) {
21881476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl      return "5.0";
21891476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   }
21901476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   else if (name==XMESA_EXTENSIONS) {
21911476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl      return "";
21921476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   }
21938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   else {
21941476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl      return NULL;
2195a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor   }
21961476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl}
21971476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl
21981476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl
21998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
22001476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian RedlXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2201a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor{
22026e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer   XMesaBuffer b;
22031476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   for (b=XMesaBufferList; b; b=b->Next) {
22041476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl      if (b->frontxrb->drawable == d && b->display == dpy) {
22051476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         return b;
22068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      }
22071476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   }
2208496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor   return NULL;
22091476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl}
22101476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl
22111476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl
22128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**
22131476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl * Free/destroy all XMesaBuffers associated with given display.
22140a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor */
22156e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramervoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy)
22161476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl{
22171476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   XMesaBuffer b, next;
221810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis   for (b = XMesaBufferList; b; b = next) {
221910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis      next = b->Next;
222010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis      if (b->display == dpy) {
222110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis         xmesa_free_buffer(b);
222210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis      }
222310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis   }
222410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis}
222510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis
222610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis
222710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis/*
222810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * Look for XMesaBuffers whose X window has been destroyed.
222910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * Deallocate any such XMesaBuffers.
223010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis */
223110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidisvoid XMesaGarbageCollect( void )
223210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis{
223310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis   XMesaBuffer b, next;
223410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis   for (b=XMesaBufferList; b; b=next) {
223510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis      next = b->Next;
223610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis      if (b->display && b->frontxrb->drawable && b->type == WINDOW) {
223710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis#ifdef XFree86Server
223810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis	 /* NOT_NEEDED */
223910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis#else
224010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis         XSync(b->display, False);
22414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         if (!window_exists( b->display, b->frontxrb->drawable )) {
22424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            /* found a dead window, free the ancillary info */
22434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            XMesaDestroyBuffer( b );
22444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         }
22453251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor#endif
2246f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      }
22473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   }
2248a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl}
2249f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2250f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2251f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2252f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                                GLfloat red, GLfloat green,
22531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                GLfloat blue, GLfloat alpha )
22545d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl{
22558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   GLcontext *ctx = &xmesa->mesa;
22565d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   GLint r = (GLint) (red   * 255.0F);
22575d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   GLint g = (GLint) (green * 255.0F);
2258f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   GLint b = (GLint) (blue  * 255.0F);
2259f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   GLint a = (GLint) (alpha * 255.0F);
22603397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   switch (xmesa->pixelformat) {
2262f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_Index:
22630eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis         return 0;
2264f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_Truecolor:
22651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         {
22661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            unsigned long p;
22675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner            PACK_TRUECOLOR( p, r, g, b );
2268f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            return p;
2269f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         }
2270f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_8A8B8G8R:
22715d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl         return PACK_8A8B8G8R( r, g, b, a );
22725d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      case PF_8A8R8G8B:
2273f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         return PACK_8A8R8G8B( r, g, b, a );
2274f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_8R8G8B:
2275f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         return PACK_8R8G8B( r, g, b );
22765d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      case PF_5R6G5B:
2277f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         return PACK_5R6G5B( r, g, b );
2278f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_Dither:
2279f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         {
2280f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            DITHER_SETUP;
2281f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            return DITHER( x, y, r, g, b );
2282f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         }
22831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      case PF_1Bit:
22845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner         /* 382 = (3*255)/2 */
22851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
228683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      case PF_HPCR:
228783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         return DITHER_HPCR(x, y, r, g, b);
2288f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_Lookup:
2289f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         {
2290f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            LOOKUP_SETUP;
2291f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            return LOOKUP( r, g, b );
2292f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         }
22931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      case PF_Grayscale:
2294f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         return GRAY_RGB( r, g, b );
2295f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      case PF_Dither_5R6G5B:
22961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         /* fall through */
22975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      case PF_Dither_True:
2298a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor         {
2299a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor            unsigned long p;
23005d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl            PACK_TRUEDITHER(p, x, y, r, g, b);
2301f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor            return p;
23025d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl         }
2303f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      default:
2304f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
2305f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
2306f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   return 0;
2307f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor}
23085d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl
2309f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2310f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor/*
2311f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * This is typically called when the window size changes and we need
2312f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * to reallocate the buffer's back/depth/stencil/accum buffers.
2313f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor */
2314f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorPUBLIC void
23155d05007b7a7883159154e3f65f338a2542d53913Sebastian RedlXMesaResizeBuffers( XMesaBuffer b )
2316f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
2317f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   GET_CURRENT_CONTEXT(ctx);
2318f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   XMesaContext xmctx = XMESA_CONTEXT(ctx);
23195d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   if (!xmctx)
2320f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return;
2321f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   xmesa_check_and_update_buffer_size(xmctx, b);
2322f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor}
2323a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor
2324a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor
2325f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorstatic GLint
2326f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorxbuffer_to_renderbuffer(int buffer)
2327f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
2328f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   assert(MAX_AUX_BUFFERS <= 4);
2329059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl
2330f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   switch (buffer) {
2331f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   case GLX_FRONT_LEFT_EXT:
2332059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl      return BUFFER_FRONT_LEFT;
2333059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   case GLX_FRONT_RIGHT_EXT:
2334a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      return BUFFER_FRONT_RIGHT;
2335f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   case GLX_BACK_LEFT_EXT:
2336f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return BUFFER_BACK_LEFT;
2337059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   case GLX_BACK_RIGHT_EXT:
23385d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      return BUFFER_BACK_RIGHT;
2339059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   case GLX_AUX0_EXT:
2340e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      return BUFFER_AUX0;
2341059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   case GLX_AUX1_EXT:
2342f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   case GLX_AUX2_EXT:
23433397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   case GLX_AUX3_EXT:
23445d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   case GLX_AUX4_EXT:
23451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   case GLX_AUX5_EXT:
2346059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   case GLX_AUX6_EXT:
2347059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   case GLX_AUX7_EXT:
2348e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   case GLX_AUX8_EXT:
23498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   case GLX_AUX9_EXT:
23505d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   default:
23515d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      /* BadValue error */
23525d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      return -1;
2353059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   }
23543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
23555d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl
23565d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl
23575d05007b7a7883159154e3f65f338a2542d53913Sebastian RedlPUBLIC void
23585d05007b7a7883159154e3f65f338a2542d53913Sebastian RedlXMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer,
23595d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl                  const int *attrib_list)
23605d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl{
23615d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#if 0
23625d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   GET_CURRENT_CONTEXT(ctx);
23633397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   const GLuint unit = ctx->Texture.CurrentUnit;
2364e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
2365e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   struct gl_texture_object *texObj;
2366e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#endif
2367e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   struct gl_renderbuffer *rb;
2368e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   struct xmesa_renderbuffer *xrb;
2369e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   GLint b;
2370919814def90acecd25a35445862f0c0ff72a9b05Douglas Gregor   XMesaImage *img = NULL;
2371e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   GLboolean freeImg = GL_FALSE;
2372e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
2373e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   b = xbuffer_to_renderbuffer(buffer);
2374e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   if (b < 0)
2375919814def90acecd25a35445862f0c0ff72a9b05Douglas Gregor      return;
2376e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
2377e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_NONE_EXT)
2378e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      return; /* BadMatch error */
2379e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
2380fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl   rb = drawable->mesa_buffer.Attachment[b].Renderbuffer;
2381fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl   if (!rb) {
2382fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl      /* invalid buffer */
2383e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      return;
23845d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   }
2385f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   xrb = xmesa_renderbuffer(rb);
2386f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
2387f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#if 0
2388f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith   switch (drawable->TextureTarget) {
2389f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   case GLX_TEXTURE_1D_EXT:
2390f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      texObj = texUnit->CurrentTex[TEXTURE_1D_INDEX];
23913397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      break;
2392f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   case GLX_TEXTURE_2D_EXT:
2393f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      texObj = texUnit->CurrentTex[TEXTURE_2D_INDEX];
2394a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor      break;
2395f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   case GLX_TEXTURE_RECTANGLE_EXT:
2396f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      texObj = texUnit->CurrentTex[TEXTURE_RECT_INDEX];
2397f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      break;
2398f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   default:
2399f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return; /* BadMatch error */
24008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   }
2401f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#endif
240283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
2403f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   /*
2404f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor    * The following is a quick and simple way to implement
2405f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor    * BindTexImage.  The better way is to write some new FetchTexel()
240683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor    * functions which would extract texels from XImages.  We'd still
2407f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor    * need to use GetImage when texturing from a Pixmap (front buffer)
24088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    * but texturing from a back buffer (XImage) would avoid an image
2409f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor    * copy.
2410e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl    */
2411ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar
241283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   /* get XImage */
241383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   if (xrb->pixmap) {
241483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      img = XMesaGetImage(dpy, xrb->pixmap, 0, 0, rb->Width, rb->Height, ~0L,
24158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl			  ZPixmap);
24167c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor      freeImg = GL_TRUE;
2417b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor   }
241883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   else if (xrb->ximage) {
241983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      img = xrb->ximage;
242083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   }
242183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
242283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   /* store the XImage as a new texture image */
24238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (img) {
242483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      GLenum format, type, intFormat;
2425b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor      if (img->bits_per_pixel == 32) {
242683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         format = GL_BGRA;
24276e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer         type = GL_UNSIGNED_BYTE;
2428f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         intFormat = GL_RGBA;
2429f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      }
2430f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      else if (img->bits_per_pixel == 24) {
24313397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         format = GL_BGR;
2432a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl         type = GL_UNSIGNED_BYTE;
2433320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian         intFormat = GL_RGB;
2434320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      }
2435320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      else if (img->bits_per_pixel == 16) {
2436725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl         format = GL_BGR;
2437320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian         type = GL_UNSIGNED_SHORT_5_6_5;
2438725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl         intFormat = GL_RGB;
24393397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      }
2440a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl      else {
2441a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl         _mesa_problem(NULL, "Unexpected XImage format in XMesaBindTexImage");
2442320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian         return;
2443320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      }
2444320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGBA_EXT) {
2445320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian         intFormat = GL_RGBA;
2446320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      }
2447320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      else if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGB_EXT) {
2448320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian         intFormat = GL_RGB;
2449320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      }
24508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2451320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      _mesa_TexImage2D(GL_TEXTURE_2D, 0, intFormat, rb->Width, rb->Height, 0,
2452320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian                       format, type, img->data);
24534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
24544fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      if (freeImg) {
24554fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor	 XMesaDestroyImage(img);
24564fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
2457f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
24583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
2459a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
246037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor
2461eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
24627143aab97c6e849a5a5005b7853b8c7d5af008edDouglas GregorPUBLIC void
24637143aab97c6e849a5a5005b7853b8c7d5af008edDouglas GregorXMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer)
2464a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor{
2465a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   const GLint b = xbuffer_to_renderbuffer(buffer);
2466a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   if (b < 0)
24677143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor      return;
24687143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor
24697143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor   /* no-op for now */
24707143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor}
2471eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
24727143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor