xm_api.c revision 4fb995084e1b4b629667f09331adf060aa0fac4c
1693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa 3-D graphics library
353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul * Version:  6.3
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
5f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
8693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * copy of this software and associated documentation files (the "Software"),
9693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * to deal in the Software without restriction, including without limitation
10693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
12693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The above copyright notice and this permission notice shall be included
15693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
24693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
25693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
26693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * This file contains the implementations of all the XMesa* functions.
27693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
28693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
29693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * NOTES:
30693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
31693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The window coordinate system origin (0,0) is in the lower-left corner
32693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * of the window.  X11's window coordinate origin is in the upper-left
33693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * corner of the window.  Therefore, most drawing functions in this
34693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * file have to flip Y coordinates.
35693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
36693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
37693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in support for the MIT Shared Memory extension.  If enabled, when you
38693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * use an Ximage for the back buffer in double buffered mode, the "swap"
39693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * operation will be faster.  You must also link with -lXext.
40693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
41693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Byte swapping:  If the Mesa host and the X display use a different
42693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * byte order then there's some trickiness to be aware of when using
43693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XImages.  The byte ordering used for the XImage is that of the X
44693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * display, not the Mesa host.
45693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The color-to-pixel encoding for True/DirectColor must be done
46693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * according to the display's visual red_mask, green_mask, and blue_mask.
47693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
48693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * do byte swapping if needed.  If one wants to directly "poke" the pixel
49693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * into the XImage's buffer then the pixel must be byte swapped first.  In
50693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
51693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and use XPutPixel everywhere except in the implementation of
52693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
53693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * instead of using XPutPixel we "poke" our values after byte-swapping
54693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the clear pixel value if needed.
55693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
56693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
57693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
58693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef __CYGWIN__
59693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef WIN32
60693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef __WIN32__
61693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
62693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
63693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glxheader.h"
64693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "GL/xmesa.h"
65693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "xmesaP.h"
66693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "context.h"
67693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "extensions.h"
68e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "framebuffer.h"
69693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glthread.h"
709a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h"
71693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "matrix.h"
725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
73a4575499679d9d91055a35c7673b81872ec127cbJouk Jansen#include "macros.h"
74e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "renderbuffer.h"
75e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul#include "texformat.h"
761e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul#include "texobj.h"
77e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul#include "texstore.h"
78724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/swrast.h"
79ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell#include "swrast_setup/swrast_setup.h"
80cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "array_cache/acache.h"
8123caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "tnl/tnl.h"
82d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_context.h"
83d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_pipeline.h"
84d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h"
85d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
86304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#ifdef XFree86Server
87304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#include <GL/glxtokens.h>
88693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
89693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
90693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
91693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Global X driver lock
92693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
93693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul_glthread_Mutex _xmesa_lock;
94693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
95693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
96693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
97693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
98693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Lookup tables for HPCR pixel format:
99693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic short hpcr_rgbTbl[3][256] = {
101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul},
119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul},
137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 40,  40,  41,  41,  42,  42,  43,  43,  44,  44,  45,  45,  46,  46,  47,  47,
140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  86,  86,  87,  87,
145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
1545e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen}
155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul};
156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                     X Utility Functions                    *****/
161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the host's byte order as LSBFirst or MSBFirst ala X.
166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int host_byte_order( void )
169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i = 1;
171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *cptr = (char *) &i;
172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return (*cptr==1) ? LSBFirst : MSBFirst;
173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Error handling.
179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
181b1ca87a565033a767042120288b2c45723cf79ccAlan Hourihanestatic volatile int mesaXErrorFlag = 0;
182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event )
184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) event;
187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mesaXErrorFlag = 1;
188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Check if the X Shared Memory extension is available.
195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  0 = not available
196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          1 = shared XImage support available
197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          2 = shared Pixmap support available also
198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int check_for_xshm( XMesaDisplay *display )
201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM
203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int major, minor, ignore;
204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Bool pixmaps;
205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return (pixmaps==True) ? 2 : 1;
209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return 0;
212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Can't compile XSHM support */
219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Apply gamma correction to an intensity value in [0..max].  Return the
227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * new intensity value.
228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLint gamma_adjust( GLfloat gamma, GLint value, GLint max )
230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma == 1.0) {
232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return value;
233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double x = (double) value / (double) max;
236367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma));
237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the true number of bits per pixel for XImages.
244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * For example, if we request a 24-bit deep visual we may actually need/get
245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 32bpp XImages.  This function returns the appropriate bpp.
246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the X display
247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - desribes the visual to be used for XImages
248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  true number of bits per pixel for XImages
249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv )
253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
254304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   const int depth = xmv->nplanes;
255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (screenInfo.formats[i].depth == depth)
258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return screenInfo.formats[i].bitsPerPixel;
259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return depth;  /* should never get here, but this should be safe */
261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv )
266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDisplay *dpy = xmv->display;
268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaImage *img;
270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bitsPerPixel;
271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Create a temporary XImage */
272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       ZPixmap, 0,           /*format, offset*/
274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       (char*) MALLOC(8),    /*data*/
275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       1, 1,                 /*width, height*/
276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       32,                   /*bitmap_pad*/
277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       0                     /*bytes_per_line*/
278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     );
279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(img);
280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* grab the bits/pixel value */
281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bitsPerPixel = img->bits_per_pixel;
282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* free the XImage */
283e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free( img->data );
284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img->data = NULL;
285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDestroyImage( img );
286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bitsPerPixel;
287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Determine if a given X window ID is valid (window exists).
294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this by calling XGetWindowAttributes() for the window and
295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * checking if we catch an X error.
296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the display
297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         win - the window to check for existance
298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE - window exists
299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE - window doesn't exist
300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean WindowExistsFlag;
303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (xerr->error_code == BadWindow) {
308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      WindowExistsFlag = GL_FALSE;
309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes wa;
316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   WindowExistsFlag = GL_TRUE;
318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler(window_exists_err_handler);
319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSetErrorHandler(old_handler);
321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return WindowExistsFlag;
322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                Linked list of XMesaBuffers                 *****/
329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer XMesaBufferList = NULL;
332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
3348d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul/**
3358d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul * Allocate a new XMesaBuffer, initialize basic fields and add to
3368d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul * the list of all buffers.
3378d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul */
3388d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paulstatic XMesaBuffer
3398d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paulalloc_xmesa_buffer(XMesaVisual vis, BufferType type, XMesaColormap cmap)
340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b) {
3438d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      b->display = vis->display;
3448d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      b->xm_visual = vis;
3458d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      b->type = type;
3468d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      b->cmap = cmap;
3478d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
348e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_initialize_framebuffer(&b->mesa_buffer, &vis->mesa_visual);
3498d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
3508d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      /* determine back buffer implementation */
3518d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      if (vis->mesa_visual.doubleBufferMode) {
3528d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul         if (vis->ximage_flag) {
3538d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul            b->db_state = BACK_XIMAGE;
3548d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul         }
3558d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul         else {
3568d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul            b->db_state = BACK_PIXMAP;
3578d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul         }
3588d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      }
3598d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      else {
3608d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul         b->db_state = 0;
3618d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      }
3628d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
363e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Allocate the framebuffer's renderbuffers */
364e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      assert(!b->mesa_buffer.Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
365e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      assert(!b->mesa_buffer.Attachment[BUFFER_BACK_LEFT].Renderbuffer);
366e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
367e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* front renderbuffer */
368e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->frontxrb = xmesa_new_renderbuffer(NULL, 0, vis->mesa_visual.rgbMode);
369e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT,
370e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                             &b->frontxrb->Base);
371e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
372e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* back renderbuffer */
373e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (vis->mesa_visual.doubleBufferMode) {
374e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         b->backxrb =xmesa_new_renderbuffer(NULL, 0, vis->mesa_visual.rgbMode);
375e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT,
376e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                &b->backxrb->Base);
377e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
378e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
379e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_soft_renderbuffers(&b->mesa_buffer,
380e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE,  /* color */
381e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   vis->mesa_visual.haveDepthBuffer,
382e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   vis->mesa_visual.haveStencilBuffer,
383e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   vis->mesa_visual.haveAccumBuffer,
384e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   vis->mesa_visual.alphaBits > 0,
385e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   vis->mesa_visual.numAuxBuffers > 0 );
386e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
3878d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      /* insert into linked list */
388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->Next = XMesaBufferList;
389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBufferList = b;
390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Find an XMesaBuffer by matching X display and colormap but NOT matching
397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the notThis buffer.
398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer find_xmesa_buffer(XMesaDisplay *dpy,
400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                     XMesaColormap cmap,
401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                     XMesaBuffer notThis)
402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Free an XMesaBuffer, remove from linked list, perhaps free X colormap
415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * entries.
416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void free_xmesa_buffer(int client, XMesaBuffer buffer)
418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer prev = NULL, b;
420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b==buffer) {
423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* unlink bufer from list */
424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (prev)
425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            prev->Next = buffer->Next;
426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaBufferList = buffer->Next;
428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Check to free X colors */
429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (buffer->num_alloced>0) {
430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* If no other buffer uses this X colormap then free the colors. */
431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!find_xmesa_buffer(buffer->display, buffer->cmap, buffer)) {
432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               (void)FreeColors(buffer->cmap, client,
434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				buffer->num_alloced, buffer->alloced_colors,
435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				0);
436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               XFreeColors(buffer->display, buffer->cmap,
438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                           buffer->alloced_colors, buffer->num_alloced, 0);
439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
4421832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
4431832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul         _mesa_free_framebuffer_data(&buffer->mesa_buffer);
444e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_free(buffer);
4451832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return;
447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* continue search */
449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prev = b;
450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* buffer not found in XMesaBufferList */
45208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul   _mesa_problem(NULL,"free_xmesa_buffer() - buffer not found\n");
453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Copy X color table stuff from one XMesaBuffer to another. */
457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void copy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   dst->num_alloced = src->num_alloced;
464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->alloced_colors, src->alloced_colors,
465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          sizeof(src->alloced_colors));
466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                   Misc Private Functions                   *****/
472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return number of bits set in n.
477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bitcount( unsigned long n )
479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bits;
481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (bits=0; n>0; n=n>>1) {
482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (n&1) {
483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bits++;
484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bits;
487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
491e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Allocate a shared memory XImage back buffer for the given XMesaBuffer.
493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE if success, GL_FALSE if error
494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
496e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic GLboolean
497e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulalloc_shm_back_buffer(XMesaBuffer b, GLuint width, GLuint height)
498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM
500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * We have to do a _lot_ of error checking here to be sure we can
502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * really use the XSHM extension.  It seems different servers trigger
503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * errors at different points if the extension won't work.  Therefore
504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to be very careful...
505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GC gc;
507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay *, XErrorEvent * );
508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
509e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (width == 0 || height == 0) {
51029926a11b16ec7a235947d95e9a46777605dd30eBrian Paul      /* this will be true the first time we're called on 'b' */
51129926a11b16ec7a235947d95e9a46777605dd30eBrian Paul      return GL_FALSE;
51229926a11b16ec7a235947d95e9a46777605dd30eBrian Paul   }
51329926a11b16ec7a235947d95e9a46777605dd30eBrian Paul
514e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   b->backxrb->ximage = XShmCreateImage(b->xm_visual->display,
515e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        b->xm_visual->visinfo->visual,
516e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        b->xm_visual->visinfo->depth,
517e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        ZPixmap, NULL, &b->shminfo,
518e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                        width, height);
519e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (b->backxrb->ximage == NULL) {
5202ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (XShmCreateImage), disabling.");
521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
525e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   b->shminfo.shmid = shmget( IPC_PRIVATE, b->backxrb->ximage->bytes_per_line
526e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			     * b->backxrb->ximage->height, IPC_CREAT|0777 );
527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->shminfo.shmid < 0) {
5282ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "shmget failed while allocating back buffer");
529e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      XDestroyImage( b->backxrb->ximage );
530e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->backxrb->ximage = NULL;
5312ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (shmget), disabling.");
532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
536e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   b->shminfo.shmaddr = b->backxrb->ximage->data
537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      = (char*)shmat( b->shminfo.shmid, 0, 0 );
538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->shminfo.shmaddr == (char *) -1) {
5392ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "shmat() failed while allocating back buffer");
540e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      XDestroyImage( b->backxrb->ximage );
541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
542e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->backxrb->ximage = NULL;
5432ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (shmat), disabling.");
544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.readOnly = False;
549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mesaXErrorFlag = 0;
550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler( mesaHandleXError );
551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* This may trigger the X protocol error we're ready to catch: */
552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XShmAttach( b->xm_visual->display, &b->shminfo );
553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (mesaXErrorFlag) {
556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* we are on a remote display, this error is normal, don't print it */
557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XFlush( b->xm_visual->display );
558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      mesaXErrorFlag = 0;
559e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      XDestroyImage( b->backxrb->ximage );
560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmdt( b->shminfo.shmaddr );
561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
562e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->backxrb->ximage = NULL;
563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      (void) XSetErrorHandler( old_handler );
565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   shmctl( b->shminfo.shmid, IPC_RMID, 0 ); /* nobody else needs it */
569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Finally, try an XShmPutImage to be really sure the extension works */
571e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   gc = XCreateGC( b->xm_visual->display, b->frontxrb->pixmap, 0, NULL );
572e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   XShmPutImage( b->xm_visual->display, b->frontxrb->pixmap, gc,
573e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		 b->backxrb->ximage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False );
574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XFreeGC( b->xm_visual->display, gc );
576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) XSetErrorHandler( old_handler );
577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (mesaXErrorFlag) {
578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XFlush( b->xm_visual->display );
579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      mesaXErrorFlag = 0;
580e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      XDestroyImage( b->backxrb->ximage );
581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmdt( b->shminfo.shmaddr );
582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
583e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->backxrb->ximage = NULL;
584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Can't compile XSHM support */
591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup an off-screen pixmap or Ximage to use as the back buffer.
600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the X/Mesa buffer
601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
602e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulvoid
603e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulxmesa_alloc_back_buffer( XMesaBuffer b, GLuint width, GLuint height )
604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
605e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (width == 0 || height == 0)
606e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      return;
607e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
608e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (b->db_state == BACK_XIMAGE) {
609e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Deallocate the old backxrb->ximage, if any */
610e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (b->backxrb->ximage) {
611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XShmDetach( b->xm_visual->display, &b->shminfo );
614e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	    XDestroyImage( b->backxrb->ximage );
615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    shmdt( b->shminfo.shmaddr );
616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
619e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	   XMesaDestroyImage( b->backxrb->ximage );
620e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	 b->backxrb->ximage = NULL;
621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Allocate new back buffer */
624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Allocate a regular XImage for the back buffer. */
627e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	 b->backxrb->ximage = XMesaCreateImage(b->xm_visual->BitsPerPixel,
628e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul					 width, height, NULL);
629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
630e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (b->shm == 0 || !alloc_shm_back_buffer(b, width, height)) {
631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Allocate a regular XImage for the back buffer. */
632e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	 b->backxrb->ximage = XCreateImage( b->xm_visual->display,
633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      b->xm_visual->visinfo->visual,
634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      GET_VISUAL_DEPTH(b->xm_visual),
635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      ZPixmap, 0,   /* format, offset */
63629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul				      NULL,
637e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                      width, height,
638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      8, 0 );  /* pad, bytes_per_line */
639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
640e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	 if (!b->backxrb->ximage) {
6412ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul	    _mesa_warning(NULL, "alloc_back_buffer: XCreateImage failed.");
642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
643e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         b->backxrb->ximage->data = (char *) MALLOC( b->backxrb->ximage->height
644e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                             * b->backxrb->ximage->bytes_per_line );
645e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if (!b->backxrb->ximage->data) {
6462ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL, "alloc_back_buffer: MALLOC failed.");
647e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            XMesaDestroyImage( b->backxrb->ximage );
648e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            b->backxrb->ximage = NULL;
649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
651e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->backxrb->pixmap = None;
652e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->backxrb->ximage = b->backxrb->ximage;
653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (b->db_state==BACK_PIXMAP) {
6558d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      if (!width)
6568d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul         width = 1;
6578d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      if (!height)
6588d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul         height = 1;
6598d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Free the old back pixmap */
661e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (b->backxrb->pixmap) {
662e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	 XMesaFreePixmap( b->xm_visual->display, b->backxrb->pixmap );
663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Allocate new back pixmap */
665e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->backxrb->pixmap = XMesaCreatePixmap( b->xm_visual->display, b->frontxrb->pixmap,
6668d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul					 width, height,
667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 GET_VISUAL_DEPTH(b->xm_visual) );
668e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->backxrb->ximage = NULL;
669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
670693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
671693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
672693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * A replacement for XAllocColor.  This function should never
676693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * fail to allocate a color.  When XAllocColor fails, we return
677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the nearest matching color.  If we have to allocate many colors
678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this function isn't too efficient; the XQueryColors() could be
679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * done just once.
680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Written by Michael Pichler, Brian Paul, Mark Kilgard
681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - X display
682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - X colormap
683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmapSize - size of colormap
684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In/Out: color - the XColor struct
685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  exact - 1=exact color match, 0=closest match
686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          alloced - 1=XAlloc worked, 0=XAlloc failed
687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void
689693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulnoFaultXAllocColor( int client,
690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaDisplay *dpy,
691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColormap cmap,
692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int cmapSize,
693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColor *color,
694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int *exact, int *alloced )
695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Pixel *ppixIn;
698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   xrgb *ctable;
699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* we'll try to cache ctable for better remote display performance */
701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static Display *prevDisplay = NULL;
702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColormap prevCmap = 0;
703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static int prevCmapSize = 0;
704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColor *ctable = NULL;
705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaColor subColor;
707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i, bestmatch;
708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double mindist;       /* 3*2^16^2 exceeds long int precision. */
709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* First try just using XAllocColor. */
713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->red, &color->green, &color->blue,
716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->pixel,
717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, color)) {
720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *exact = 1;
722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return;
724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Alloc failed, search for closest match */
727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Retrieve color table entries. */
729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* XXX alloca candidate. */
730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ppixIn[i] = i;
735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   QueryColors(cmap, cmapSize, ppixIn, ctable);
737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (prevDisplay != dpy || prevCmap != cmap
739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       || prevCmapSize != cmapSize || !ctable) {
740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* free previously cached color table */
741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctable)
742e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_free(ctable);
743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Get the color table from X */
744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(ctable);
746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i = 0; i < cmapSize; i++) {
747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         ctable[i].pixel = i;
748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XQueryColors(dpy, cmap, ctable, cmapSize);
750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevDisplay = dpy;
751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmap = cmap;
752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmapSize = cmapSize;
753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Find best match. */
757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bestmatch = -1;
758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mindist = 0.0;
759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dist = dr * dr + dg * dg + db * db;
764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (bestmatch < 0 || dist < mindist) {
765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bestmatch = i;
766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         mindist = dist;
767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Return result. */
771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.red   = ctable[bestmatch].red;
772693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.green = ctable[bestmatch].green;
773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.blue  = ctable[bestmatch].blue;
774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Try to allocate the closest match color.  This should only
775693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * fail if the cell is read/write.  Otherwise, we're incrementing
776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the cell's reference count.
777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.red, &subColor.green, &subColor.blue,
781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.pixel,
782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, &subColor)) {
785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* do this to work around a problem reported by Frank Ortega */
790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.pixel = (unsigned long) bestmatch;
791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.red   = ctable[bestmatch].red;
792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.green = ctable[bestmatch].green;
7935e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      subColor.blue  = ctable[bestmatch].blue;
794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.flags = DoRed | DoGreen | DoBlue;
795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 0;
796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
798e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(ppixIn);
799e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(ctable);
800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* don't free table, save it for next time */
802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *color = subColor;
805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *exact = 0;
806693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
807693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
808693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
809693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
810693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
811693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
812693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do setup for PF_GRAYSCALE pixel format.
813693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Note that buffer may be NULL.
814693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
815693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_grayscale( int client, XMesaVisual v,
816693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  XMesaBuffer buffer, XMesaColormap cmap )
817693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
818693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
823693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
824693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
826693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
8311832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
8321832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous XMesaBuffer which uses same
834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate 256 shades of gray */
840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int gray;
841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (gray=0;gray<256;gray++) {
843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            int exact, alloced;
847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaColor xcol;
848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.red   = (r << 8) | r;
849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.green = (g << 8) | g;
850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.blue  = (b << 8) | b;
851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            noFaultXAllocColor( client, v->display,
852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                cmap, GET_COLORMAP_SIZE(v),
853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                &xcol, &exact, &alloced );
854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!exact) {
855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               colorsfailed++;
856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (alloced) {
858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               assert(buffer->num_alloced<256);
859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->num_alloced++;
861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*OLD
864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(gray < 576);
865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+0] = xcol.pixel;
866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+1] = xcol.pixel;
867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+2] = xcol.pixel;
868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            */
873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray] = xcol.pixel;
874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray;
876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray;
877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray;
878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
880367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
8812ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL,
882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of 256 needed colors do not match exactly.\n",
883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  colorsfailed );
884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
888449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = PF_Grayscale;
889449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->undithered_pf = PF_Grayscale;
890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a PseudoColor, StaticColor,
897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * color.  While this function was originally designed just for 8-bit
900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Dithering code contributed by Bob Mercier.
902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_dithered_color( int client, XMesaVisual v,
904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       XMesaBuffer buffer, XMesaColormap cmap )
905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
914693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
915693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
916693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
9191832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
9201832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
921693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous, matching XMesaBuffer.
922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Do this to avoid time spent in noFaultXAllocColor.
923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate X colors and initialize color_table[], red_table[], etc */
928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int r, g, b, i;
929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
930d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul         for (r = 0; r < DITH_R; r++) {
931d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul            for (g = 0; g < DITH_G; g++) {
932d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul               for (b = 0; b < DITH_B; b++) {
933693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  XMesaColor xcol;
934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  int exact, alloced;
935d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(DITH_R-1),65535);
936d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535);
937d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(DITH_B-1),65535);
938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  noFaultXAllocColor( client, v->display,
939693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      cmap, GET_COLORMAP_SIZE(v),
940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      &xcol, &exact, &alloced );
941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (!exact) {
942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     colorsfailed++;
943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (alloced) {
945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     assert(buffer->num_alloced<256);
946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->num_alloced++;
948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
949d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  i = DITH_MIX( r, g, b );
950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(i < 576);
951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->color_table[i] = xcol.pixel;
952693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(xcol.pixel < 65536);
953d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1);
954d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1);
955d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1);
956693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               }
957693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
958693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
959693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
960367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
9612ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL,
962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of %d needed colors do not match exactly.\n",
963d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  colorsfailed, DITH_R * DITH_G * DITH_B );
964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
968449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = PF_Dither;
969449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->undithered_pf = PF_Lookup;
970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
973693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Special dithering tables have to be initialized.
978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_8bit_hpcr( XMesaVisual v )
980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * on the root window AND the colormap obtainable by XGetRGBColormaps
984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * for that atom must be set on the window.  (see also tkInitWindow)
985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If that colormap is not set, the output will look stripy.
986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Setup color tables with gamma correction */
989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double g;
991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
9925e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   g = 1.0 / v->RedGamma;
9935e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   for (i=0; i<256; i++) {
994367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g ));
995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->GreenGamma;
999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
1000367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g ));
1001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
1002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->BlueGamma;
1005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
1006367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g ));
1007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
1008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
1010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_HPCR;
1011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* which method should I use to clear */
1013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_FALSE: keep the ordinary method  */
1014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_TRUE : clear with dither pattern */
1015367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
1016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (v->hpcr_clear_flag) {
1018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
1019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               DefaultRootWindow(v->display),
1020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               16, 2, 8);
1021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
1023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       0, 0, 16, 2, AllPlanes, ZPixmap);
1024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a True/DirectColor visual.
1031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
1033190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                             XMesaColormap cmap )
1034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned long rmask, gmask, bmask;
1036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) buffer;
1037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) cmap;
1038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute red multiplier (mask) and bit shift */
1040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->rshift = 0;
1041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   rmask = GET_REDMASK(v);
1042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((rmask & 1)==0) {
1043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->rshift++;
1044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      rmask = rmask >> 1;
1045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute green multiplier (mask) and bit shift */
1048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->gshift = 0;
1049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gmask = GET_GREENMASK(v);
1050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((gmask & 1)==0) {
1051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->gshift++;
1052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gmask = gmask >> 1;
1053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute blue multiplier (mask) and bit shift */
1056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bshift = 0;
1057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bmask = GET_BLUEMASK(v);
1058693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((bmask & 1)==0) {
1059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->bshift++;
1060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      bmask = bmask >> 1;
1061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Compute component-to-pixel lookup tables and dithering kernel
1065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      static GLubyte kernel[16] = {
1068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          0*16,  8*16,  2*16, 10*16,
1069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         12*16,  4*16, 14*16,  6*16,
1070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          3*16, 11*16,  1*16,  9*16,
1071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         15*16,  7*16, 13*16,  5*16,
1072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      };
1073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint rBits = bitcount(rmask);
1074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint gBits = bitcount(gmask);
1075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint bBits = bitcount(bmask);
10763cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      GLint maxBits;
1077693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLuint i;
1078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
1080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=rmask; i++)
1081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
1082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=gmask; i++)
1083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
1084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=bmask; i++)
1085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
1086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert RGB values from [0,255] to pixel components */
1088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<256;i++) {
1090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint r = gamma_adjust(v->RedGamma,   i, 255);
1091693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint g = gamma_adjust(v->GreenGamma, i, 255);
1092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
1093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
1094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
1095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
1096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* overflow protection */
1098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=256;i<512;i++) {
1099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = v->RtoPixel[255];
1100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = v->GtoPixel[255];
1101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = v->BtoPixel[255];
1102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* setup dithering kernel */
11053cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      maxBits = rBits;
11063cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (gBits > maxBits)  maxBits = gBits;
11073cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (bBits > maxBits)  maxBits = bBits;
1108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<16;i++) {
11093cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul         v->Kernel[i] = kernel[i] >> maxBits;
1110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1112449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->undithered_pf = PF_Truecolor;
1113449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor;
1114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Now check for TrueColor visuals which we can optimize.
1118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (   GET_REDMASK(v)  ==0x0000ff
1120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_GREENMASK(v)==0x00ff00
1121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_BLUEMASK(v) ==0xff0000
1122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
1124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on SGI, Sun */
1127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R;
1128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
1130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
1134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on Linux, HP, IBM */
113741bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      if (GET_VISUAL_DEPTH(v)==32)
113841bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul	  v->undithered_pf = v->dithered_pf = PF_8A8R8G8B;
113941bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      else
114041bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul	  v->undithered_pf = v->dithered_pf = PF_8R8G8B;
1141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
1143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==24
1147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common packed 24 bpp config used on Linux */
1150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8R8G8B24;
1151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xf800
1153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x07e0
1154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x001f
1155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==16
1157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLushort)==2
1158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* 5-6-5 color weight on common PC VGA boards */
1160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = PF_5R6G5B;
1161449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = PF_Dither_5R6G5B;
1162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xe0
1164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x1c
1165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x03
1166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_FOR_HPCR(v)) {
1167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      setup_8bit_hpcr( v );
1168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a monochrome visual.
1175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_monochrome( XMesaVisual v, XMesaBuffer b )
1177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) b;
1179449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = v->undithered_pf = PF_1Bit;
1180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* if black=1 then we must flip pixel values */
1181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
1182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * When a context is "made current" for the first time, we can finally
1188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * finish initializing the context's visual and buffer information.
1189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual to initialize
1190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         b - the XMesaBuffer to initialize (may be NULL)
1191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - TRUE = RGBA mode, FALSE = color index mode
1192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         window - the window/pixmap we're rendering into
1193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - the colormap associated with the window/pixmap
1194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE=success, GL_FALSE=failure
1195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean initialize_visual_and_buffer( int client,
1197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaVisual v,
1198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaBuffer b,
1199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               GLboolean rgb_flag,
1200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaDrawable window,
12013265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                                               XMesaColormap cmap )
1202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1203e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct xmesa_renderbuffer *front_xrb, *back_xrb;
1204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGCValues gcvalues;
1206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b) {
1209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(b->xm_visual == v);
1210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1212e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (b) {
1213e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      front_xrb = b->frontxrb;
1214e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      back_xrb = b->backxrb;
1215e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
1216e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else {
1217e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      front_xrb = back_xrb = NULL;
1218e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
1219e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save true bits/pixel */
1221a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   v->BitsPerPixel = bits_per_pixel(v);
1222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v->BitsPerPixel > 0);
1223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (rgb_flag==GL_FALSE) {
1226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* COLOR-INDEXED WINDOW:
1227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Even if the visual is TrueColor or DirectColor we treat it as
1228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * being color indexed.  This is weird but might be useful to someone.
1229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1230449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = v->undithered_pf = PF_Index;
1231304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v);
1232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* RGB WINDOW:
1235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * We support RGB rendering into almost any kind of visual.
1236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1237304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      const int xclass = v->mesa_visual.visualType;
1238304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      if (xclass==GLX_TRUE_COLOR || xclass==GLX_DIRECT_COLOR) {
1239190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 setup_truecolor( v, b, cmap );
1240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1241304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      else if (xclass==GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v)==1) {
1242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 setup_monochrome( v, b );
1243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1244304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      else if (xclass==GLX_GRAY_SCALE || xclass==GLX_STATIC_GRAY) {
1245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!setup_grayscale( client, v, b, cmap )) {
1246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1249304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      else if ((xclass==GLX_PSEUDO_COLOR || xclass==GLX_STATIC_COLOR)
1250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
1251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!setup_dithered_color( client, v, b, cmap )) {
1252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
12562ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul	 _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.");
1257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return GL_FALSE;
1258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1259304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      v->mesa_visual.indexBits = 0;
1260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1261367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      if (_mesa_getenv("MESA_NO_DITHER")) {
1262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 v->dithered_pf = v->undithered_pf;
1263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If MESA_INFO env var is set print out some debugging info
1269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * which can help Brian figure out what's going on when a user
1270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * reports bugs.
1271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1272367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_INFO")) {
12732ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa visual = %p\n", (void *) v);
12742ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
12752ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
1276304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      _mesa_printf("X/Mesa level = %d\n", v->mesa_visual.level);
12772ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
12782ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
1279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b && window) {
1282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Do window-specific initializations */
1283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1284e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      b->frontxrb->pixmap = window;
1285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Setup for single/double buffering */
12871832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (v->mesa_visual.doubleBufferMode) {
1288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Double buffered */
1289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->shm = check_for_xshm( v->display );
1291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1292e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         xmesa_alloc_back_buffer(b, b->mesa_buffer.Width, b->mesa_buffer.Height);
1293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* X11 graphics contexts */
1296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1297c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = CreateScratchGC(v->display, window->depth);
1298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1299c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = XCreateGC( v->display, window, 0, NULL );
1300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1301c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      XMesaSetFunction( v->display, b->gc, GXcopy );
1302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
13039ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      /* cleargc - for glClear() */
13049ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#ifdef XFree86Server
13059ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = CreateScratchGC(v->display, window->depth);
13069ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#else
13079ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = XCreateGC( v->display, window, 0, NULL );
13089ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#endif
13099ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->cleargc, GXcopy );
13109ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul
1311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
1313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Michael Pichler May 15, 1995.
1314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
13169ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->swapgc = CreateScratchGC(v->display, window->depth);
1317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
1318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  CARD32 v[1];
1319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  v[0] = FALSE;
13209ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul	  dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
1321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gcvalues.graphics_exposures = False;
13249ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->swapgc = XCreateGC( v->display, window,
1325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              GCGraphicsExposures, &gcvalues);
1326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
13279ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->swapgc, GXcopy );
1328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Set fill style and tile pixmap once for all for HPCR stuff
1330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * (instead of doing it each time in clear_color_HPCR_pixmap())
1331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Initialize whole stuff
1332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Jacques Leroy March 8, 1998.
1333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1334e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (v->hpcr_clear_flag && back_xrb->pixmap) {
1335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	int i;
1336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	for (i=0; i<16; i++)
1337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        {
1338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
1339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
1340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        }
1341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        XMesaPutImage(b->display, (XMesaDrawable)v->hpcr_clear_pixmap,
1342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
1343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
1344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
1345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Initialize the row buffer XImage for use in write_color_span() */
1348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1,
1350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (char *)MALLOC(MAX_WIDTH*4));
1351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XCreateImage( v->display,
1353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->visual,
1354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->depth,
1355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  ZPixmap, 0,           /*format, offset*/
1356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  (char*) MALLOC(MAX_WIDTH*4),  /*data*/
1357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  MAX_WIDTH, 1,         /*width, height*/
1358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  32,                   /*bitmap_pad*/
1359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  0                     /*bytes_per_line*/ );
1360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1361ef5c82bd02926ac851537f1382352f8f6af33eceAlan Hourihane      if (!b->rowimage)
1362ef5c82bd02926ac851537f1382352f8f6af33eceAlan Hourihane         return GL_FALSE;
1363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Convert an RGBA color to a pixel value.
1372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long
1374e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulxmesa_color_to_pixel(GLcontext *ctx,
1375e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     GLubyte r, GLubyte g, GLubyte b, GLubyte a,
1376e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     GLuint pixelFormat)
1377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1378e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   XMesaContext xmesa = XMESA_CONTEXT(ctx);
1379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (pixelFormat) {
1380449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Index:
1381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
1382449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Truecolor:
1383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
1386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
1389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
139041bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      case PF_8A8R8G8B:
139141bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul         return PACK_8A8R8G8B( r, g, b, a );
1392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
1393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B24:
1395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
1396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
1397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
1398449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither:
1399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
1401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( 1, 0, r, g, b );
1402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1403449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_1Bit:
1404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
1405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
1407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(1, 1, r, g, b);
1408449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Lookup:
1409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
1411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
1412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1413449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Grayscale:
1414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
1415449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_True:
1416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1417449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_5R6G5B:
1418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, 1, 0, r, g, b);
1421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
1424e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel");
1425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
1427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1430304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#define NUM_VISUAL_TYPES   6
1431304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1432304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick/**
1433304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * Convert an X visual type to a GLX visual type.
1434304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1435304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.)
1436304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *        to be converted.
1437304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \return If \c visualType is a valid X visual type, a GLX visual type will
1438304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *         be returned.  Otherwise \c GLX_NONE will be returned.
1439304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1440304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \note
1441304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the
1442304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * DRI CVS tree.
1443304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick */
1444304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanickstatic GLint
1445304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanickxmesa_convert_from_x_visual_type( int visualType )
1446304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick{
1447304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    static const int glx_visual_types[ NUM_VISUAL_TYPES ] = {
1448304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_STATIC_GRAY,  GLX_GRAY_SCALE,
1449304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
1450304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_TRUE_COLOR,   GLX_DIRECT_COLOR
1451304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    };
1452304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1453304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    return ( (unsigned) visualType < NUM_VISUAL_TYPES )
1454304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	? glx_visual_types[ visualType ] : GLX_NONE;
1455304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick}
1456304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1457304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                       Public Functions                     *****/
1460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new X/Mesa visual.
1465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  display - X11 display
1466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - an XVisualInfo pointer
1467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - GL_TRUE = RGB mode,
1468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                    GL_FALSE = color index mode
1469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         alpha_flag - alpha buffer requested?
1470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         db_flag - GL_TRUE = double-buffered,
1471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                   GL_FALSE = single buffered
1472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stereo_flag - stereo visual?
1473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                       GL_FALSE = use an off-screen pixmap for back buffer
1475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         depth_size - requested bits/depth values, or zero
1476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stencil_size - requested bits/stencil values, or zero
1477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_red_size - requested bits/red accum values, or zero
1478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_green_size - requested bits/green accum values, or zero
1479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_blue_size - requested bits/blue accum values, or zero
1480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_alpha_size - requested bits/alpha accum values, or zero
1481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         num_samples - number of samples/pixel if multisampling, or zero
1482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         level - visual level, usually 0
1483304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *         visualCaveat - ala the GLX extension, usually GLX_NONE
1484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return;  a new XMesaVisual or 0 if error.
1485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1486693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
1487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               XMesaVisualInfo visinfo,
1488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean rgb_flag,
1489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean alpha_flag,
1490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean db_flag,
1491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean stereo_flag,
1492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean ximage_flag,
1493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint depth_size,
1494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint stencil_size,
1495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_red_size,
1496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_green_size,
1497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_blue_size,
1498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_alpha_size,
1499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint num_samples,
1500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint level,
1501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint visualCaveat )
1502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *gamma;
1504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisual v;
1505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint red_bits, green_bits, blue_bits, alpha_bits;
1506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* For debugging only */
1508367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_XSYNC")) {
1509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* This makes debugging X easier.
1510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * In your debugger, set a breakpoint on _XError to stop when an
1511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * X protocol error is generated.
1512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
1515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSynchronize( display, 1 );
1517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!v) {
1522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * In the X server, NULL is passed in for the display.  It will have
1527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * to be set before using this visual.  See XMesaSetVisualDisplay()
1528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * below.
1529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->display = display;
1531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1532e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /* Save a copy of the XVisualInfo struct because the user may X_mesa_free()
1533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the struct but we may need some of the information contained in it
1534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * at a later time.
1535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1536304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#ifndef XFree86Server
1537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if(!v->visinfo) {
1539e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_free(v);
1540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
1543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* check for MESA_GAMMA environment variable */
1546367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   gamma = _mesa_getenv("MESA_GAMMA");
1547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma) {
1548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->ximage_flag = ximage_flag;
1559304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1560304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#ifdef XFree86Server
1561304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   /* We could calculate these values by ourselves.  nplanes is either the sum
1562304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * of the red, green, and blue bits or the number index bits.
1563304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * ColormapEntries is either (1U << index_bits) or
1564304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * (1U << max(redBits, greenBits, blueBits)).
1565304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    */
1566304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->nplanes = visinfo->nplanes;
1567304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->ColormapEntries = visinfo->ColormapEntries;
1568304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1569304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.redMask = visinfo->redMask;
1570304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.greenMask = visinfo->greenMask;
1571304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.blueMask = visinfo->blueMask;
1572304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualID = visinfo->vid;
1573304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.screen = 0; /* FIXME: What should be done here? */
1574304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#else
1575304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.redMask = visinfo->red_mask;
1576304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.greenMask = visinfo->green_mask;
1577304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.blueMask = visinfo->blue_mask;
1578304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualID = visinfo->visualid;
1579304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.screen = visinfo->screen;
1580304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#endif
1581304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1582304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus))
1583304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class);
1584304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#else
1585304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class);
1586304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#endif
1587304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1588304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualRating = visualCaveat;
1589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
1591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1593304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      const int xclass = v->mesa_visual.visualType;
1594304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      if (xclass==GLX_TRUE_COLOR || xclass==GLX_DIRECT_COLOR) {
1595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits   = bitcount(GET_REDMASK(v));
1596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = bitcount(GET_GREENMASK(v));
1597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits  = bitcount(GET_BLUEMASK(v));
1598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* this is an approximation */
1602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int depth;
1603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth = GET_VISUAL_DEPTH(v);
1604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits = depth / 3;
1605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= red_bits;
1606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = depth / 2;
1607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= green_bits;
1608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits = depth;
1609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
1611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (alpha_flag && alpha_bits == 0)
1615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      alpha_bits = 8;
1616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16171832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_visual( &v->mesa_visual,
16181832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            rgb_flag, db_flag, stereo_flag,
16191832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            red_bits, green_bits,
16201832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            blue_bits, alpha_bits,
1621304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick                            v->mesa_visual.indexBits,
16221832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            depth_size,
16231832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            stencil_size,
16241832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_red_size, accum_green_size,
16251832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_blue_size, accum_alpha_size,
16261832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            0 );
1627304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1628894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul   /* XXX minor hack */
1629304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.level = level;
1630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return v;
1631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSetVisualDisplay( XMesaDisplay *dpy, XMesaVisual v )
1635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    v->display = dpy;
1637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyVisual( XMesaVisual v )
1641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1643e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(v->visinfo);
1644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1645e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(v);
1646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1647693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1650d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/**
1651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaContext.
1652d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param v  the XMesaVisual
1653d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param share_list  another XMesaContext with which to share display
1654d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul *                    lists or NULL if no sharing is wanted.
1655d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \return an XMesaContext or NULL if error.
1656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
16577a1f3a37a10b162b067239dafa19fc6865a41f14Keith WhitwellXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
16599a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul   static GLboolean firstTime = GL_TRUE;
1660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaContext c;
16611e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   GLcontext *mesaCtx;
1662d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
1663d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   TNLcontext *tnl;
1664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (firstTime) {
1666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _glthread_INIT_MUTEX(_xmesa_lock);
1667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      firstTime = GL_FALSE;
1668693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1670d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */
1671693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1672d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   if (!c)
1673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16751e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   mesaCtx = &(c->mesa);
16761e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul
1677d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* initialize with default driver functions, then plug in XMesa funcs */
1678d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   _mesa_init_driver_functions(&functions);
1679d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   xmesa_init_driver_functions(v, &functions);
16801e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual,
16811e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul                      share_list ? &(share_list->mesa) : (GLcontext *) NULL,
1682d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                      &functions, (void *) c)) {
1683e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_free(c);
1684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16871e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_sw_extensions(mesaCtx);
16881e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_1_3_extensions(mesaCtx);
16891e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_1_4_extensions(mesaCtx);
169084351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul   _mesa_enable_1_5_extensions(mesaCtx);
169153f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   _mesa_enable_2_0_extensions(mesaCtx);
16924fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#if ENABLE_EXT_texure_compression_s3tc
16933c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca    if (c->Mesa_DXTn) {
16943c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca       _mesa_enable_extension(c, "GL_EXT_texture_compression_s3tc");
16953c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca       _mesa_enable_extension(c, "GL_S3_s3tc");
16963c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca    }
16973c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca    _mesa_enable_extension(c, "GL_3DFX_texture_compression_FXT1");
16983c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca#endif
16994fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#if ENABLE_EXT_timer_query
17004fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul    _mesa_enable_extension(c, "GL_EXT_timer_query");
17014fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#endif
1702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1703d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* finish up xmesa context initializations */
1704d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE;
1705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_visual = v;
1706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->display = v->display;
1708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1710ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   /* Initialize the software rasterizer and helper modules.
1711ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell    */
1712c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul   if (!_swrast_CreateContext( mesaCtx ) ||
1713c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul       !_ac_CreateContext( mesaCtx ) ||
1714c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul       !_tnl_CreateContext( mesaCtx ) ||
1715c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul       !_swsetup_CreateContext( mesaCtx )) {
1716c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul      _mesa_free_context_data(&c->mesa);
1717c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul      _mesa_free(c);
1718c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul      return NULL;
1719c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul   }
1720ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1721d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* tnl setup */
1722d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   tnl = TNL_CONTEXT(mesaCtx);
1723d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   tnl->Driver.RunPipeline = _tnl_run_pipeline;
1724d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* swrast setup */
17251e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   xmesa_register_swrast_functions( mesaCtx );
1726d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   _swsetup_Wakeup(mesaCtx);
1727709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
17287a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   return c;
1729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyContext( XMesaContext c )
1734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
17351e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   GLcontext *mesaCtx = &c->mesa;
1736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1737e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   XMesaBuffer xmbuf = XMESA_BUFFER(mesaCtx->DrawBuffer);
1738e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1739e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (xmbuf && xmbuf->FXctx)
1740e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      fxMesaDestroyContext(xmbuf->FXctx);
1741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
17421e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swsetup_DestroyContext( mesaCtx );
17431e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swrast_DestroyContext( mesaCtx );
17441e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _tnl_DestroyContext( mesaCtx );
17451e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _ac_DestroyContext( mesaCtx );
17460983163fde91f1026146903155fd414725a79879Brian Paul   _mesa_free_context_data( mesaCtx );
17470983163fde91f1026146903155fd414725a79879Brian Paul   _mesa_free( c );
1748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XXX this isn't a public function!  It's a hack for the 3Dfx driver.
1754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X window.
1755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual
1756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         w - the window
1757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         c - the context
1758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  new XMesaBuffer or NULL if error
1759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
17608d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
17618d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreateWindowBuffer2(XMesaVisual v, XMesaWindow w, XMesaContext c)
1762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes attr;
1765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *fxEnvVar;
1768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
17708d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
17718d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaColormap cmap;
1772693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17738d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   assert(v);
1774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
1775693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17768d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   /* Check that window depth matches visual depth */
1777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)w)->id);
1779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17807a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) {
1781a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
1782a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul                    GET_VISUAL_DEPTH(v), ((XMesaDrawable) w)->depth);
17836e776f25fd4d275722494824e2d5149a25ed4036Ian Romanick      return NULL;
17846e776f25fd4d275722494824e2d5149a25ed4036Ian Romanick   }
1785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
17867a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   XGetWindowAttributes( v->display, w, &attr );
17877a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell
17887a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (GET_VISUAL_DEPTH(v) != attr.depth) {
1789a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
1790a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul                    GET_VISUAL_DEPTH(v), attr.depth);
1791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
17936e776f25fd4d275722494824e2d5149a25ed4036Ian Romanick#endif
1794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17958d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   /* Find colormap */
1796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
17978d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (attr.colormap) {
18008d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      cmap = attr.colormap;
1801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
18032ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
1804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* this is weird, a window w/out a colormap!? */
1805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* OK, let's just allocate a new one and hope for the best */
18068d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1807693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1808693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1809693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18108d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   b = alloc_xmesa_buffer(v, WINDOW, cmap);
18118d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   if (!b) {
18128d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      return NULL;
1813693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1814693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18151832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
18168d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul                                      (XMesaDrawable)w, cmap )) {
1817693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1818693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1822367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   fxEnvVar = _mesa_getenv("MESA_GLX_FX");
1823693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fxEnvVar) {
18247a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell     if (fxEnvVar[0]!='d') {
18257a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int attribs[100];
18267a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int numAttribs = 0;
18277a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int hw;
18281832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.depthBits > 0) {
18297a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
1830fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca	 attribs[numAttribs++] = v->mesa_visual.depthBits;
18317a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18321832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.doubleBufferMode) {
18337a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
18347a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18351832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.accumRedBits > 0) {
18367a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_ACCUM_SIZE;
18371832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul	 attribs[numAttribs++] = v->mesa_visual.accumRedBits;
18387a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18391832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.stencilBits > 0) {
18407a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_STENCIL_SIZE;
18411832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul         attribs[numAttribs++] = v->mesa_visual.stencilBits;
18427a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18431832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.alphaBits > 0) {
18447a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
1845fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca         attribs[numAttribs++] = v->mesa_visual.alphaBits;
18467a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18471e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul       if (1) {
18487a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
18491e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul         attribs[numAttribs++] = (int) &(c->mesa);
18507a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18517a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       attribs[numAttribs++] = FXMESA_NONE;
18527a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell
1853fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca       /* [dBorca] we should take an envvar for `fxMesaSelectCurrentBoard'!!! */
1854fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca       hw = fxMesaSelectCurrentBoard(0);
185529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul
185629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul       /* if these fail, there's a new bug somewhere */
185729926a11b16ec7a235947d95e9a46777605dd30eBrian Paul       ASSERT(b->mesa_buffer.Width > 0);
185829926a11b16ec7a235947d95e9a46777605dd30eBrian Paul       ASSERT(b->mesa_buffer.Height > 0);
185929926a11b16ec7a235947d95e9a46777605dd30eBrian Paul
1860fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca       if ((hw == GR_SSTTYPE_VOODOO) || (hw == GR_SSTTYPE_Voodoo2)) {
186129926a11b16ec7a235947d95e9a46777605dd30eBrian Paul         b->FXctx = fxMesaCreateBestContext(0, b->mesa_buffer.Width,
186229926a11b16ec7a235947d95e9a46777605dd30eBrian Paul                                            b->mesa_buffer.Height, attribs);
1863e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if ((v->undithered_pf!=PF_Index) && (b->backxrb->ximage)) {
18647a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
1865fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	   if (b->FXctx && (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')) {
1866fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	     b->FXwindowHack = GL_TRUE;
1867fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	     FX_grSstControl(GR_CONTROL_DEACTIVATE);
1868fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	   }
1869fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca           else {
18707a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	     b->FXwindowHack = GL_FALSE;
1871fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	   }
18727a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         }
18737a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
1874e9e98405e720845f06f7a375585491e938f4dacdDaniel Borca       else {
18757a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
18767a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE,
18777a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell					  GR_REFRESH_75Hz, attribs);
18787a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         else
187929926a11b16ec7a235947d95e9a46777605dd30eBrian Paul	   b->FXctx = fxMesaCreateBestContext(0, b->mesa_buffer.Width,
188029926a11b16ec7a235947d95e9a46777605dd30eBrian Paul                                              b->mesa_buffer.Height, attribs);
18817a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXisHackUsable = GL_FALSE;
18827a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXwindowHack = GL_FALSE;
18837a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18847a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       /*
18857a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       fprintf(stderr,
18867a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell               "voodoo %d, wid %d height %d hack: usable %d active %d\n",
1887c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca               hw, b->mesa_buffer.Width, b->mesa_buffer.Height,
1888c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca	       b->FXisHackUsable, b->FXwindowHack);
18897a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       */
18907a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell     }
1891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
18932ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "WARNING: This Mesa Library includes the Glide driver but\n");
18942ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         you have not defined the MESA_GLX_FX env. var.\n");
18952ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         (check the README.3DFX file for more information).\n\n");
18962ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
1897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
19048d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
19058d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w)
1906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaCreateWindowBuffer2( v, w, NULL );
1908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1911304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick/**
1912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X pixmap.
1913304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1914304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param v    the XMesaVisual
1915304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param p    the pixmap
1916304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or
1917304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *             \c GLX_DIRECT_COLOR visual for the pixmap
1918304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \returns new XMesaBuffer or NULL if error
1919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
19208d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
19218d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap)
1922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
19248d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
19258d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
19268d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   assert(v);
19278d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
19288d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   b = alloc_xmesa_buffer(v, PIXMAP, cmap);
1929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b) {
1930693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1932693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1933693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)p)->id);
1935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
19371832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (XMesaDrawable)p, cmap)) {
1939693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
19488d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
19498d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
19508d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul                   unsigned int width, unsigned int height)
1951190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul{
1952f2c5296dd7c990f566187621835414c3015058a1Brian Paul#ifdef XFree86Server
1953f2c5296dd7c990f566187621835414c3015058a1Brian Paul   return 0;
1954f2c5296dd7c990f566187621835414c3015058a1Brian Paul#else
1955190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   int client = 0;
1956e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaWindow root;
1957e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaDrawable drawable;  /* X Pixmap Drawable */
19588d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
19598d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
19608d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   b = alloc_xmesa_buffer(v, PBUFFER, cmap);
1961190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (!b) {
1962190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      return NULL;
1963190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1964190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1965e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* allocate pixmap for front buffer */
1966e4656003caee346d9c4eb23256d73409271291a7Brian Paul   root = RootWindow( v->display, v->visinfo->screen );
1967e4656003caee346d9c4eb23256d73409271291a7Brian Paul   drawable = XCreatePixmap( v->display, root, width, height, v->visinfo->depth );
1968e4656003caee346d9c4eb23256d73409271291a7Brian Paul
1969190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1970e4656003caee346d9c4eb23256d73409271291a7Brian Paul				     drawable, cmap)) {
1971190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      free_xmesa_buffer(client, b);
1972190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      return NULL;
1973190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1974190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1975190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   return b;
1976f2c5296dd7c990f566187621835414c3015058a1Brian Paul#endif
1977190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul}
1978190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1979190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1980190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate an XMesaBuffer structure and all related info.
1983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyBuffer( XMesaBuffer b )
1985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1989e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (b->frontxrb->pixmap)
1990e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul       client = CLIENT_ID(b->frontxrb->pixmap->id);
1991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1993c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   if (b->gc)  XMesaFreeGC( b->xm_visual->display, b->gc );
1994693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->cleargc)  XMesaFreeGC( b->xm_visual->display, b->cleargc );
19959ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul   if (b->swapgc)  XMesaFreeGC( b->xm_visual->display, b->swapgc );
1996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1997a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul   if (b->xm_visual->mesa_visual.doubleBufferMode)
1998a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul   {
1999a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul       if (b->backxrb->ximage) {
2000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2001a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	   if (b->shm) {
2002a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	       XShmDetach( b->xm_visual->display, &b->shminfo );
2003a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	       XDestroyImage( b->backxrb->ximage );
2004a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	       shmdt( b->shminfo.shmaddr );
2005a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	   }
2006a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	   else
2007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2008a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	       XMesaDestroyImage( b->backxrb->ximage );
2009a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul       }
2010a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul       if (b->backxrb->pixmap) {
2011a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	   XMesaFreePixmap( b->xm_visual->display, b->backxrb->pixmap );
2012a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	   if (b->xm_visual->hpcr_clear_flag) {
2013a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	       XMesaFreePixmap( b->xm_visual->display,
2014a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul				b->xm_visual->hpcr_clear_pixmap );
2015a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	       XMesaDestroyImage( b->xm_visual->hpcr_clear_ximage );
2016a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul	   }
2017a0b5c983645e672b6c86d2bd52764ad58fda5d70Brian Paul       }
2018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->rowimage) {
2020e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_free( b->rowimage->data );
2021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage->data = NULL;
2022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaDestroyImage( b->rowimage );
2023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   free_xmesa_buffer(client, b);
2026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
2032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2033693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
2034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaMakeCurrent2( c, b, b );
2036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
2041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2042693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
2043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                             XMesaBuffer readBuffer )
2044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
2046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!drawBuffer || !readBuffer)
2047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;  /* must specify buffers! */
2048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (drawBuffer->FXctx) {
2051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaMakeCurrent(drawBuffer->FXctx);
2052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20533b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul         c->xm_buffer = drawBuffer;
2054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
2056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
20581e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (&(c->mesa) == _mesa_get_current_context()
2059e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer
2060e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          && c->mesa.ReadBuffer == &readBuffer->mesa_buffer
2061e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          && ((XMesaBuffer) c->mesa.DrawBuffer)->wasCurrent) {
2062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* same context and buffer, do nothing */
2063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
2064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20663b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_buffer = drawBuffer;
2067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2068e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current(&(c->mesa),
2069e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                         &drawBuffer->mesa_buffer,
2070e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                         &readBuffer->mesa_buffer);
2071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20721832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (c->xm_visual->mesa_visual.rgbMode) {
2073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*
2074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Must recompute and set these pixel values because colormap
2075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * can be different for different windows.
2076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
2077e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         c->clearpixel = xmesa_color_to_pixel( &c->mesa,
2078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[0],
2079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[1],
2080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[2],
2081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[3],
2082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->xm_visual->undithered_pf);
2083e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel);
2084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
2087e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      drawBuffer->wasCurrent = GL_TRUE;
2088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Detach */
2091e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current( NULL, NULL, NULL );
2092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Unbind the context c from its buffer.
2099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2100693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaUnbindContext( XMesaContext c )
2101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* A no-op for XFree86 integration purposes */
2103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2107693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaGetCurrentContext( void )
2108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
21111e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      XMesaContext xmesa = XMESA_CONTEXT(ctx);
2112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return xmesa;
2113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2120693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentBuffer( void )
2121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
2124e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
2125e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      return xmbuf;
2126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* New in Mesa 3.1 */
2134693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentReadBuffer( void )
2135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
2138e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      return (XMesaBuffer) (ctx->ReadBuffer);
2139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2146693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaForceCurrent(XMesaContext c)
2147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
21491e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (&(c->mesa) != _mesa_get_current_context()) {
2150e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	 _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer);
2151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2154e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current(NULL, NULL, NULL);
2155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2160693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaLoseCurrent(XMesaContext c)
2161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2163e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_make_current(NULL, NULL, NULL);
2164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Switch 3Dfx support hack between window and full-screen mode.
2170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2171693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaSetFXmode( GLint mode )
2172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2174367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   const char *fx = _mesa_getenv("MESA_GLX_FX");
2175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fx && fx[0] != 'd') {
2176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GET_CURRENT_CONTEXT(ctx);
2177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GrHwConfiguration hw;
2178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!FX_grSstQueryHardware(&hw)) {
2179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "!grSstQueryHardware\n");*/
2180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (hw.num_sst < 1) {
2183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "hw.num_sst < 1\n");*/
2184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctx) {
2187fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca         /* [dBorca] Hack alert:
2188fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	  * oh, this is sooo wrong: ctx above is
2189fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	  * really an fxMesaContext, not an XMesaContext
2190fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	  */
2191e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
2192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (mode == XMESA_FX_WINDOW) {
2193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	    if (xmbuf->FXisHackUsable) {
2194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       FX_grSstControl(GR_CONTROL_DEACTIVATE);
2195e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	       xmbuf->FXwindowHack = GL_TRUE;
2196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       return GL_TRUE;
2197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    }
2198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else if (mode == XMESA_FX_FULLSCREEN) {
2200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    FX_grSstControl(GR_CONTROL_ACTIVATE);
2201e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	    xmbuf->FXwindowHack = GL_FALSE;
2202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    return GL_TRUE;
2203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else {
2205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    /* Error: Bad mode value */
2206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*fprintf(stderr, "fallthrough\n");*/
2210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) mode;
2212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
2214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Read image from VooDoo frame buffer into X/Mesa's back XImage.
2221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void FXgetImage( XMesaBuffer b )
2223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
22241d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   GET_CURRENT_CONTEXT(ctx);
2225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static unsigned short pixbuf[MAX_WIDTH];
222601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul   GLuint x, y;
222701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul   int xpos, ypos;
2228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaWindow root;
2229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned int bw, depth, width, height;
22301e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   XMesaContext xmesa = XMESA_CONTEXT(ctx);
2231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2233e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   x = b->frontxrb->pixmap->x;
2234e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   y = b->frontxrb->pixmap->y;
2235e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   width = b->frontxrb->pixmap->width;
2236e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   height = b->frontxrb->pixmap->height;
2237e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   depth = b->frontxrb->pixmap->depth;
2238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2239e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   XGetGeometry( b->xm_visual->display, b->frontxrb->pixmap,
224001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul                 &root, &xpos, &ypos, &width, &height, &bw, &depth);
2241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
22429cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul   if (b->mesa_buffer.Width != width || b->mesa_buffer.Height != height) {
22439cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      b->mesa_buffer.Width = MIN2((int)width, b->FXctx->width);
22449cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      b->mesa_buffer.Height = MIN2((int)height, b->FXctx->height);
22459cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      if (b->mesa_buffer.Width & 1)
2246d98c47300ad0640f8456caced6f03675de06d3a9Daniel Borca         b->mesa_buffer.Width--;  /* prevent odd width */
2247e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xmesa_alloc_back_buffer(b, b->mesa_buffer.Width, b->mesa_buffer.Height);
2248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2250fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca   /* [dBorca] we're always in the right GR_COLORFORMAT... aren't we? */
22511b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca   /* grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); */
22523ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul   if (b->xm_visual->undithered_pf==PF_5R6G5B) {
2253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 16bpp RGB */
2254c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca      grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
22559cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                       0, b->FXctx->height - b->mesa_buffer.Height,  /*pos*/
22569cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                       b->mesa_buffer.Width, b->mesa_buffer.Height,  /* size */
22579cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                       b->mesa_buffer.Width * sizeof(GLushort), /* stride */
2258e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                       b->backxrb->ximage->data);         /* dest buffer */
2259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2260449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   else if (b->xm_visual->dithered_pf==PF_Dither
22613ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul	    && GET_VISUAL_DEPTH(b->xm_visual)==8) {
2262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 8bpp RGB */
22639cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      for (y=0;y<b->mesa_buffer.Height;y++) {
2264e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLubyte *ptr = (GLubyte*) b->backxrb->ximage->data
2265e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                        + b->backxrb->ximage->bytes_per_line * y;
2266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XDITHER_SETUP(y);
2267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2269c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
22709cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                          0, b->FXctx->height-(b->mesa_buffer.Height-y),
22719cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                          b->mesa_buffer.Width, 1,
2272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
22769cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul         for (x=0;x<b->mesa_buffer.Width;x++) {
2277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte r = (pixbuf[x] & 0xf800) >> 8;
2278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte g = (pixbuf[x] & 0x07e0) >> 3;
2279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte b = (pixbuf[x] & 0x001f) << 3;
2280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            *ptr++ = XDITHER( x, r, g, b);
2281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* General case: slow! */
22869cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      for (y=0;y<b->mesa_buffer.Height;y++) {
2287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2288c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
22899cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                          0, b->FXctx->height-(b->mesa_buffer.Height-y),
22909cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                          b->mesa_buffer.Width, 1,
2291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
22959cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul         for (x=0;x<b->mesa_buffer.Width;x++) {
2296e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            XMesaPutPixel(b->backxrb->ximage,x,y,
2297c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca			  xmesa_color_to_pixel(ctx,
2298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0xf800) >> 8,
2299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x07e0) >> 3,
2300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x001f) << 3,
23013ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul					       0xff,
23023ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                                               b->xm_visual->undithered_pf));
2303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
23061b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca   /* grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); */
2307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy the back buffer to the front buffer.  If there's no back buffer
2313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this is a no-op.
2314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSwapBuffers( XMesaBuffer b )
2316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
232218a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
232360b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul      _mesa_notifySwapBuffers(ctx);
2324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2336e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul     if (b->backxrb->ximage) {
2337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy Ximage from host's memory to server's window */
2338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
2340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2341e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	    XShmPutImage( b->xm_visual->display, b->frontxrb->pixmap,
23429ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			  b->swapgc,
2343e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			  b->backxrb->ximage, 0, 0,
234429926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			  0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
234529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul                          False );
2346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
2349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2352e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            XMesaPutImage( b->xm_visual->display, b->frontxrb->pixmap,
23539ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2354e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			   b->backxrb->ximage, 0, 0,
235529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			   0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height );
2356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy pixmap to window on server */
2361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaCopyArea( b->xm_visual->display,
2363e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			b->backxrb->pixmap,   /* source drawable */
2364e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			b->frontxrb->pixmap,  /* dest. drawable */
23659ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
236629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
2367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0                 /* dest region */
2368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      );
2369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2372655ba5d9927187e76b66f5886d090624dc4b1dd9Brian Paul#if !defined(XFree86Server)
2373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
2374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy sub-region of back buffer to front buffer
2381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
23891d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
239060b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul      _mesa_notifySwapBuffers(ctx);
2391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
239329926a11b16ec7a235947d95e9a46777605dd30eBrian Paul      int yTop = b->mesa_buffer.Height - y - height;
2394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2403e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (b->backxrb->ximage) {
2404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy Ximage from host's memory to server's window */
2405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->shm) {
2407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2408e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            XShmPutImage( b->xm_visual->display, b->frontxrb->pixmap,
24099ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul                          b->swapgc,
2410e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                          b->backxrb->ximage, x, yTop,
2411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          x, yTop, width, height, False );
2412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* wait for finished event??? */
2413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2418e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            XMesaPutImage( b->xm_visual->display, b->frontxrb->pixmap,
24199ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2420e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			   b->backxrb->ximage, x, yTop,
2421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   x, yTop, width, height );
2422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy pixmap to window on server */
2426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaCopyArea( b->xm_visual->display,
2427e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			b->backxrb->pixmap,           /* source drawable */
2428e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			b->frontxrb->pixmap,          /* dest. drawable */
24299ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
2430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop, width, height,  /* source region */
2431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop                  /* dest region */
2432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      );
2433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
2440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * is a way to get "under the hood" of X/Mesa so one can manipulate the
2441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * back buffer directly.
2442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  pixmap - pointer to back buffer's Pixmap, or 0
2443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          ximage - pointer to back buffer's XImage, or NULL
2444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE = context is double buffered
2445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE = context is single buffered
2446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2447693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetBackBuffer( XMesaBuffer b,
2448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaPixmap *pixmap,
2449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaImage **ximage )
2450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2452e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (pixmap)  *pixmap = b->backxrb->pixmap;
2453e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (ximage)  *ximage = b->backxrb->ximage;
2454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *pixmap = 0;
2458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *ximage = NULL;
2459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the depth buffer associated with an XMesaBuffer.
2466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the XMesa buffer handle
2467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  width, height - size of buffer in pixels
2468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          bytesPerValue - bytes per depth value (2 or 4)
2469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          buffer - pointer to depth buffer values
2470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2472693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint *bytesPerValue, void **buffer )
2474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2475e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb
2476e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer;
2477e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (!rb || !rb->Data) {
2478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *width = 0;
2479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *height = 0;
2480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = 0;
2481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *buffer = 0;
2482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
24851832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *width = b->mesa_buffer.Width;
24861832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *height = b->mesa_buffer.Height;
2487f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul      *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16
2488f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul         ? sizeof(GLushort) : sizeof(GLuint);
2489e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      *buffer = rb->Data;
2490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaFlush( XMesaContext c )
2496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c && c->xm_visual) {
2498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
2500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSync( c->xm_visual->display, False );
2502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulconst char *XMesaGetString( XMesaContext c, int name )
2509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (name==XMESA_VERSION) {
25123160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul      return "5.0";
2513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (name==XMESA_EXTENSIONS) {
2515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return "";
2516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
2519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2524693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
2527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
2528e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (b->frontxrb->pixmap==d && b->display==dpy) {
2529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
2530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
2533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Look for XMesaBuffers whose X window has been destroyed.
2539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate any such XMesaBuffers.
2540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaGarbageCollect( void )
2542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b, next;
2544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=next) {
2545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      next = b->Next;
2546e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (b->display && b->frontxrb->pixmap && b->type == WINDOW) {
2547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* NOT_NEEDED */
2549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XSync(b->display, False);
2551e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if (!window_exists( b->display, b->frontxrb->pixmap )) {
2552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* found a dead window, free the ancillary info */
2553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaDestroyBuffer( b );
2554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaReset( void )
2562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    while (XMesaBufferList)
2564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaDestroyBuffer(XMesaBufferList);
2565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    XMesaBufferList = NULL;
2567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat red, GLfloat green,
2572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat blue, GLfloat alpha )
2573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2574e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLcontext *ctx = &xmesa->mesa;
2575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint r = (GLint) (red   * 255.0F);
2576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint g = (GLint) (green * 255.0F);
2577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint b = (GLint) (blue  * 255.0F);
2578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint a = (GLint) (alpha * 255.0F);
2579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (xmesa->pixelformat) {
2581449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Index:
2582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
2583449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Truecolor:
2584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
2587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
2590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
259141bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      case PF_8A8R8G8B:
259241bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul         return PACK_8A8R8G8B( r, g, b, a );
2593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
2594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
2595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
2596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
2597449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither:
2598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
2600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( x, y, r, g, b );
2601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2602449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_1Bit:
2603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
2604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
2605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
2606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(x, y, r, g, b);
2607449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Lookup:
2608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
2610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
2611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2612449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Grayscale:
2613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
2614449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_5R6G5B:
2615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
2616449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_True:
2617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, x, y, r, g, b);
2620693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
262308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
2624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
2626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
262918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul/*
263018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * This is typically called when the window size changes and we need
263118a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * to reallocate the buffer's back/depth/stencil/accum buffers.
263218a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul */
263318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paulvoid XMesaResizeBuffers( XMesaBuffer b )
263418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul{
2635e0e993c5ff090058037875642dcd34727a3d8760Adam Jackson#ifdef XFree86Server
2636e0e993c5ff090058037875642dcd34727a3d8760Adam Jackson   GET_CURRENT_CONTEXT(ctx);
2637e0e993c5ff090058037875642dcd34727a3d8760Adam Jackson   xmesa_resize_buffers(ctx, &(b->mesa_buffer), 0, 0);
2638e0e993c5ff090058037875642dcd34727a3d8760Adam Jackson#else
2639bb5c84fcbc22b4fef28cf4589d6410eb3c35a496Brian Paul   Window root;
2640bb5c84fcbc22b4fef28cf4589d6410eb3c35a496Brian Paul   int xpos, ypos;
2641bb5c84fcbc22b4fef28cf4589d6410eb3c35a496Brian Paul   unsigned int width, height, bw, depth;
2642bb5c84fcbc22b4fef28cf4589d6410eb3c35a496Brian Paul   GET_CURRENT_CONTEXT(ctx);
2643bb5c84fcbc22b4fef28cf4589d6410eb3c35a496Brian Paul   XGetGeometry( b->xm_visual->display, b->frontxrb->pixmap,
2644bb5c84fcbc22b4fef28cf4589d6410eb3c35a496Brian Paul                 &root, &xpos, &ypos, &width, &height, &bw, &depth);
2645bb5c84fcbc22b4fef28cf4589d6410eb3c35a496Brian Paul   xmesa_resize_buffers(ctx, &(b->mesa_buffer), width, height);
2646e0e993c5ff090058037875642dcd34727a3d8760Adam Jackson#endif
264718a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul}
264818a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul
2649