xm_api.c revision 2c1937480a68b066a1a0b8ee3770e675bfad859b
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
210b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall */
246ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl
257c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner/**
266a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * \file xm_api.c
277c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *
2883d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff * All the XMesa* API functions.
2914f79002e58556798e86168c63e48d533287eda5Douglas Gregor *
303251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor *
3114f79002e58556798e86168c63e48d533287eda5Douglas Gregor * NOTES:
32bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor *
332bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * The window coordinate system origin (0,0) is in the lower-left corner
34ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor * of the window.  X11's window coordinate origin is in the upper-left
3517fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor * corner of the window.  Therefore, most drawing functions in this
3617fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor * file have to flip Y coordinates.
372596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar *
382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
3914f79002e58556798e86168c63e48d533287eda5Douglas Gregor * in support for the MIT Shared Memory extension.  If enabled, when you
40b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor * use an Ximage for the back buffer in double buffered mode, the "swap"
413c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner * operation will be faster.  You must also link with -lXext.
422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *
438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Byte swapping:  If the Mesa host and the X display use a different
442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * byte order then there's some trickiness to be aware of when using
45ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * XImages.  The byte ordering used for the XImage is that of the X
46ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * display, not the Mesa host.
47ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * The color-to-pixel encoding for True/DirectColor must be done
48ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * according to the display's visual red_mask, green_mask, and blue_mask.
49ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
50ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * do byte swapping if needed.  If one wants to directly "poke" the pixel
51ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * into the XImage's buffer then the pixel must be byte swapped first.  In
52ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
53ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * and use XPutPixel everywhere except in the implementation of
542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * instead of using XPutPixel we "poke" our values after byte-swapping
562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * the clear pixel value if needed.
5712b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner *
582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
60a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#ifdef __CYGWIN__
61a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#undef WIN32
622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#undef __WIN32__
632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "glxheader.h"
662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "xmesaP.h"
673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#include "main/context.h"
688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "main/extensions.h"
692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/framebuffer.h"
702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/imports.h"
712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/macros.h"
722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/renderbuffer.h"
732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/teximage.h"
742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "glapi/glthread.h"
752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast/swrast.h"
762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast_setup/swrast_setup.h"
772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "vbo/vbo.h"
782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/tnl.h"
792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/t_context.h"
803397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#include "tnl/t_pipeline.h"
812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "drivers/common/driverfuncs.h"
822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "drivers/common/meta.h"
832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
843397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/**
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Global X driver lock
868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor_glthread_Mutex _xmesa_lock;
882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
893397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**
922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Lookup tables for HPCR pixel format:
932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */
943397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlstatic short hpcr_rgbTbl[3][256] = {
951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{
968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 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,
993397c5570369f19b2d6c52e898f708d75ceede1fSebastian 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,
1018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 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,
1043397c5570369f19b2d6c52e898f708d75ceede1fSebastian 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,
1068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1093397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
1128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl},
1132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
1142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
1153397c5570369f19b2d6c52e898f708d75ceede1fSebastian 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,
1180953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1213397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 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,
1232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1273397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl192, 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,
1298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor},
1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
1323397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 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,
1347e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
1357e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
136c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
1378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
1382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 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,
1403397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor112, 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,
143788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl160, 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,
1462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
1482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl};
1502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1523397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/
154264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola/*****                     X Utility Functions                    *****/
155264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola/**********************************************************************/
156425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola
157ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor
158264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola/**
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}
1682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
1692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
1722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Check if the X Shared Memory extension is available.
173465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl * Return:  0 = not available
174465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl *          1 = shared XImage support available
175465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl *          2 = shared Pixmap support available also
176465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl */
177465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redlstatic int check_for_xshm( XMesaDisplay *display )
1788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{
1792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#if defined(USE_XSHM) && !defined(XFree86Server)
1802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   int major, minor, ignore;
1813397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   Bool pixmaps;
182ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
1838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
184ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
185ed97649e9574b9d854fa4d6109c9333ae0993554John McCall	 return (pixmaps==True) ? 2 : 1;
1863397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      }
1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      else {
1889763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis	 return 0;
1899763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis      }
1908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   }
1912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   else {
1922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return 0;
1933397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   }
194c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor#else
1958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   /* No  XSHM support */
1962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   return 0;
1972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
1983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
1992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
2022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Apply gamma correction to an intensity value in [0..max].  Return the
2033397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * new intensity value.
204395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson */
2058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic GLint
206395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlssongamma_adjust( GLfloat gamma, GLint value, GLint max )
207395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson{
2083397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (gamma == 1.0) {
209be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis      return value;
2102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   else {
2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      double x = (double) value / (double) max;
2132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma));
2142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
2153397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
2162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**
2203397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Return the true number of bits per pixel for XImages.
2212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * For example, if we request a 24-bit deep visual we may actually need/get
2228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * 32bpp XImages.  This function returns the appropriate bpp.
2232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Input:  dpy - the X display
2242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *         visinfo - desribes the visual to be used for XImages
2251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Return:  true number of bits per pixel for XImages
2263397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */
22749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallstatic int
22849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallbits_per_pixel( XMesaVisual xmv )
22949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall{
2308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#ifdef XFree86Server
23149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall   const int depth = xmv->nplanes;
23249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall   int i;
23349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall   assert(depth > 0);
2343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
2352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      if (screenInfo.formats[i].depth == depth)
236be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis         return screenInfo.formats[i].bitsPerPixel;
23790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   }
23890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   return depth;  /* should never get here, but this should be safe */
23990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#else
24090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   XMesaDisplay *dpy = xmv->display;
24190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   XMesaVisualInfo visinfo = xmv->visinfo;
2429763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   XMesaImage *img;
2439763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   int bitsPerPixel;
2449763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis   /* Create a temporary XImage */
2458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
24690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis		       ZPixmap, 0,           /*format, offset*/
24790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis		       (char*) MALLOC(8),    /*data*/
24890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis		       1, 1,                 /*width, height*/
2493397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl		       32,                   /*bitmap_pad*/
250ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis		       0                     /*bytes_per_line*/
251ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis                     );
252ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis   assert(img);
2538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   /* grab the bits/pixel value */
25490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   bitsPerPixel = img->bits_per_pixel;
25590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   /* free the XImage */
25690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   _mesa_free( img->data );
2573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   img->data = NULL;
25890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   XMesaDestroyImage( img );
25990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   return bitsPerPixel;
26090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif
26190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
26290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
26390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
2643397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
26590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis/*
26690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * Determine if a given X window ID is valid (window exists).
26790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * Do this by calling XGetWindowAttributes() for the window and
26890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * checking if we catch an X error.
2698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Input:  dpy - the display
27090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis *         win - the window to check for existance
27190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * Return:  GL_TRUE - window exists
27290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis *          GL_FALSE - window doesn't exist
2733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */
2748dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis#ifndef XFree86Server
2758dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisstatic GLboolean WindowExistsFlag;
2768dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
277f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidisstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
278f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis{
279f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis   (void) dpy;
2808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (xerr->error_code == BadWindow) {
28190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis      WindowExistsFlag = GL_FALSE;
28290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   }
28390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis   return 0;
2843397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
2863acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidisstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
2873acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis{
2883acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   XWindowAttributes wa;
2893acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
2903acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   WindowExistsFlag = GL_TRUE;
2913acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   old_handler = XSetErrorHandler(window_exists_err_handler);
2923acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
2938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   XSetErrorHandler(old_handler);
2942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   return WindowExistsFlag;
2952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
2963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
297465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnarastatic Status
2983acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidisget_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height )
2993acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis{
3008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   Window root;
3012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   Status stat;
3022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   int xpos, ypos;
3033397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   unsigned int w, h, bw, depth;
3043cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth);
30531f17ecbef57b5679c017c375db330546b7b5145John McCall   *width = w;
3068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   *height = h;
3073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall   return stat;
3083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
3093397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif
310deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor
3118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
312c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/**
313c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall * Return the size of the window (or pixmap) that corresponds to the
3143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * given XMesaBuffer.
315c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall * \param width  returns width in pixels
3162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * \param height  returns height in pixels
317c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall */
318446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroffvoid
319446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroffxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b,
3208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                      GLuint *width, GLuint *height)
3212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
3222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#ifdef XFree86Server
323d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff   *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH);
3243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT);
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#else
3268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   Status stat;
3272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
3282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   _glthread_LOCK_MUTEX(_xmesa_lock);
329a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   XSync(b->xm_visual->display, 0); /* added for Chromium */
330a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height);
331a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   _glthread_UNLOCK_MUTEX(_xmesa_lock);
332a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
333a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   if (!stat) {
334a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      /* probably querying a window that's recently been destroyed */
335a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      _mesa_warning(NULL, "XGetGeometry failed!\n");
336a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      *width = *height = 1;
337a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   }
338a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#endif
33951bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
340a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
34151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
342a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
343a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall/**********************************************************************/
34451bd803fbdade51d674598ed45da3d54190a656cJohn McCall/*****                Linked list of XMesaBuffers                 *****/
34551bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**********************************************************************/
346a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
347a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallXMesaBuffer XMesaBufferList = NULL;
348a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
349a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
35051bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**
35151bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Allocate a new XMesaBuffer object which corresponds to the given drawable.
35251bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Note that XMesaBuffer is derived from GLframebuffer.
35351bd803fbdade51d674598ed45da3d54190a656cJohn McCall * The new XMesaBuffer will not have any size (Width=Height=0).
354ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor *
355ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \param d  the corresponding X drawable (window or pixmap)
356ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \param type  either WINDOW, PIXMAP or PBUFFER, describing d
357ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \param vis  the buffer's visual
358ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \param cmap  the window's colormap, if known.
359ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \return new XMesaBuffer or NULL if any problem
360ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor */
36151bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic XMesaBuffer
36251bd803fbdade51d674598ed45da3d54190a656cJohn McCallcreate_xmesa_buffer(XMesaDrawable d, BufferType type,
36351bd803fbdade51d674598ed45da3d54190a656cJohn McCall                    XMesaVisual vis, XMesaColormap cmap)
36451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
36551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   XMesaBuffer b;
36651bd803fbdade51d674598ed45da3d54190a656cJohn McCall
36751bd803fbdade51d674598ed45da3d54190a656cJohn McCall   ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER);
36851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
36951bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
37051bd803fbdade51d674598ed45da3d54190a656cJohn McCall   if (!b)
37151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      return NULL;
37251bd803fbdade51d674598ed45da3d54190a656cJohn McCall
37351bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->display = vis->display;
37451bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->xm_visual = vis;
37551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->type = type;
37651bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->cmap = cmap;
37751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
37851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   _mesa_initialize_framebuffer(&b->mesa_buffer, &vis->mesa_visual);
37951bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->mesa_buffer.Delete = xmesa_delete_framebuffer;
38051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
38151bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /*
38251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    * Front renderbuffer
38351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    */
38451bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE);
38551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   if (!b->frontxrb) {
38651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      _mesa_free(b);
38751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      return NULL;
38851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
38951bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->frontxrb->Parent = b;
39051bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->frontxrb->drawable = d;
39151bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->frontxrb->pixmap = (XMesaPixmap) d;
39251bd803fbdade51d674598ed45da3d54190a656cJohn McCall   _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT,
39351bd803fbdade51d674598ed45da3d54190a656cJohn McCall                          &b->frontxrb->Base);
39451bd803fbdade51d674598ed45da3d54190a656cJohn McCall
39551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /*
39651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    * Back renderbuffer
39751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    */
39851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   if (vis->mesa_visual.doubleBufferMode) {
39951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE);
40051bd803fbdade51d674598ed45da3d54190a656cJohn McCall      if (!b->backxrb) {
40151bd803fbdade51d674598ed45da3d54190a656cJohn McCall         /* XXX free front xrb too */
40251bd803fbdade51d674598ed45da3d54190a656cJohn McCall         _mesa_free(b);
40351bd803fbdade51d674598ed45da3d54190a656cJohn McCall         return NULL;
40451bd803fbdade51d674598ed45da3d54190a656cJohn McCall      }
40551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      b->backxrb->Parent = b;
40651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      /* determine back buffer implementation */
40751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP;
40851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
40951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT,
41051bd803fbdade51d674598ed45da3d54190a656cJohn McCall                             &b->backxrb->Base);
41151bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
41251bd803fbdade51d674598ed45da3d54190a656cJohn McCall
41351bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /*
41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    * Software alpha planes
41551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    */
41651bd803fbdade51d674598ed45da3d54190a656cJohn McCall   if (vis->mesa_visual.alphaBits > 0
41751bd803fbdade51d674598ed45da3d54190a656cJohn McCall       && vis->undithered_pf != PF_8A8B8G8R
41851bd803fbdade51d674598ed45da3d54190a656cJohn McCall       && vis->undithered_pf != PF_8A8R8G8B) {
41951bd803fbdade51d674598ed45da3d54190a656cJohn McCall      /* Visual has alpha, but pixel format doesn't support it.
42051bd803fbdade51d674598ed45da3d54190a656cJohn McCall       * We'll use an alpha renderbuffer wrapper.
42151bd803fbdade51d674598ed45da3d54190a656cJohn McCall       */
422ed97649e9574b9d854fa4d6109c9333ae0993554John McCall      b->swAlpha = GL_TRUE;
423ed97649e9574b9d854fa4d6109c9333ae0993554John McCall   }
424ed97649e9574b9d854fa4d6109c9333ae0993554John McCall   else {
42551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      b->swAlpha = GL_FALSE;
42651bd803fbdade51d674598ed45da3d54190a656cJohn McCall   }
42751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
42851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /*
429cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    * Other renderbuffer (depth, stencil, etc)
430cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    */
431cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall   _mesa_add_soft_renderbuffers(&b->mesa_buffer,
43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                GL_FALSE,  /* color */
43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                vis->mesa_visual.haveDepthBuffer,
434cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                                vis->mesa_visual.haveStencilBuffer,
435cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                                vis->mesa_visual.haveAccumBuffer,
436cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                                b->swAlpha,
437cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                                vis->mesa_visual.numAuxBuffers > 0 );
43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall   /* GLX_EXT_texture_from_pixmap */
44051bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->TextureTarget = 0;
441a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT;
44251bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->TextureMipmap = 0;
44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
444a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   /* insert buffer into linked list */
44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall   b->Next = XMesaBufferList;
44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall   XMesaBufferList = b;
447a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall   return b;
44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
450a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
45149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
45249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/**
45349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * Find an XMesaBuffer by matching X display and colormap but NOT matching
45449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * the notThis buffer.
45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */
45651bd803fbdade51d674598ed45da3d54190a656cJohn McCallXMesaBuffer
457833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis)
458833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall{
459833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall   XMesaBuffer b;
460833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall   for (b=XMesaBufferList; b; b=b->Next) {
46144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
46244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis         return b;
463a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      }
464465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara   }
465e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara   return NULL;
466e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara}
467a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
4683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
4693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/**
4703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall * Remove buffer from linked list, delete if no longer referenced.
4714714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor */
472e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnarastatic void
473e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnaraxmesa_free_buffer(XMesaBuffer buffer)
47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{
475a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall   XMesaBuffer prev = NULL, b;
47633500955d731c73717af52088b7fc0e7a85681e7John McCall
47733500955d731c73717af52088b7fc0e7a85681e7John McCall   for (b = XMesaBufferList; b; b = b->Next) {
47833500955d731c73717af52088b7fc0e7a85681e7John McCall      if (b == buffer) {
47933500955d731c73717af52088b7fc0e7a85681e7John McCall         struct gl_framebuffer *fb = &buffer->mesa_buffer;
48033500955d731c73717af52088b7fc0e7a85681e7John McCall
48133500955d731c73717af52088b7fc0e7a85681e7John McCall         /* unlink buffer from list */
48233500955d731c73717af52088b7fc0e7a85681e7John McCall         if (prev)
48333500955d731c73717af52088b7fc0e7a85681e7John McCall            prev->Next = buffer->Next;
48444f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis         else
48544f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis            XMesaBufferList = buffer->Next;
48633500955d731c73717af52088b7fc0e7a85681e7John McCall
48751bd803fbdade51d674598ed45da3d54190a656cJohn McCall         /* mark as delete pending */
48851bd803fbdade51d674598ed45da3d54190a656cJohn McCall         fb->DeletePending = GL_TRUE;
489c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
490c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall         /* Since the X window for the XMesaBuffer is going away, we don't
491c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall          * want to dereference this pointer in the future.
49254e14c4db764c0636160d26c5bbf491637c83a76John McCall          */
49354e14c4db764c0636160d26c5bbf491637c83a76John McCall         b->frontxrb->drawable = 0;
49454e14c4db764c0636160d26c5bbf491637c83a76John McCall
49554e14c4db764c0636160d26c5bbf491637c83a76John McCall         /* Unreference.  If count = zero we'll really delete the buffer */
496a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall         _mesa_reference_framebuffer(&fb, NULL);
49751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall         return;
499a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      }
500a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      /* continue search */
5014dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner      prev = b;
502a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   }
5032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   /* buffer not found in XMesaBufferList */
5042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n");
505b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
506b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
507a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
508b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/**
509b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Copy X color table stuff from one XMesaBuffer to another.
510b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */
511b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic void
512b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnercopy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
513b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{
514b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
515b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
516b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
517b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
518b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   dst->num_alloced = src->num_alloced;
519b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   MEMCPY(dst->alloced_colors, src->alloced_colors,
520b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner          sizeof(src->alloced_colors));
521b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
522a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
523b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
524b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
525b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/**********************************************************************/
526b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/*****                   Misc Private Functions                   *****/
527b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/**********************************************************************/
5280558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5290558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5300558df2da807646e65d4fa290f4e92114af1a746Chris Lattner/**
531a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * A replacement for XAllocColor.  This function should never
5328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * fail to allocate a color.  When XAllocColor fails, we return
5330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * the nearest matching color.  If we have to allocate many colors
5340558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * this function isn't too efficient; the XQueryColors() could be
5350558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * done just once.
5360558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Written by Michael Pichler, Brian Paul, Mark Kilgard
5370558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Input:  dpy - X display
5380558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *         cmap - X colormap
5390558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *         cmapSize - size of colormap
5400558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * In/Out: color - the XColor struct
5410558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Output:  exact - 1=exact color match, 0=closest match
5420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *          alloced - 1=XAlloc worked, 0=XAlloc failed
5430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner */
5440558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic void
5450558df2da807646e65d4fa290f4e92114af1a746Chris LattnernoFaultXAllocColor( int client,
5460558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                    XMesaDisplay *dpy,
5470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                    XMesaColormap cmap,
5480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                    int cmapSize,
5490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                    XMesaColor *color,
5500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                    int *exact, int *alloced )
5510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner{
5520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server
5530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   Pixel *ppixIn;
5540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   xrgb *ctable;
5550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else
5560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   /* we'll try to cache ctable for better remote display performance */
5570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   static Display *prevDisplay = NULL;
5580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   static XMesaColormap prevCmap = 0;
5590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   static int prevCmapSize = 0;
5600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   static XMesaColor *ctable = NULL;
5610558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif
5620558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   XMesaColor subColor;
5630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   int i, bestmatch;
5640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   double mindist;       /* 3*2^16^2 exceeds long int precision. */
5650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   (void) client;
5670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   /* First try just using XAllocColor. */
5690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server
5700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   if (AllocColor(cmap,
5710558df2da807646e65d4fa290f4e92114af1a746Chris Lattner		  &color->red, &color->green, &color->blue,
5720558df2da807646e65d4fa290f4e92114af1a746Chris Lattner		  &color->pixel,
5730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner		  client) == Success)
5740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else
5750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   if (XAllocColor(dpy, cmap, color))
5760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif
5770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   {
5780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      *exact = 1;
5790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      *alloced = 1;
5800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      return;
5810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
5820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5830558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   /* Alloc failed, search for closest match */
5840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   /* Retrieve color table entries. */
5860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   /* XXX alloca candidate. */
5870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server
5880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
5890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
5900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   for (i = 0; i < cmapSize; i++) {
5910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      ppixIn[i] = i;
5920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   }
5930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   QueryColors(cmap, cmapSize, ppixIn, ctable);
5940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else
5950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner   if (prevDisplay != dpy || prevCmap != cmap
5960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner       || prevCmapSize != cmapSize || !ctable) {
5970558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      /* free previously cached color table */
5980558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      if (ctable)
599eb7f96141f754150a92433286fa385910a22f494Sam Weinig         _mesa_free(ctable);
600eb7f96141f754150a92433286fa385910a22f494Sam Weinig      /* Get the color table from X */
601eb7f96141f754150a92433286fa385910a22f494Sam Weinig      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
602eb7f96141f754150a92433286fa385910a22f494Sam Weinig      assert(ctable);
603eb7f96141f754150a92433286fa385910a22f494Sam Weinig      for (i = 0; i < cmapSize; i++) {
604eb7f96141f754150a92433286fa385910a22f494Sam Weinig         ctable[i].pixel = i;
605eb7f96141f754150a92433286fa385910a22f494Sam Weinig      }
606eb7f96141f754150a92433286fa385910a22f494Sam Weinig      XQueryColors(dpy, cmap, ctable, cmapSize);
607eb7f96141f754150a92433286fa385910a22f494Sam Weinig      prevDisplay = dpy;
6080558df2da807646e65d4fa290f4e92114af1a746Chris Lattner      prevCmap = cmap;
609b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      prevCmapSize = cmapSize;
6101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   }
611a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#endif
612b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
613b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   /* Find best match. */
6141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   bestmatch = -1;
6158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   mindist = 0.0;
6168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   for (i = 0; i < cmapSize; i++) {
6171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
6183397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
619f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
62051e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu      double dist = dr * dr + dg * dg + db * db;
621b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      if (bestmatch < 0 || dist < mindist) {
622b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         bestmatch = i;
623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner         mindist = dist;
624ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor      }
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;
63149b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis   /* 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
6367f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   if (AllocColor(cmap,
6377f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor		  &subColor.red, &subColor.green, &subColor.blue,
6384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor		  &subColor.pixel,
639b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor		  client) == Success) {
6405b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek#else
6416a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   if (XAllocColor(dpy, cmap, &subColor)) {
642a93e3b5bde9f0a7b59215f19f176f7d69881b81cSebastian Redl#endif
643320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      *alloced = 1;
6446a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   }
645b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   else {
6462f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner      /* do this to work around a problem reported by Frank Ortega */
647b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      subColor.pixel = (unsigned long) bestmatch;
648b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      subColor.red   = ctable[bestmatch].red;
649b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      subColor.green = ctable[bestmatch].green;
650b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      subColor.blue  = ctable[bestmatch].blue;
651b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      subColor.flags = DoRed | DoGreen | DoBlue;
6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      *alloced = 0;
653b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
6542f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner#ifdef XFree86Server
655b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   _mesa_free(ppixIn);
656b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   _mesa_free(ctable);
657b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#else
6586a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   /* don't free table, save it for next time */
6596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#endif
6606a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
66161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor   *color = subColor;
66261d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor   *exact = 0;
663b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
664b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
665b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
666b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
667b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/**
668b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Do setup for PF_GRAYSCALE pixel format.
669b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Note that buffer may be NULL.
670b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */
671b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic GLboolean
672b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnersetup_grayscale(int client, XMesaVisual v,
673b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                XMesaBuffer buffer, XMesaColormap cmap)
674b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{
675b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
676b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      return GL_FALSE;
677b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   }
678b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
679b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner   if (buffer) {
680b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      XMesaBuffer prevBuffer;
681b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
682b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner      if (!cmap) {
683a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCall         return GL_FALSE;
684d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff      }
6850ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
6860ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
6870ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      if (prevBuffer &&
6880ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner          (buffer->xm_visual->mesa_visual.rgbMode ==
6890ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
6900ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner         /* Copy colormap stuff from previous XMesaBuffer which uses same
6910ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
6920ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner          */
6930ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner         copy_colortable_info(buffer, prevBuffer);
6940ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      }
6950ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner      else {
6960ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner         /* Allocate 256 shades of gray */
6970ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner         int gray;
6980ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner         int colorsfailed = 0;
6990ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner         for (gray=0;gray<256;gray++) {
7000ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
7010ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
7020ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
7030ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner            int exact, alloced;
7040ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner            XMesaColor xcol;
705b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            xcol.red   = (r << 8) | r;
706b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            xcol.green = (g << 8) | g;
7070ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner            xcol.blue  = (b << 8) | b;
708b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            noFaultXAllocColor( client, v->display,
7090ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner                                cmap, GET_COLORMAP_SIZE(v),
7100ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner                                &xcol, &exact, &alloced );
7110ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner            if (!exact) {
7120ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner               colorsfailed++;
71361d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor            }
7140558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            if (alloced) {
715b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner               assert(buffer->num_alloced<256);
716b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
717b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner               buffer->num_alloced++;
718b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            }
719b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
720e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            /*OLD
721e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            assert(gray < 576);
7221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            buffer->color_table[gray*3+0] = xcol.pixel;
723e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            buffer->color_table[gray*3+1] = xcol.pixel;
724e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            buffer->color_table[gray*3+2] = xcol.pixel;
725e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            assert(xcol.pixel < 65536);
726e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
727e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
728e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
729e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            */
7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            buffer->color_table[gray] = xcol.pixel;
731e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            assert(xcol.pixel < 65536);
732e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            buffer->pixel_to_r[xcol.pixel] = gray;
7331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            buffer->pixel_to_g[xcol.pixel] = gray;
734e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            buffer->pixel_to_b[xcol.pixel] = gray;
735e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         }
7361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
737e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
738e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            _mesa_warning(NULL,
739e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                  "Note: %d out of 256 needed colors do not match exactly.\n",
740e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                  colorsfailed );
741e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         }
7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
743e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   }
744e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
745e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   v->dithered_pf = PF_Grayscale;
7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   v->undithered_pf = PF_Grayscale;
747e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   return GL_TRUE;
748e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor}
749e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
750e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
751e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/**
753e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor * Setup RGB rendering for a window with a PseudoColor, StaticColor,
754e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
755b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
7563397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * color.  While this function was originally designed just for 8-bit
757a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
7582bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * Dithering code contributed by Bob Mercier.
759b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor */
760e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregorstatic GLboolean
761e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregorsetup_dithered_color(int client, XMesaVisual v,
762e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                     XMesaBuffer buffer, XMesaColormap cmap)
76377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl{
7648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
7653397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      return GL_FALSE;
7663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   }
767e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
768e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   if (buffer) {
769e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      XMesaBuffer prevBuffer;
77077f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl
77177f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl      if (!cmap) {
772e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         return GL_FALSE;
7731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
774e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
7758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
7768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (prevBuffer &&
7778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl          (buffer->xm_visual->mesa_visual.rgbMode ==
778e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
779e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         /* Copy colormap stuff from previous, matching XMesaBuffer.
780e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor          * Do this to avoid time spent in noFaultXAllocColor.
78177f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl          */
78277f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl         copy_colortable_info(buffer, prevBuffer);
78377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl      }
7841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      else {
785b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         /* Allocate X colors and initialize color_table[], red_table[], etc */
786b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         int r, g, b, i;
787b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         int colorsfailed = 0;
788b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor         for (r = 0; r < DITH_R; r++) {
7898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            for (g = 0; g < DITH_G; g++) {
790b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor               for (b = 0; b < DITH_B; b++) {
791b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                  XMesaColor xcol;
792b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                  int exact, alloced;
793b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(DITH_R-1),65535);
7941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535);
79511a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(DITH_B-1),65535);
796b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                  noFaultXAllocColor( client, v->display,
797aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam                                      cmap, GET_COLORMAP_SIZE(v),
7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                      &xcol, &exact, &alloced );
799e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                  if (!exact) {
800b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                     colorsfailed++;
8018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                  }
802ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar                  if (alloced) {
803b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                     assert(buffer->num_alloced<256);
80411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
805f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek                     buffer->num_alloced++;
806f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek                  }
8078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                  i = DITH_MIX( r, g, b );
808f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek                  assert(i < 576);
809f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek                  buffer->color_table[i] = xcol.pixel;
810445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor                  assert(xcol.pixel < 65536);
8118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1);
812f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1);
813f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1);
8142bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor               }
8152bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor            }
8162bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor         }
817a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
8180a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
8190a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor            _mesa_warning(NULL,
8200a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                  "Note: %d out of %d needed colors do not match exactly.\n",
8210a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                  colorsfailed, DITH_R * DITH_G * DITH_B );
8220a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor         }
8230a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      }
824eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth   }
8250a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8260a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   v->dithered_pf = PF_Dither;
8270a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   v->undithered_pf = PF_Lookup;
8280a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   return GL_TRUE;
8290a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor}
8300a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8310a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8320a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor/**
8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
8340a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
8350a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * Special dithering tables have to be initialized.
83611a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam */
837412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanianstatic void
83811a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnamsetup_8bit_hpcr(XMesaVisual v)
839412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian{
8404c9d8d0eca5ca635d9a30222f690db9140e98325Fariborz Jahanian   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
8420a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    * on the root window AND the colormap obtainable by XGetRGBColormaps
8430a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    * for that atom must be set on the window.  (see also tkInitWindow)
8440a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    * If that colormap is not set, the output will look stripy.
845b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman    */
8460a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
84773482884560be041d86eccbd7dd5a6918677393bDaniel Dunbar   /* Setup color tables with gamma correction */
8480a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   int i;
8490a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   double g;
8500a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   g = 1.0 / v->RedGamma;
8520a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   for (i=0; i<256; i++) {
853ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner      GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g ));
854ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
855972d954bd216c86a961bb7f81c53af85de17c2f0Douglas Gregor   }
8560a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8570a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   g = 1.0 / v->GreenGamma;
8580a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   for (i=0; i<256; i++) {
8590a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g ));
8600a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
8610a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   }
862a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner
863a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner   g = 1.0 / v->BlueGamma;
8640a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   for (i=0; i<256; i++) {
8650a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g ));
8661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
8670a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   }
8680a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
8690a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   v->dithered_pf = PF_HPCR;
8700a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8710a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   /* which method should I use to clear */
8720a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   /* GL_FALSE: keep the ordinary method  */
8730a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   /* GL_TRUE : clear with dither pattern */
8740a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor   v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
875a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson
876a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson   if (v->hpcr_clear_flag) {
87715b91764d08e886391c865c4a444d7b51141c284Eli Friedman      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
87815b91764d08e886391c865c4a444d7b51141c284Eli Friedman                                               DefaultRootWindow(v->display),
879a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson                                               16, 2, 8);
8800a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor#ifndef XFree86Server
8810a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
882ab8e281b32a3d3b9b18257d26844362bf806ecdcDaniel Dunbar                                       0, 0, 16, 2, AllPlanes, ZPixmap);
8830a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor#endif
884b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman   }
8859c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump}
88692f5822df6a0d7571df44b5d279ed4f017fbb0e6Anders Carlsson
887a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor
8888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**
8890a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * Setup RGB rendering for a window with a True/DirectColor visual.
8900a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor */
89114f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic void
8924fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap)
8934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{
8944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   unsigned long rmask, gmask, bmask;
8954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   (void) buffer;
8964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   (void) cmap;
8973397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
8984fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   /* Compute red multiplier (mask) and bit shift */
8994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   v->rshift = 0;
9004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   rmask = GET_REDMASK(v);
9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   while ((rmask & 1)==0) {
9024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      v->rshift++;
9034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      rmask = rmask >> 1;
9044fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   }
9054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9062596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar   /* Compute green multiplier (mask) and bit shift */
9074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   v->gshift = 0;
9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   gmask = GET_GREENMASK(v);
9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   while ((gmask & 1)==0) {
9104fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      v->gshift++;
9114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      gmask = gmask >> 1;
9124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   }
9134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9144fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   /* Compute blue multiplier (mask) and bit shift */
9154fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   v->bshift = 0;
9164fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   bmask = GET_BLUEMASK(v);
9174fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   while ((bmask & 1)==0) {
9184fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      v->bshift++;
9194fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      bmask = bmask >> 1;
9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   }
9214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9224fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   /*
9234fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    * Compute component-to-pixel lookup tables and dithering kernel
9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    */
9254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   {
9264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      static GLubyte kernel[16] = {
9274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor          0*16,  8*16,  2*16, 10*16,
9284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         12*16,  4*16, 14*16,  6*16,
9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          3*16, 11*16,  1*16,  9*16,
9304fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         15*16,  7*16, 13*16,  5*16,
9314fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      };
9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      GLint rBits = _mesa_bitcount(rmask);
9334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      GLint gBits = _mesa_bitcount(gmask);
9344fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      GLint bBits = _mesa_bitcount(bmask);
9354fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      GLint maxBits;
9364fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      GLuint i;
9374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
9394fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      for (i=0; i<=rmask; i++)
9404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
9414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      for (i=0; i<=gmask; i++)
9424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
9434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      for (i=0; i<=bmask; i++)
9444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
9454fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      /* convert RGB values from [0,255] to pixel components */
947a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
9484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      for (i=0;i<256;i++) {
9494fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         GLint r = gamma_adjust(v->RedGamma,   i, 255);
9503397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         GLint g = gamma_adjust(v->GreenGamma, i, 255);
9514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
9521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
9534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
954e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
955e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      }
956e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      /* overflow protection */
957e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      for (i=256;i<512;i++) {
9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         v->RtoPixel[i] = v->RtoPixel[255];
9594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         v->GtoPixel[i] = v->GtoPixel[255];
9601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         v->BtoPixel[i] = v->BtoPixel[255];
9614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
9624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9634fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /* setup dithering kernel */
9644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      maxBits = rBits;
9654fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      if (gBits > maxBits)  maxBits = gBits;
9664fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      if (bBits > maxBits)  maxBits = bBits;
9674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      for (i=0;i<16;i++) {
9684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         v->Kernel[i] = kernel[i] >> maxBits;
9694fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      }
9704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      v->undithered_pf = PF_Truecolor;
9728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor;
9734fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   }
9744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   /*
9764fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    * Now check for TrueColor visuals which we can optimize.
9774fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    */
9784fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   if (   GET_REDMASK(v)  ==0x0000ff
9794fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       && GET_GREENMASK(v)==0x00ff00
9808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl       && GET_BLUEMASK(v) ==0xff0000
9814fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       && CHECK_BYTE_ORDER(v)
9824fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor       && v->BitsPerPixel==32
983ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
9844fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      /* common 32 bpp config used on SGI, Sun */
9854fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */
9864fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   }
98714f79002e58556798e86168c63e48d533287eda5Douglas Gregor   else if (GET_REDMASK(v)  == 0xff0000
98814f79002e58556798e86168c63e48d533287eda5Douglas Gregor         && GET_GREENMASK(v)== 0x00ff00
98914f79002e58556798e86168c63e48d533287eda5Douglas Gregor         && GET_BLUEMASK(v) == 0x0000ff
99014f79002e58556798e86168c63e48d533287eda5Douglas Gregor         && CHECK_BYTE_ORDER(v)
99114f79002e58556798e86168c63e48d533287eda5Douglas Gregor         && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){
992c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      if (v->BitsPerPixel==32) {
99314f79002e58556798e86168c63e48d533287eda5Douglas Gregor         /* if 32 bpp, and visual indicates 8 bpp alpha channel */
99414f79002e58556798e86168c63e48d533287eda5Douglas Gregor         if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8)
9958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */
99614f79002e58556798e86168c63e48d533287eda5Douglas Gregor         else
99714f79002e58556798e86168c63e48d533287eda5Douglas Gregor            v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */
99814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      }
99914f79002e58556798e86168c63e48d533287eda5Douglas Gregor      else if (v->BitsPerPixel == 24) {
10002d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor         v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */
10012d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor      }
10022d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor   }
100312fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor   else if (GET_REDMASK(v)  ==0xf800
100412fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor       &&   GET_GREENMASK(v)==0x07e0
100512fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor       &&   GET_BLUEMASK(v) ==0x001f
100612fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor       && CHECK_BYTE_ORDER(v)
100712fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor       && v->BitsPerPixel==16
100814f79002e58556798e86168c63e48d533287eda5Douglas Gregor       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1009c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      /* 5-6-5 RGB */
101014f79002e58556798e86168c63e48d533287eda5Douglas Gregor      v->undithered_pf = PF_5R6G5B;
101114f79002e58556798e86168c63e48d533287eda5Douglas Gregor      v->dithered_pf = PF_Dither_5R6G5B;
101214f79002e58556798e86168c63e48d533287eda5Douglas Gregor   }
101314f79002e58556798e86168c63e48d533287eda5Douglas Gregor   else if (GET_REDMASK(v)  ==0xe0
1014c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor       &&   GET_GREENMASK(v)==0x1c
101514f79002e58556798e86168c63e48d533287eda5Douglas Gregor       &&   GET_BLUEMASK(v) ==0x03
101614f79002e58556798e86168c63e48d533287eda5Douglas Gregor       && CHECK_FOR_HPCR(v)) {
10178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      /* 8-bit HP color recovery */
101814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      setup_8bit_hpcr( v );
101914f79002e58556798e86168c63e48d533287eda5Douglas Gregor   }
102014f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
102114f79002e58556798e86168c63e48d533287eda5Douglas Gregor
102214f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1023c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
102414f79002e58556798e86168c63e48d533287eda5Douglas Gregor/**
102514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * Setup RGB rendering for a window with a monochrome visual.
102614f79002e58556798e86168c63e48d533287eda5Douglas Gregor */
102714f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic void
1028c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregorsetup_monochrome( XMesaVisual v, XMesaBuffer b )
102914f79002e58556798e86168c63e48d533287eda5Douglas Gregor{
103014f79002e58556798e86168c63e48d533287eda5Douglas Gregor   (void) b;
10318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   v->dithered_pf = v->undithered_pf = PF_1Bit;
103214f79002e58556798e86168c63e48d533287eda5Douglas Gregor   /* if black=1 then we must flip pixel values */
1033c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
103414f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
103514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
103614f79002e58556798e86168c63e48d533287eda5Douglas Gregor
103714f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1038c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/**
103914f79002e58556798e86168c63e48d533287eda5Douglas Gregor * When a context is bound for the first time, we can finally finish
104014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * initializing the context's visual and buffer information.
10418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * \param v  the XMesaVisual to initialize
104214f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param b  the XMesaBuffer to initialize (may be NULL)
104314f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param rgb_flag  TRUE = RGBA mode, FALSE = color index mode
104414f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param window  the window/pixmap we're rendering into
104514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param cmap  the colormap associated with the window/pixmap
1046f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor * \return GL_TRUE=success, GL_FALSE=failure
1047c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor */
104814f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic GLboolean
104914f79002e58556798e86168c63e48d533287eda5Douglas Gregorinitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
105014f79002e58556798e86168c63e48d533287eda5Douglas Gregor                             GLboolean rgb_flag, XMesaDrawable window,
105114f79002e58556798e86168c63e48d533287eda5Douglas Gregor                             XMesaColormap cmap)
105214f79002e58556798e86168c63e48d533287eda5Douglas Gregor{
105314f79002e58556798e86168c63e48d533287eda5Douglas Gregor   int client = 0;
105414f79002e58556798e86168c63e48d533287eda5Douglas Gregor
105514f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server
105614f79002e58556798e86168c63e48d533287eda5Douglas Gregor   client = (window) ? CLIENT_ID(window->id) : 0;
105714f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif
1058a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
1059e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor   ASSERT(!b || b->xm_visual == v);
1060e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
10617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   /* Save true bits/pixel */
10627f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   v->BitsPerPixel = bits_per_pixel(v);
1063f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner   assert(v->BitsPerPixel > 0);
10648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
106514f79002e58556798e86168c63e48d533287eda5Douglas Gregor   if (rgb_flag == GL_FALSE) {
106614f79002e58556798e86168c63e48d533287eda5Douglas Gregor      /* COLOR-INDEXED WINDOW:
1067828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner       * Even if the visual is TrueColor or DirectColor we treat it as
1068828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner       * being color indexed.  This is weird but might be useful to someone.
1069828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner       */
1070828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner      v->dithered_pf = v->undithered_pf = PF_Index;
10717f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v);
10727f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   }
10737f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   else {
10747f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      /* RGB WINDOW:
10757f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor       * We support RGB rendering into almost any kind of visual.
10767f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor       */
10777f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      const int xclass = v->mesa_visual.visualType;
10787f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
10797f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor	 setup_truecolor( v, b, cmap );
10807f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      }
1081e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) {
10827f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor	 setup_monochrome( v, b );
10837f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      }
10847f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) {
10857f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         if (!setup_grayscale( client, v, b, cmap )) {
10867f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor            return GL_FALSE;
10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         }
10887f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      }
10897f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR)
10907f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
10917f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor	 if (!setup_dithered_color( client, v, b, cmap )) {
10927f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor            return GL_FALSE;
10931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         }
10947f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      }
10957f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      else {
10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump	 _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n");
10977f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor	 return GL_FALSE;
10987f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      }
10997f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      v->mesa_visual.indexBits = 0;
11007f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
11017f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      if (_mesa_getenv("MESA_NO_DITHER")) {
11027f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor	 v->dithered_pf = v->undithered_pf;
11037f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      }
11047f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   }
11057f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
11068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
11077f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   /*
11087f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor    * If MESA_INFO env var is set print out some debugging info
110914f79002e58556798e86168c63e48d533287eda5Douglas Gregor    * which can help Brian figure out what's going on when a user
111014f79002e58556798e86168c63e48d533287eda5Douglas Gregor    * reports bugs.
1111090d9b53e32bb30d9e74de895bb59b409bd49e00Chris Lattner    */
11127f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   if (_mesa_getenv("MESA_INFO")) {
11130fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl      _mesa_printf("X/Mesa visual = %p\n", (void *) v);
11140fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl      _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
11150fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl      _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
11160fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl      _mesa_printf("X/Mesa level = %d\n", v->mesa_visual.level);
1117bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor      _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
1118bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor      _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
111911a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam   }
11207f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
11217f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   if (b && window) {
11227f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      char *data;
112314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
112414f79002e58556798e86168c63e48d533287eda5Douglas Gregor      /* Do window-specific initializations */
112514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
112614f79002e58556798e86168c63e48d533287eda5Douglas Gregor      /* these should have been set in create_xmesa_buffer */
11278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      ASSERT(b->frontxrb->drawable == window);
112814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window);
11298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
113014f79002e58556798e86168c63e48d533287eda5Douglas Gregor      /* Setup for single/double buffering */
11318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (v->mesa_visual.doubleBufferMode) {
11327f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         /* Double buffered */
113314f79002e58556798e86168c63e48d533287eda5Douglas Gregor         b->shm = check_for_xshm( v->display );
113414f79002e58556798e86168c63e48d533287eda5Douglas Gregor      }
113514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
113614f79002e58556798e86168c63e48d533287eda5Douglas Gregor      /* X11 graphics contexts */
113714f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server
113814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      b->gc = CreateScratchGC(v->display, window->depth);
113914f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else
1140bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor      b->gc = XCreateGC( v->display, window, 0, NULL );
114114f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif
114214f79002e58556798e86168c63e48d533287eda5Douglas Gregor      XMesaSetFunction( v->display, b->gc, GXcopy );
114314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
114414f79002e58556798e86168c63e48d533287eda5Douglas Gregor      /* cleargc - for glClear() */
114514f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server
11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      b->cleargc = CreateScratchGC(v->display, window->depth);
11472d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor#else
11482d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor      b->cleargc = XCreateGC( v->display, window, 0, NULL );
11492d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor#endif
11502d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor      XMesaSetFunction( v->display, b->cleargc, GXcopy );
115112fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor
115212fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor      /*
115312fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
115412fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor       * Patch contributed by Michael Pichler May 15, 1995.
115512fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor       */
115612fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor#ifdef XFree86Server
115712fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor      b->swapgc = CreateScratchGC(v->display, window->depth);
115812fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor      {
115912fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor         CARD32 v[1];
116012fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor         v[0] = FALSE;
1161e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
1162e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      }
1163e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor#else
116411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam      {
1165aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam         XGCValues gcvalues;
11661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         gcvalues.graphics_exposures = False;
1167e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor         b->swapgc = XCreateGC(v->display, window,
1168ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar                               GCGraphicsExposures, &gcvalues);
11697f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      }
11707f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#endif
11717f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      XMesaSetFunction( v->display, b->swapgc, GXcopy );
11727f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      /*
11730fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl       * Set fill style and tile pixmap once for all for HPCR stuff
117414f79002e58556798e86168c63e48d533287eda5Douglas Gregor       * (instead of doing it each time in clear_color_HPCR_pixmap())
117514f79002e58556798e86168c63e48d533287eda5Douglas Gregor       * Initialize whole stuff
117614f79002e58556798e86168c63e48d533287eda5Douglas Gregor       * Patch contributed by Jacques Leroy March 8, 1998.
117714f79002e58556798e86168c63e48d533287eda5Douglas Gregor       */
117814f79002e58556798e86168c63e48d533287eda5Douglas Gregor      if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) {
117914f79002e58556798e86168c63e48d533287eda5Douglas Gregor         int i;
118014f79002e58556798e86168c63e48d533287eda5Douglas Gregor         for (i = 0; i < 16; i++) {
118136c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor            XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
1182e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner            XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
118314f79002e58556798e86168c63e48d533287eda5Douglas Gregor         }
1184ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar         XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap,
1185ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar                       b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
118614f79002e58556798e86168c63e48d533287eda5Douglas Gregor         XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
11878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
1188c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      }
1189ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar
1190ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar      /* Initialize the row buffer XImage for use in write_color_span() */
11917f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      data = (char*) MALLOC(MAX_WIDTH*4);
11927f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#ifdef XFree86Server
11930fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, data);
119414f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else
119514f79002e58556798e86168c63e48d533287eda5Douglas Gregor      b->rowimage = XCreateImage( v->display,
119614f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  v->visinfo->visual,
119714f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  v->visinfo->depth,
119814f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  ZPixmap, 0,           /*format, offset*/
119914f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  data,                 /*data*/
120014f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  MAX_WIDTH, 1,         /*width, height*/
120114f79002e58556798e86168c63e48d533287eda5Douglas Gregor                                  32,                   /*bitmap_pad*/
1202f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor                                  0                     /*bytes_per_line*/ );
1203f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor#endif
1204bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor      if (!b->rowimage)
1205bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor         return GL_FALSE;
1206f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor   }
1207c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
120814f79002e58556798e86168c63e48d533287eda5Douglas Gregor   return GL_TRUE;
120914f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
121014f79002e58556798e86168c63e48d533287eda5Douglas Gregor
12117f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
1212bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor
12137f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor/*
12147f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor * Convert an RGBA color to a pixel value.
12152eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor */
12163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlunsigned long
12177f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregorxmesa_color_to_pixel(GLcontext *ctx,
12187f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                     GLubyte r, GLubyte g, GLubyte b, GLubyte a,
12197f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                     GLuint pixelFormat)
12208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{
12217f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   XMesaContext xmesa = XMESA_CONTEXT(ctx);
12227f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor   switch (pixelFormat) {
12237f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      case PF_Index:
12247f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         return 0;
12251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      case PF_Truecolor:
12267f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         {
12278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            unsigned long p;
12287f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor            PACK_TRUECOLOR( p, r, g, b );
12297f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor            return p;
12307f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor         }
1231ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl      case PF_8A8B8G8R:
1232090d9b53e32bb30d9e74de895bb59b409bd49e00Chris Lattner         return PACK_8A8B8G8R( r, g, b, a );
12337f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      case PF_8A8R8G8B:
12343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         return PACK_8A8R8G8B( r, g, b, a );
12357f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor      case PF_8R8G8B:
12368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         /* fall through */
123714f79002e58556798e86168c63e48d533287eda5Douglas Gregor      case PF_8R8G8B24:
123814f79002e58556798e86168c63e48d533287eda5Douglas Gregor         return PACK_8R8G8B( r, g, b );
12394fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      case PF_5R6G5B:
12404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         return PACK_5R6G5B( r, g, b );
12414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      case PF_Dither:
12424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor         {
12430b1fb988012da21d996c43e36867787a7a07b889Chris Lattner            DITHER_SETUP;
12440b1fb988012da21d996c43e36867787a7a07b889Chris Lattner            return DITHER( 1, 0, r, g, b );
12450b1fb988012da21d996c43e36867787a7a07b889Chris Lattner         }
1246a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      case PF_1Bit:
12477c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         /* 382 = (3*255)/2 */
12487c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1249c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner      case PF_HPCR:
1250c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner         return DITHER_HPCR(1, 1, r, g, b);
1251c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner      case PF_Lookup:
12528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         {
1253c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner            LOOKUP_SETUP;
12542eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor            return LOOKUP( r, g, b );
12552eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor         }
12562eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor      case PF_Grayscale:
12578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         return GRAY_RGB( r, g, b );
12581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      case PF_Dither_True:
12593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         /* fall through */
12602eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor      case PF_Dither_5R6G5B:
12612eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor         {
12622eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor            unsigned long p;
12631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            PACK_TRUEDITHER(p, 1, 0, r, g, b);
12647c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner            return p;
12657c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         }
12666a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor      default:
12677c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner         _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel");
12687c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner   }
126942d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner   return 0;
127042d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner}
12717c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
12727c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
12733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#define NUM_VISUAL_TYPES   6
12747c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
12753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/**
12763c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl * Convert an X visual type to a GLX visual type.
12777c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *
12787c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.)
12797356a31327be9b3c3434a0c88746028980da5684Chris Lattner *        to be converted.
128037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor * \return If \c visualType is a valid X visual type, a GLX visual type will
12817c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *         be returned.  Otherwise \c GLX_NONE will be returned.
12827c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner *
12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * \note
12847c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the
12857c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * DRI CVS tree.
12868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */
12877c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattnerstatic GLint
12888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlxmesa_convert_from_x_visual_type( int visualType )
12891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{
12907c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner    static const int glx_visual_types[ NUM_VISUAL_TYPES ] = {
12917c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner	GLX_STATIC_GRAY,  GLX_GRAY_SCALE,
12927c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner	GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
12937c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner	GLX_TRUE_COLOR,   GLX_DIRECT_COLOR
12947c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner    };
12957356a31327be9b3c3434a0c88746028980da5684Chris Lattner
12967c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner    return ( (unsigned) visualType < NUM_VISUAL_TYPES )
12976a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor	? glx_visual_types[ visualType ] : GLX_NONE;
12986a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor}
12996a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
13006a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
13016a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor/**********************************************************************/
13026a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor/*****                       Public Functions                     *****/
1303c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/**********************************************************************/
13047c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
1305f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner
1306df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#ifdef IN_DRI_DRIVER
1307df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_VERSION_1_3
1308df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_VERSION_1_4
1309df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_VERSION_1_5
1310df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_VERSION_2_0
1311df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner
13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/* sw extensions for imaging */
1313df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_blend_color
1314df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_blend_minmax
1315df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_convolution
1316df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_histogram
1317df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_SGI_color_table
13187356a31327be9b3c3434a0c88746028980da5684Chris Lattner
13191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/* sw extensions not associated with some GL version */
1320df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_ARB_draw_elements_base_vertex
1321df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_ARB_shader_objects
1322df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_ARB_sync
1323df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_ARB_vertex_program
13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define need_GL_APPLE_vertex_array_object
13258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#define need_GL_ATI_fragment_shader
1326df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_depth_bounds_test
1327df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_framebuffer_object
132837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor#define need_GL_EXT_framebuffer_blit
13297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner#define need_GL_EXT_gpu_program_parameters
13306a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#define need_GL_EXT_paletted_texture
13316a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#define need_GL_MESA_resize_buffers
13326a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#define need_GL_NV_vertex_program
13336a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#define need_GL_NV_fragment_program
13346a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
13356a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#include "extension_helper.h"
13366a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#include "utils.h"
13376a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
13386a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregorconst struct dri_extension card_extensions[] =
13396a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor{
13406a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_VERSION_1_3",			GL_VERSION_1_3_functions },
13416a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_VERSION_1_4",			GL_VERSION_1_4_functions },
13426a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_VERSION_1_5",			GL_VERSION_1_5_functions },
13436a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_VERSION_2_0",			GL_VERSION_2_0_functions },
13448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
13456a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_blend_color",		GL_EXT_blend_color_functions },
13466a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_blend_minmax",		GL_EXT_blend_minmax_functions },
13476a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_convolution",		GL_EXT_convolution_functions },
13486a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_histogram",		GL_EXT_histogram_functions },
13496a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_SGI_color_table",		GL_SGI_color_table_functions },
13508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
13516a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_ARB_depth_clamp",		NULL },
13526a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_ARB_draw_elements_base_vertex", GL_ARB_draw_elements_base_vertex_functions },
13536a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_ARB_shader_objects",		GL_ARB_shader_objects_functions },
13546a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_ARB_sync",			GL_ARB_sync_functions },
13556a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_ARB_vertex_program",		GL_ARB_vertex_program_functions },
13566a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_APPLE_vertex_array_object",	GL_APPLE_vertex_array_object_functions },
13576a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_ATI_fragment_shader",		GL_ATI_fragment_shader_functions },
13586a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_depth_bounds_test",	GL_EXT_depth_bounds_test_functions },
13596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_framebuffer_object",	GL_EXT_framebuffer_object_functions },
13606a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_framebuffer_blit",		GL_EXT_framebuffer_blit_functions },
13616a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_gpu_program_parameters",	GL_EXT_gpu_program_parameters_functions },
13626a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_EXT_paletted_texture",		GL_EXT_paletted_texture_functions },
13636a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_MESA_resize_buffers",		GL_MESA_resize_buffers_functions },
13646a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_NV_depth_clamp",		NULL },
13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   { "GL_NV_vertex_program",		GL_NV_vertex_program_functions },
13666a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { "GL_NV_fragment_program",		GL_NV_fragment_program_functions },
13676a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor   { NULL,				NULL }
13686a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor};
13696a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#endif
13706a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor
1371c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/*
13726a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * Create a new X/Mesa visual.
13736a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * Input:  display - X11 display
13746a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         visinfo - an XVisualInfo pointer
13756a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         rgb_flag - GL_TRUE = RGB mode,
13766a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *                    GL_FALSE = color index mode
13776a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         alpha_flag - alpha buffer requested?
13788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl *         db_flag - GL_TRUE = double-buffered,
13796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *                   GL_FALSE = single buffered
13806a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         stereo_flag - stereo visual?
13816a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         ximage_flag - GL_TRUE = use an XImage for back buffer,
13826a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *                       GL_FALSE = use an off-screen pixmap for back buffer
13836a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         depth_size - requested bits/depth values, or zero
13846a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         stencil_size - requested bits/stencil values, or zero
13858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl *         accum_red_size - requested bits/red accum values, or zero
13866a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         accum_green_size - requested bits/green accum values, or zero
13876a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         accum_blue_size - requested bits/blue accum values, or zero
13886a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         accum_alpha_size - requested bits/alpha accum values, or zero
1389ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl *         num_samples - number of samples/pixel if multisampling, or zero
13906a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         level - visual level, usually 0
13916a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor *         visualCaveat - ala the GLX extension, usually GLX_NONE
13920b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * Return;  a new XMesaVisual or 0 if error.
13930b1fb988012da21d996c43e36867787a7a07b889Chris Lattner */
13944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas GregorPUBLIC
13954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas GregorXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
13964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                               XMesaVisualInfo visinfo,
13970b1fb988012da21d996c43e36867787a7a07b889Chris Lattner                               GLboolean rgb_flag,
13983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                               GLboolean alpha_flag,
1399a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl                               GLboolean db_flag,
140001b81c4d074bba9c18372d521405dfe32fc4f552Argyrios Kyrtzidis                               GLboolean stereo_flag,
1401c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis                               GLboolean ximage_flag,
1402c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis                               GLint depth_size,
14031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                               GLint stencil_size,
14042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                               GLint accum_red_size,
1405c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis                               GLint accum_green_size,
1406681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl                               GLint accum_blue_size,
1407c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor                               GLint accum_alpha_size,
1408681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl                               GLint num_samples,
1409681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl                               GLint level,
1410681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl                               GLint visualCaveat )
14112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
14122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   char *gamma;
14132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   XMesaVisual v;
14141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   GLint red_bits, green_bits, blue_bits, alpha_bits;
14152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
14163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#ifdef IN_DRI_DRIVER
14170953e767ff7817f97b3ab20896b229891eeff45bJohn McCall   /* driInitExtensions() should be called once per screen to setup extension
1418a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    * indices.  There is no need to call it when the context is created since
1419a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    * XMesa enables mesa sw extensions on its own.
1420a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor    */
14210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall   driInitExtensions( NULL, card_extensions, GL_FALSE );
14228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif
14230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall
14240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall#ifndef XFree86Server
14250953e767ff7817f97b3ab20896b229891eeff45bJohn McCall   /* For debugging only */
14260953e767ff7817f97b3ab20896b229891eeff45bJohn McCall   if (_mesa_getenv("MESA_XSYNC")) {
14272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      /* This makes debugging X easier.
1428b7166334d897e1e4e6a5b428fe2d0ec752ef187fMike Stump       * In your debugger, set a breakpoint on _XError to stop when an
14292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor       * X protocol error is generated.
14302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor       */
14310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall      XSynchronize( display, 1 );
14322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
14332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
14342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1435c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
14360b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor   if (!v) {
14370b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor      return NULL;
1438c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor   }
14392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
14402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   v->display = display;
14414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
14424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   /* Save a copy of the XVisualInfo struct because the user may X_mesa_free()
14434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    * the struct but we may need some of the information contained in it
14444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    * at a later time.
14452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    */
14462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#ifndef XFree86Server
14472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
14482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if(!v->visinfo) {
14492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      _mesa_free(v);
1450a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      return NULL;
14512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
145217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
14532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif
14542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1455c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor   /* check for MESA_GAMMA environment variable */
14562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   gamma = _mesa_getenv("MESA_GAMMA");
14578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   if (gamma) {
14588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
145917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
146017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1461681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
14622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
14632512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor   }
1464681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl   else {
14658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
14662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   }
14672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
14682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   v->ximage_flag = ximage_flag;
1469a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
14701476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#ifdef XFree86Server
14711476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   /* We could calculate these values by ourselves.  nplanes is either the sum
14721476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl    * of the red, green, and blue bits or the number index bits.
14731476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl    * ColormapEntries is either (1U << index_bits) or
14741476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl    * (1U << max(redBits, greenBits, blueBits)).
14758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    */
14761476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   assert(visinfo->nplanes > 0);
14771476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->nplanes = visinfo->nplanes;
14781476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->ColormapEntries = visinfo->ColormapEntries;
14791476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl
14808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   v->mesa_visual.redMask = visinfo->redMask;
14811476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.greenMask = visinfo->greenMask;
14821476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.blueMask = visinfo->blueMask;
1483ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl   v->mesa_visual.visualID = visinfo->vid;
14841476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.screen = 0; /* FIXME: What should be done here? */
14851476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#else
14861476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.redMask = visinfo->red_mask;
14871476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.greenMask = visinfo->green_mask;
14888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   v->mesa_visual.blueMask = visinfo->blue_mask;
14891476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.visualID = visinfo->visualid;
14901476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.screen = visinfo->screen;
14911476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#endif
14921476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl
14938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus))
14941476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class);
14951476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#else
1496ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class);
14971476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#endif
14981476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl
14991476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl   v->mesa_visual.visualRating = visualCaveat;
15004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
15014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   if (alpha_flag)
15024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      v->mesa_visual.alphaBits = 8;
15034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
15043251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor   (void) initialize_visual_and_buffer( v, NULL, rgb_flag, 0, 0 );
1505f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
15063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   {
1507a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      const int xclass = v->mesa_visual.visualType;
1508f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
1509f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         red_bits   = _mesa_bitcount(GET_REDMASK(v));
1510f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         green_bits = _mesa_bitcount(GET_GREENMASK(v));
1511f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         blue_bits  = _mesa_bitcount(GET_BLUEMASK(v));
15121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
15135d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      else {
15148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         /* this is an approximation */
15155d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl         int depth;
15165d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl         depth = GET_VISUAL_DEPTH(v);
1517f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         red_bits = depth / 3;
1518f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         depth -= red_bits;
15193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         green_bits = depth / 2;
15201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         depth -= green_bits;
1521f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         blue_bits = depth;
15220eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis         alpha_bits = 0;
1523f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
15241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
15251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      alpha_bits = v->mesa_visual.alphaBits;
1526f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
1527f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1528f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   _mesa_initialize_visual( &v->mesa_visual,
1529f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                            rgb_flag, db_flag, stereo_flag,
15305d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl                            red_bits, green_bits,
15315d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl                            blue_bits, alpha_bits,
1532f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                            v->mesa_visual.indexBits,
1533f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                            depth_size,
1534f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                            stencil_size,
15355d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl                            accum_red_size, accum_green_size,
1536f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                            accum_blue_size, accum_alpha_size,
1537f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                            0 );
1538f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1539f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   /* XXX minor hack */
1540f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   v->mesa_visual.level = level;
1541f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   return v;
15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
154383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
15441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
154583941df2745d69c05acee3174c7a265c206f70d9Douglas GregorPUBLIC
154683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregorvoid XMesaDestroyVisual( XMesaVisual v )
1547f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
1548f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#ifndef XFree86Server
1549f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   _mesa_free(v->visinfo);
1550f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#endif
1551f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   _mesa_free(v);
15521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
1553f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1554f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
15551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1556f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor/**
1557a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor * Create a new XMesaContext.
1558a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor * \param v  the XMesaVisual
15595d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * \param share_list  another XMesaContext with which to share display
1560f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *                    lists or NULL if no sharing is wanted.
15615d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * \return an XMesaContext or NULL if error.
1562f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor */
1563f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorPUBLIC
1564f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1565f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
1566f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   static GLboolean firstTime = GL_TRUE;
15675d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   XMesaContext c;
1568f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   GLcontext *mesaCtx;
1569f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   struct dd_function_table functions;
1570f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   TNLcontext *tnl;
1571f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1572f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   if (firstTime) {
1573f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      _glthread_INIT_MUTEX(_xmesa_lock);
15745d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl      firstTime = GL_FALSE;
1575f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   }
1576f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1577f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */
15785d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1579f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   if (!c)
1580f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return NULL;
1581f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1582a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor   mesaCtx = &(c->mesa);
1583a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor
1584f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   /* initialize with default driver functions, then plug in XMesa funcs */
1585f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   _mesa_init_driver_functions(&functions);
1586f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   xmesa_init_driver_functions(v, &functions);
1587f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual,
1588059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl                      share_list ? &(share_list->mesa) : (GLcontext *) NULL,
1589f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor                      &functions, (void *) c)) {
1590f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      _mesa_free(c);
1591059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl      return NULL;
1592059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   }
1593a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
1594f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   /* Enable this to exercise fixed function -> shader translation
1595f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor    * with software rendering.
1596059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl    */
15975d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   if (0) {
1598059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl      mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE;
1599e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
1600059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   }
1601f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
16023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   _mesa_enable_sw_extensions(mesaCtx);
16035d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   _mesa_enable_1_3_extensions(mesaCtx);
16041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   _mesa_enable_1_4_extensions(mesaCtx);
1605059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   _mesa_enable_1_5_extensions(mesaCtx);
1606059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   _mesa_enable_2_0_extensions(mesaCtx);
1607e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   _mesa_enable_2_1_extensions(mesaCtx);
16088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#if ENABLE_EXT_texure_compression_s3tc
16095d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl    if (mesaCtx->Mesa_DXTn) {
16105d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl       _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc");
16115d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl       _mesa_enable_extension(mesaCtx, "GL_S3_s3tc");
1612059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl    }
16133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1");
16145d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#endif
16155d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#if ENABLE_EXT_timer_query
16165d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl    _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query");
16175d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#endif
16185d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl
16195d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#ifdef XFree86Server
16205d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl   /* If we're running in the X server, do bounds checking to prevent
16215d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl    * segfaults and server crashes!
16223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    */
1623e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   mesaCtx->Const.CheckArrayBounds = GL_TRUE;
1624e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#endif
1625e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
1626e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   /* finish up xmesa context initializations */
1627e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE;
1628e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   c->xm_visual = v;
1629e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1630e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   c->display = v->display;
1631e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1632e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
1633e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   /* Initialize the software rasterizer and helper modules.
1634e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl    */
1635e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   if (!_swrast_CreateContext( mesaCtx ) ||
1636e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl       !_vbo_CreateContext( mesaCtx ) ||
1637e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl       !_tnl_CreateContext( mesaCtx ) ||
1638e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl       !_swsetup_CreateContext( mesaCtx )) {
1639fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl      _mesa_free_context_data(&c->mesa);
1640fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl      _mesa_free(c);
1641fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl      return NULL;
1642e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   }
16435d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
1644f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   /* tnl setup */
1645f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   tnl = TNL_CONTEXT(mesaCtx);
1646f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   tnl->Driver.RunPipeline = _tnl_run_pipeline;
16471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   /* swrast setup */
1648f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   xmesa_register_swrast_functions( mesaCtx );
1649f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   _swsetup_Wakeup(mesaCtx);
16503397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1651f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   _mesa_meta_init(mesaCtx);
1652f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1653a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor   return c;
1654f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor}
1655f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1656f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1657f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1658f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorPUBLIC
16598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid XMesaDestroyContext( XMesaContext c )
1660f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
166183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   GLcontext *mesaCtx = &c->mesa;
1662f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1663f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#ifdef FX
1664f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor   FXdestroyContext( XMESA_BUFFER(mesaCtx->DrawBuffer) );
166583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor#endif
1666f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
16678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   _mesa_meta_free( mesaCtx );
1668f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor
1669e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   _swsetup_DestroyContext( mesaCtx );
1670ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar   _swrast_DestroyContext( mesaCtx );
167183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   _tnl_DestroyContext( mesaCtx );
167283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   _vbo_DestroyContext( mesaCtx );
167383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor   _mesa_free_context_data( mesaCtx );
16748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   _mesa_free( c );
167583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor}
167683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
167783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
167883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor
167983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor/**
168083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor * Private function for creating an XMesaBuffer which corresponds to an
16818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * X window or pixmap.
168283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor * \param v  the window's XMesaVisual
168383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor * \param w  the window we're wrapping
1684ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * \return  new XMesaBuffer or NULL if error
168583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor */
1686f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorPUBLIC XMesaBuffer
1687f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w)
1688f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{
16893397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#ifndef XFree86Server
1690a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   XWindowAttributes attr;
1691320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian#endif
1692320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   XMesaBuffer b;
1693320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   XMesaColormap cmap;
1694725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl   int depth;
1695320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian
1696725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl   assert(v);
16973397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   assert(w);
1698a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl
1699a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl   /* Check that window depth matches visual depth */
1700320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian#ifdef XFree86Server
1701320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   depth = ((XMesaDrawable)w)->depth;
1702320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian#else
1703320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   XGetWindowAttributes( v->display, w, &attr );
1704320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   depth = attr.depth;
1705320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian#endif
1706320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   if (GET_VISUAL_DEPTH(v) != depth) {
1707320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
17088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                    GET_VISUAL_DEPTH(v), depth);
1709320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian      return NULL;
1710320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian   }
17114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
17124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   /* Find colormap */
17134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server
17144fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1715f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#else
17163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   if (attr.colormap) {
1717a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      cmap = attr.colormap;
171837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor   }
17193251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor   else {
1720a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
1721a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor      /* this is weird, a window w/out a colormap!? */
1722a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor      /* OK, let's just allocate a new one and hope for the best */
1723a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor      cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1724a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   }
1725a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor#endif
1726a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor
1727a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap);
1728a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   if (!b)
1729a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor      return NULL;
1730a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor
17313251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor   if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode,
17323251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor                                      (XMesaDrawable) w, cmap )) {
17333251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor      xmesa_free_buffer(b);
17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return NULL;
17358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   }
17363251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor
17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   return b;
17383397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
173937e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor
17403251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor
17413251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor
17422596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar/**
17433251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * Create a new XMesaBuffer from an X pixmap.
17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump *
17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * \param v    the XMesaVisual
17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * \param p    the pixmap
17478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or
1748e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar *             \c GLX_DIRECT_COLOR visual for the pixmap
1749a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor * \returns new XMesaBuffer or NULL if error
1750a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor */
17515998da5c29dae3f654cb65738ff237203e2222c8Douglas GregorPUBLIC XMesaBuffer
17521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap)
1753a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor{
17545998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor   XMesaBuffer b;
1755a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor
1756a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   assert(v);
1757a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor
17588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap);
1759a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   if (!b)
1760668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor      return NULL;
176102fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor
176202fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
176302fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor				     (XMesaDrawable) p, cmap)) {
1764d6595a40fe12e3d5ffe5ce48987b379d547439a4Douglas Gregor      xmesa_free_buffer(b);
17653251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor      return NULL;
17663251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor   }
17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   return b;
17693251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor}
17703251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor
17713251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor
17723251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor/**
1773e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar * For GLX_EXT_texture_from_pixmap
17743251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor */
17751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpXMesaBuffer
17761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpXMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p,
17778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                               XMesaColormap cmap,
1778a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor                               int format, int target, int mipmap)
1779a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor{
1780a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   GET_CURRENT_CONTEXT(ctx);
1781a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor   XMesaBuffer b;
17825998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor   GLuint width, height;
1783a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor
17843251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor   assert(v);
17851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap);
178737e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor   if (!b)
17885998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor      return NULL;
1789b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar
1790b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar   /* get pixmap size, update framebuffer/renderbuffer dims */
1791b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar   xmesa_get_window_size(v->display, b, &width, &height);
1792646395bbcaa849c94bc2a3246c71d809ca719f01Argyrios Kyrtzidis   _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height);
1793b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar
17945998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor   if (target == 0) {
17953251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor      /* examine dims */
179637e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      if (ctx->Extensions.ARB_texture_non_power_of_two) {
17975998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor         target = GLX_TEXTURE_2D_EXT;
179837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor      }
1799668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor      else if (   _mesa_bitcount(width)  == 1
1800668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor               && _mesa_bitcount(height) == 1) {
1801668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor         /* power of two size */
1802668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor         if (height == 1) {
1803668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor            target = GLX_TEXTURE_1D_EXT;
1804668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor         }
1805f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl         else {
18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            target = GLX_TEXTURE_2D_EXT;
1807668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor         }
1808668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor      }
1809668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor      else if (ctx->Extensions.NV_texture_rectangle) {
18103251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor         target = GLX_TEXTURE_RECTANGLE_EXT;
1811d8c5abb096a5f6babb3709180fe304be5462bcc1Sebastian Redl      }
18123251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor      else {
18133251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor         /* non power of two textures not supported */
18143251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor         XMesaDestroyBuffer(b);
18153251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor         return 0;
18163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      }
1817afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   }
1818afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor
1819afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   b->TextureTarget = target;
1820afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   b->TextureFormat = format;
1821a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl   b->TextureMipmap = mipmap;
1822afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor
1823afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
1824afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor				     (XMesaDrawable) p, cmap)) {
1825afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor      xmesa_free_buffer(b);
1826afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor      return NULL;
18273397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl   }
18285d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   return b;
183092b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor}
183192b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor
183292b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor
18333397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
183492b059ea944adaa3e00bb53d63a09868a4752547Douglas GregorXMesaBuffer
183592b059ea944adaa3e00bb53d63a09868a4752547Douglas GregorXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
183692b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor                   unsigned int width, unsigned int height)
183792b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor{
183892b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor#ifndef XFree86Server
183992b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor   XMesaWindow root;
1840f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl   XMesaDrawable drawable;  /* X Pixmap Drawable */
1841f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl   XMesaBuffer b;
1842f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl
18438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   /* allocate pixmap for front buffer */
1844afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   root = RootWindow( v->display, v->visinfo->screen );
1845afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   drawable = XCreatePixmap(v->display, root, width, height,
1846afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor                            v->visinfo->depth);
18473c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl   if (!drawable)
18485d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      return NULL;
18493251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor
1850afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   b = create_xmesa_buffer(drawable, PBUFFER, v, cmap);
18513251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor   if (!b)
18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return NULL;
1853668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
18543251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
18553397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl				     drawable, cmap)) {
18563251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor      xmesa_free_buffer(b);
1857f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor      return NULL;
1858a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor   }
1859668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
1860afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   return b;
1861afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor#else
1862afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   return 0;
1863afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor#endif
18648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
1865668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
18663251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor
1867c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
1868afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor/*
1869afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor * Deallocate an XMesaBuffer structure and all related info.
1870afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor */
18718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlPUBLIC void
1872668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas GregorXMesaDestroyBuffer(XMesaBuffer b)
1873ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar{
1874afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor   xmesa_free_buffer(b);
1875afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor}
1876afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor
18772b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor
18788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**
18792b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * Query the current window size and update the corresponding GLframebuffer
18802b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * and all attached renderbuffers.
18812b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * Called when:
18822b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor *  1. the first time a buffer is bound to a context.
18832b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor *  2. from glViewport to poll for window size changes
18848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl *  3. from the XMesaResizeBuffers() API function.
18852b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * Note: it's possible (and legal) for xmctx to be NULL.  That can happen
18862b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * when resizing a buffer when no rendering context is bound.
1887ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl */
18882b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregorvoid
1889afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregorxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer)
1890afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor{
18914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   GLuint width, height;
18925d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height);
18935d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   if (drawBuffer->mesa_buffer.Width != width ||
18945d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis       drawBuffer->mesa_buffer.Height != height) {
18955d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      GLcontext *ctx = xmctx ? &xmctx->mesa : NULL;
18965d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height);
18975d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   }
18985d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */
18995d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis}
19005d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19015d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19025d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis/*
19035d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * Bind buffer b to context c and make c the current rendering context.
19045d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis */
19055d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
19065d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{
19075d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   return XMesaMakeCurrent2( c, b, b );
19085d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis}
19095d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19105d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19115d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis/*
19125d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * Bind buffer b to context c and make c the current rendering context.
19135d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis */
19145d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisPUBLIC
19155d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
19165d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis                             XMesaBuffer readBuffer )
19175d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{
19185d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   if (c) {
19195d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      if (!drawBuffer || !readBuffer)
19205d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis         return GL_FALSE;  /* must specify buffers! */
19215d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19225d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      if (&(c->mesa) == _mesa_get_current_context()
19235d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis          && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer
19245d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis          && c->mesa.ReadBuffer == &readBuffer->mesa_buffer
19255d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis          && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) {
19265d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis         /* same context and buffer, do nothing */
19275d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis         return GL_TRUE;
19285d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      }
19295d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19305d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      c->xm_buffer = drawBuffer;
19315d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19325d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis#ifdef FX
19335d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      if (FXmakeCurrent( drawBuffer ))
19345d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis         return GL_TRUE;
19355d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis#endif
19365d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19375d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      /* Call this periodically to detect when the user has begun using
19385d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis       * GL rendering from multiple threads.
19395d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis       */
19405d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      _glapi_check_multithread();
19415d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19425d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      xmesa_check_and_update_buffer_size(c, drawBuffer);
19435d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      if (readBuffer != drawBuffer)
19445d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis         xmesa_check_and_update_buffer_size(c, readBuffer);
19455d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19465d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      _mesa_make_current(&(c->mesa),
19475d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis                         &drawBuffer->mesa_buffer,
19485d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis                         &readBuffer->mesa_buffer);
19495d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19505d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      if (c->xm_visual->mesa_visual.rgbMode) {
19515d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis         /*
19525d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis          * Must recompute and set these pixel values because colormap
19535d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis          * can be different for different windows.
19545d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis          */
19555d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis         c->clearpixel = xmesa_color_to_pixel( &c->mesa,
19565d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis                                               c->clearcolor[0],
19575d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis                                               c->clearcolor[1],
19585d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis                                               c->clearcolor[2],
19595d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis                                               c->clearcolor[3],
19605d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis                                               c->xm_visual->undithered_pf);
19615d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis         XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel);
19625d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      }
19635d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19645d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
19655d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      drawBuffer->wasCurrent = GL_TRUE;
19665d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   }
19675d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   else {
19685d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      /* Detach */
19695d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      _mesa_make_current( NULL, NULL, NULL );
19705d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   }
19715d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   return GL_TRUE;
19725d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis}
19735d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19745d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19755d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis/*
19765d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * Unbind the context c from its buffer.
19775d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis */
19785d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisGLboolean XMesaUnbindContext( XMesaContext c )
19795d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{
19805d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   /* A no-op for XFree86 integration purposes */
19815d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   return GL_TRUE;
19825d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis}
19835d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19845d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19855d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisXMesaContext XMesaGetCurrentContext( void )
19865d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{
19875d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   GET_CURRENT_CONTEXT(ctx);
19885d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   if (ctx) {
19895d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      XMesaContext xmesa = XMESA_CONTEXT(ctx);
19905d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      return xmesa;
19915d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   }
19925d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   else {
19935d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      return 0;
19945d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   }
19955d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis}
19965d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19975d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
19985d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisXMesaBuffer XMesaGetCurrentBuffer( void )
19995d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{
20005d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   GET_CURRENT_CONTEXT(ctx);
20015d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   if (ctx) {
20025d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
20035d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      return xmbuf;
20045d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   }
20055d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   else {
20065d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      return 0;
20075d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis   }
20085d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis}
20095d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
20105d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis
20115d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis/* New in Mesa 3.1 */
2012074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisXMesaBuffer XMesaGetCurrentReadBuffer( void )
2013074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{
2014074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   GET_CURRENT_CONTEXT(ctx);
2015074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   if (ctx) {
2016074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      return XMESA_BUFFER(ctx->ReadBuffer);
2017074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   }
2018074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   else {
2019074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      return 0;
2020074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   }
2021074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis}
2022074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2023074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2024074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis#ifdef XFree86Server
2025074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisPUBLIC
2026074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisGLboolean XMesaForceCurrent(XMesaContext c)
2027074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{
2028074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   if (c) {
2029074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      _glapi_set_dispatch(c->mesa.CurrentDispatch);
2030074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2031074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      if (&(c->mesa) != _mesa_get_current_context()) {
2032074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis	 _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer);
2033074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      }
2034074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   }
2035074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   else {
2036074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis      _mesa_make_current(NULL, NULL, NULL);
2037074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   }
2038074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   return GL_TRUE;
2039074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis}
2040074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2041074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2042074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisPUBLIC
2043074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisGLboolean XMesaLoseCurrent(XMesaContext c)
2044074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{
2045074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   (void) c;
2046074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   _mesa_make_current(NULL, NULL, NULL);
2047074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   return GL_TRUE;
2048074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis}
2049074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2050074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2051074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisPUBLIC
2052074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisGLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask )
2053074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{
2054074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask);
2055074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   return GL_TRUE;
2056074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis}
2057074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis#endif /* XFree86Server */
2058074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2059074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2060074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis#ifndef FX
2061074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisGLboolean XMesaSetFXmode( GLint mode )
2062074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{
2063074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   (void) mode;
2064074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   return GL_FALSE;
2065074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis}
2066074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis#endif
2067074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2068074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2069074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2070074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis/*
2071074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis * Copy the back buffer to the front buffer.  If there's no back buffer
2072074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis * this is a no-op.
2073074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis */
2074074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisPUBLIC
2075074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidisvoid XMesaSwapBuffers( XMesaBuffer b )
2076074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{
2077074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   GET_CURRENT_CONTEXT(ctx);
2078074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis
2079074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis   if (!b->backxrb) {
20805d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis      /* single buffered */
20814fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      return;
20824fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor   }
20834fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
208468a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor   /* If we're swapping the buffer associated with the current context
2085a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl    * we have to flush any pending rendering commands first.
208668a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor    */
2087cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
2088cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt      _mesa_notifySwapBuffers(ctx);
2089cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt
2090cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt   if (b->db_mode) {
2091cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#ifdef FX
209268a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor      if (FXswapBuffers(b))
2093cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt         return;
20945b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian#endif
209568a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor      if (b->backxrb->ximage) {
209668a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor	 /* Copy Ximage (back buf) from client memory to server window */
20978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#if defined(USE_XSHM) && !defined(XFree86Server)
209868a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor	 if (b->shm) {
209968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2100a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl	    XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
210168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor			  b->swapgc,
210268a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor			  b->backxrb->ximage, 0, 0,
210368a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor			  0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
210468a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor                          False );
21053251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
21063251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor	 }
2107a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl	 else
21088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif
21093397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         {
2110f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2111f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
2112f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl			   b->swapgc,
21133251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor			   b->backxrb->ximage, 0, 0,
21143251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor			   0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height );
211583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
211683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor         }
2117a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      }
211883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor      else if (b->backxrb->pixmap) {
211983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor	 /* Copy pixmap (back buf) to window (front buf) on server */
2120e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2121e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl	 XMesaCopyArea( b->xm_visual->display,
2122e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl			b->backxrb->pixmap,   /* source drawable */
2123e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl			b->frontxrb->drawable,  /* dest. drawable */
2124e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl			b->swapgc,
212583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor			0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
212683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor			0, 0                 /* dest region */
2127a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl		      );
2128e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
21298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      }
2130e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl
2131e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      if (b->swAlpha)
2132e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl         _mesa_copy_soft_alpha_renderbuffers(ctx, &b->mesa_buffer);
2133e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl   }
213430c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl#if !defined(XFree86Server)
21352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   XSync( b->xm_visual->display, False );
2136a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#endif
213730c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl}
21382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2139c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
2140c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
2141c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/*
2142c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor * Copy sub-region of back buffer to front buffer
21431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */
2144b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnervoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
21452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{
21461dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   GET_CURRENT_CONTEXT(ctx);
2147a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
21481dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   /* If we're swapping the buffer associated with the current context
2149a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl    * we have to flush any pending rendering commands first.
21501dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl    */
21511dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
2152a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl      _mesa_notifySwapBuffers(ctx);
21531dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl
21541dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   if (!b->backxrb) {
21551dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl      /* single buffered */
21561dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl      return;
21571dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   }
21581dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl
21592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor   if (b->db_mode) {
21602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      int yTop = b->mesa_buffer.Height - y - height;
2161f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl#ifdef FX
216261d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor      if (FXswapBuffers(b))
21632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor         return;
21642deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor#endif
21652deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor      if (b->backxrb->ximage) {
21662deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor         /* Copy Ximage from host's memory to server's window */
21672deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor#if defined(USE_XSHM) && !defined(XFree86Server)
21682deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor         if (b->shm) {
21692deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor            /* XXX assuming width and height aren't too large! */
21702deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor            XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
21712deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor                          b->swapgc,
21722deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor                          b->backxrb->ximage, x, yTop,
21732deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor                          x, yTop, width, height, False );
21742deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor            /* wait for finished event??? */
217563d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner         }
2176e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl         else
217763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner#endif
21784c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor         {
2179e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl            /* XXX assuming width and height aren't too large! */
2180e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
218163d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner			   b->swapgc,
21824c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor			   b->backxrb->ximage, x, yTop,
218349b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis			   x, yTop, width, height );
218449b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis         }
218549b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis      }
218649b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis      else {
21874056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl         /* Copy pixmap to window on server */
218872b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis         XMesaCopyArea( b->xm_visual->display,
218972b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis			b->backxrb->pixmap,           /* source drawable */
219072b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis			b->frontxrb->drawable,        /* dest. drawable */
219172b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis			b->swapgc,
219272b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis			x, yTop, width, height,  /* source region */
219372b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis			x, yTop                  /* dest region */
219472b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis                      );
219572b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis      }
219672b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis   }
219772b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis}
219872b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis
219972b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis
220072b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis/*
220111a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
220214c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor * is a way to get "under the hood" of X/Mesa so one can manipulate the
220314c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor * back buffer directly.
220414c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor * Output:  pixmap - pointer to back buffer's Pixmap, or 0
220514c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor *          ximage - pointer to back buffer's XImage, or NULL
22063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Return:  GL_TRUE = context is double buffered
220763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner *          GL_FALSE = context is single buffered
22081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */
220914c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor#ifndef XFree86Server
221014c22f20c077cecd68581952a0c227f8c180be03Douglas GregorGLboolean XMesaGetBackBuffer( XMesaBuffer b,
221114c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor                              XMesaPixmap *pixmap,
221214c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor                              XMesaImage **ximage )
221314c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor{
2214b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor   if (b->db_mode) {
2215b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor      if (pixmap)
2216b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor         *pixmap = b->backxrb->pixmap;
2217b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor      if (ximage)
2218b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor         *ximage = b->backxrb->ximage;
2219d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis      return GL_TRUE;
2220d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis   }
2221be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis   else {
2222be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis      *pixmap = 0;
2223be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis      *ximage = NULL;
2224be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis      return GL_FALSE;
2225be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis   }
2226be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis}
2227be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis#endif /* XFree86Server */
2228d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis
2229d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis
2230d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis/*
2231d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis * Return the depth buffer associated with an XMesaBuffer.
2232d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis * Input:  b - the XMesa buffer handle
2233d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis * Output:  width, height - size of buffer in pixels
2234d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis *          bytesPerValue - bytes per depth value (2 or 4)
22350e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis *          buffer - pointer to depth buffer values
22360e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
22370e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis */
22380e0363866792b309d70e9c8e92b4c239773af89cArgyrios KyrtzidisGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
22390e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis                               GLint *bytesPerValue, void **buffer )
22400e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis{
22410e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis   struct gl_renderbuffer *rb
22420e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis      = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer;
22430e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis   if (!rb || !rb->Data) {
22440e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis      *width = 0;
22450e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis      *height = 0;
224676c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis      *bytesPerValue = 0;
224776c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis      *buffer = 0;
224876c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis      return GL_FALSE;
224976c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis   }
225076c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis   else {
225176c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis      *width = b->mesa_buffer.Width;
225276c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis      *height = b->mesa_buffer.Height;
22533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16
2254ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor         ? sizeof(GLushort) : sizeof(GLuint);
22558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      *buffer = rb->Data;
225630c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl      return GL_TRUE;
22571dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   }
2258e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor}
2259dd41ed59cf7aefabd40bf766d8fcc7ebd759c8e5Douglas Gregor
2260e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
2261c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffvoid XMesaFlush( XMesaContext c )
2262c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff{
22631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   if (c && c->xm_visual) {
2264c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff#ifdef XFree86Server
2265c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff      /* NOT_NEEDED */
2266c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff#else
2267c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff      XSync( c->xm_visual->display, False );
2268c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff#endif
2269c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff   }
2270c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff}
2271c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff
2272782fa308a765aeac2acb39c4e697c937ec21185bMike Stump
2273782fa308a765aeac2acb39c4e697c937ec21185bMike Stump
2274d1571acc700b652a52c766e36a6c688d9bf6f3a1Douglas Gregorconst char *XMesaGetString( XMesaContext c, int name )
2275d1571acc700b652a52c766e36a6c688d9bf6f3a1Douglas Gregor{
2276adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump   (void) c;
2277083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump   if (name==XMESA_VERSION) {
22782bb5ddaff86ee73d2cea7ec1835978afc88a83f0Fariborz Jahanian      return "5.0";
22792bb5ddaff86ee73d2cea7ec1835978afc88a83f0Fariborz Jahanian   }
2280006113841bdae1edb77aef75ba1ffdf2e55a3094Argyrios Kyrtzidis   else if (name==XMESA_EXTENSIONS) {
22818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      return "";
22821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump   }
2283366809a4e9340b3458b471e2294a75a9f09ea304Douglas Gregor   else {
2284366809a4e9340b3458b471e2294a75a9f09ea304Douglas Gregor      return NULL;
22858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   }
228661d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor}
228761d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor
228861d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor
228961d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor
229061d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas GregorXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
229161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor{
229261d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor   XMesaBuffer b;
229361d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor   for (b=XMesaBufferList; b; b=b->Next) {
229461d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor      if (b->frontxrb->drawable == d && b->display == dpy) {
229561d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor         return b;
229611a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam      }
2297813a97b3eee957eac3ac1fb111b8892fb9afd0d4Douglas Gregor   }
2298059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl   return NULL;
2299320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian}
230037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor
23018f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor
23021476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl/**
2303ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor * Free/destroy all XMesaBuffers associated with given display.
23044c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor */
2305fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregorvoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy)
23068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{
23074c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor   XMesaBuffer b, next;
23084c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor   for (b = XMesaBufferList; b; b = next) {
23094c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor      next = b->Next;
23108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      if (b->display == dpy) {
231114c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor         xmesa_free_buffer(b);
231249b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis      }
231349b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis   }
23148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
231511a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam
231672b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis
231772b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis/*
23188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Look for XMesaBuffers whose X window has been destroyed.
231972b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis * Deallocate any such XMesaBuffers.
232072b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis */
232114c22f20c077cecd68581952a0c227f8c180be03Douglas Gregorvoid XMesaGarbageCollect( void )
232214c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor{
23238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   XMesaBuffer b, next;
232414c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor   for (b=XMesaBufferList; b; b=next) {
2325b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor      next = b->Next;
2326b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor      if (b->display && b->frontxrb->drawable && b->type == WINDOW) {
2327b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor#ifdef XFree86Server
23288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl	 /* NOT_NEEDED */
23291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#else
2330d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis         XSync(b->display, False);
2331d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis         if (!window_exists( b->display, b->frontxrb->drawable )) {
23328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            /* found a dead window, free the ancillary info */
2333d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis            XMesaDestroyBuffer( b );
2334d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis         }
2335d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis#endif
23368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      }
2337d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis   }
23380e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis}
23390e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis
23408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
23410e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
23420e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis                                GLfloat red, GLfloat green,
234376c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis                                GLfloat blue, GLfloat alpha )
234476c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis{
23458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl   GLcontext *ctx = &xmesa->mesa;
234676c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis   GLint r = (GLint) (red   * 255.0F);
23473e1af84bb0092a1aafb49deaa4ab6664c9a9071bDouglas Gregor   GLint g = (GLint) (green * 255.0F);
2348ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor   GLint b = (GLint) (blue  * 255.0F);
23493e1af84bb0092a1aafb49deaa4ab6664c9a9071bDouglas Gregor   GLint a = (GLint) (alpha * 255.0F);
235037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor
23512512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor   switch (xmesa->pixelformat) {
23522512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor      case PF_Index:
23538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         return 0;
2354c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor      case PF_Truecolor:
23552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor         {
23562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            unsigned long p;
2357a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl            PACK_TRUECOLOR( p, r, g, b );
235830c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl            return p;
23591dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl         }
23601dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl      case PF_8A8B8G8R:
2361ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl         return PACK_8A8B8G8R( r, g, b, a );
2362ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl      case PF_8A8R8G8B:
2363ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl         return PACK_8A8R8G8B( r, g, b, a );
2364e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      case PF_8R8G8B:
2365ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl         return PACK_8R8G8B( r, g, b );
2366ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl      case PF_5R6G5B:
2367ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl         return PACK_5R6G5B( r, g, b );
2368e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl      case PF_Dither:
2369ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl         {
23701dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl            DITHER_SETUP;
23711dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl            return DITHER( x, y, r, g, b );
23721476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         }
23731dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl      case PF_1Bit:
23748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         /* 382 = (3*255)/2 */
237530c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
23761476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl      case PF_HPCR:
23771476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         return DITHER_HPCR(x, y, r, g, b);
23781476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl      case PF_Lookup:
23791476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl         {
23801476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl            LOOKUP_SETUP;
23811dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl            return LOOKUP( r, g, b );
23821dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl         }
23831dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl      case PF_Grayscale:
23841dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl         return GRAY_RGB( r, g, b );
23853c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl      case PF_Dither_5R6G5B:
23861dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl         /* fall through */
23878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      case PF_Dither_True:
2388681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl         {
2389681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl            unsigned long p;
23901dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl            PACK_TRUEDITHER(p, x, y, r, g, b);
2391d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl            return p;
2392d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl         }
23930b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl      default:
23940b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
23951dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   }
2396681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl   return 0;
2397d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl}
23988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2399d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl
2400d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl/*
2401d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl * This is typically called when the window size changes and we need
24028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * to reallocate the buffer's back/depth/stencil/accum buffers.
2403d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl */
2404d692af71226d2fb537d86c670af96114ddd485c3Sebastian RedlPUBLIC void
24058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlXMesaResizeBuffers( XMesaBuffer b )
24061dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl{
2407083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   GET_CURRENT_CONTEXT(ctx);
2408083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   XMesaContext xmctx = XMESA_CONTEXT(ctx);
2409083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   if (!xmctx)
2410083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      return;
2411083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   xmesa_check_and_update_buffer_size(xmctx, b);
2412083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl}
2413083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl
2414083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl
241549b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidisstatic GLint
241649b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidisxbuffer_to_renderbuffer(int buffer)
241749b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis{
241849b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis   assert(MAX_AUX_BUFFERS <= 4);
241949b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis
2420083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   switch (buffer) {
2421083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   case GLX_FRONT_LEFT_EXT:
24224056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return BUFFER_FRONT_LEFT;
24234056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_FRONT_RIGHT_EXT:
24244056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return BUFFER_FRONT_RIGHT;
24254056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_BACK_LEFT_EXT:
24264056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return BUFFER_BACK_LEFT;
24274056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_BACK_RIGHT_EXT:
24284056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return BUFFER_BACK_RIGHT;
24294056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_AUX0_EXT:
24304056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return BUFFER_AUX0;
24314056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_AUX1_EXT:
24324056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_AUX2_EXT:
24334056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_AUX3_EXT:
24344056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_AUX4_EXT:
24354056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_AUX5_EXT:
24364056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_AUX6_EXT:
2437083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   case GLX_AUX7_EXT:
2438083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   case GLX_AUX8_EXT:
2439083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   case GLX_AUX9_EXT:
2440083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   default:
24413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      /* BadValue error */
2442083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      return -1;
2443083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   }
2444083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl}
2445083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl
2446083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl
2447083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian RedlPUBLIC void
2448083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian RedlXMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer,
2449083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl                  const int *attrib_list)
2450083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl{
2451083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl#if 0
2452083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   GET_CURRENT_CONTEXT(ctx);
2453083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   const GLuint unit = ctx->Texture.CurrentUnit;
2454083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
2455083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   struct gl_texture_object *texObj;
2456083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl#endif
2457083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   struct gl_renderbuffer *rb;
24584056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   struct xmesa_renderbuffer *xrb;
24594056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   GLint b;
24604056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   XMesaImage *img = NULL;
24614056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   GLboolean freeImg = GL_FALSE;
24624056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl
24634056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   b = xbuffer_to_renderbuffer(buffer);
24644056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   if (b < 0)
24654056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return;
24664056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl
24674056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_NONE_EXT)
24684056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return; /* BadMatch error */
24694056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl
24704056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   rb = drawable->mesa_buffer.Attachment[b].Renderbuffer;
24714056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   if (!rb) {
24724056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      /* invalid buffer */
24734056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return;
24744056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   }
24754056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   xrb = xmesa_renderbuffer(rb);
24764056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl
24774056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl#if 0
24784056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   switch (drawable->TextureTarget) {
24794056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_TEXTURE_1D_EXT:
24804056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      texObj = texUnit->CurrentTex[TEXTURE_1D_INDEX];
24814056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      break;
24824056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_TEXTURE_2D_EXT:
24834056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      texObj = texUnit->CurrentTex[TEXTURE_2D_INDEX];
24844056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      break;
24854056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   case GLX_TEXTURE_RECTANGLE_EXT:
24864056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      texObj = texUnit->CurrentTex[TEXTURE_RECT_INDEX];
24874056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      break;
24884056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   default:
24894056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      return; /* BadMatch error */
24904056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   }
24914056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl#endif
24924056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl
24934056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   /*
24944056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl    * The following is a quick and simple way to implement
24954056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl    * BindTexImage.  The better way is to write some new FetchTexel()
24964056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl    * functions which would extract texels from XImages.  We'd still
24974056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl    * need to use GetImage when texturing from a Pixmap (front buffer)
24988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    * but texturing from a back buffer (XImage) would avoid an image
24991dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl    * copy.
25001dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl    */
25011dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl
25021dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   /* get XImage */
25031dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   if (xrb->pixmap) {
25041dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl      img = XMesaGetImage(dpy, xrb->pixmap, 0, 0, rb->Width, rb->Height, ~0L,
25051dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl			  ZPixmap);
25061dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl      freeImg = GL_TRUE;
25071dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   }
25081dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl   else if (xrb->ximage) {
25091dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl      img = xrb->ximage;
2510083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   }
2511a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl
2512a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl   /* store the XImage as a new texture image */
2513f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl   if (img) {
25141476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl      GLenum format, type, intFormat;
2515083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      if (img->bits_per_pixel == 32) {
2516a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         format = GL_BGRA;
25173397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl         type = GL_UNSIGNED_BYTE;
2518a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         intFormat = GL_RGBA;
2519a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      }
2520a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      else if (img->bits_per_pixel == 24) {
2521a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         format = GL_BGR;
2522a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         type = GL_UNSIGNED_BYTE;
2523a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         intFormat = GL_RGB;
2524a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      }
2525a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      else if (img->bits_per_pixel == 16) {
2526a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         format = GL_BGR;
25278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         type = GL_UNSIGNED_SHORT_5_6_5;
2528a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         intFormat = GL_RGB;
2529083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      }
2530083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      else {
25318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         _mesa_problem(NULL, "Unexpected XImage format in XMesaBindTexImage");
2532083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl         return;
2533083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      }
2534083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGBA_EXT) {
25358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         intFormat = GL_RGBA;
2536083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      }
253749b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis      else if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGB_EXT) {
253849b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis         intFormat = GL_RGB;
25398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      }
2540083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl
25414056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      _mesa_TexImage2D(GL_TEXTURE_2D, 0, intFormat, rb->Width, rb->Height, 0,
25424056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl                       format, type, img->data);
25438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
25444056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl      if (freeImg) {
25454056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl	 XMesaDestroyImage(img);
2546083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl      }
2547083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl   }
25488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
2549083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl
2550083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl
2551083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl
2552083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian RedlPUBLIC void
25538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlXMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer)
2554083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl{
25554056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   const GLint b = xbuffer_to_renderbuffer(buffer);
25564056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   if (b < 0)
25578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      return;
25584056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl
25594056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl   /* no-op for now */
25604056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl}
25618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
25624056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl