xm_api.c revision 3ac01f5e4780b90659a44b2e8d0834940548ab1f
13ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul/* $Id: xm_api.c,v 1.41 2002/08/21 02:57:58 brianp Exp $ */
2693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
3693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
4693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa 3-D graphics library
518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * Version:  4.0.2
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
79ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
9693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
10693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * copy of this software and associated documentation files (the "Software"),
11693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * to deal in the Software without restriction, including without limitation
12693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
14693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Software is furnished to do so, subject to the following conditions:
155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
16693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The above copyright notice and this permission notice shall be included
17693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in all copies or substantial portions of the Software.
185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
19693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
26c5a76cbed41b5816d2f5284f90c70364b062aea4Brian Paul/* $XFree86: xc/extras/Mesa/src/X/xm_api.c,v 1.2 2002/02/26 23:37:31 tsi Exp $ */
27693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
28693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
29693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * This file contains the implementations of all the XMesa* functions.
30693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
31693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
32693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * NOTES:
33693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
34693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The window coordinate system origin (0,0) is in the lower-left corner
35693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * of the window.  X11's window coordinate origin is in the upper-left
36693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * corner of the window.  Therefore, most drawing functions in this
37693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * file have to flip Y coordinates.
38693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
39693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
40693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in support for the MIT Shared Memory extension.  If enabled, when you
41693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * use an Ximage for the back buffer in double buffered mode, the "swap"
42693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * operation will be faster.  You must also link with -lXext.
43693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
44693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Byte swapping:  If the Mesa host and the X display use a different
45693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * byte order then there's some trickiness to be aware of when using
46693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XImages.  The byte ordering used for the XImage is that of the X
47693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * display, not the Mesa host.
48693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The color-to-pixel encoding for True/DirectColor must be done
49693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * according to the display's visual red_mask, green_mask, and blue_mask.
50693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
51693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * do byte swapping if needed.  If one wants to directly "poke" the pixel
52693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * into the XImage's buffer then the pixel must be byte swapped first.  In
53693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
54693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and use XPutPixel everywhere except in the implementation of
55693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
56693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * instead of using XPutPixel we "poke" our values after byte-swapping
57693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the clear pixel value if needed.
58693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
59693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
60693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
61693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef __CYGWIN__
62693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef WIN32
63693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef __WIN32__
64693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
65693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
66693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glxheader.h"
67693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "GL/xmesa.h"
68693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "xmesaP.h"
69693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "context.h"
70693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "extensions.h"
71693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glthread.h"
729a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h"
73693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "matrix.h"
74693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "mem.h"
7533143303feaf84afbef2e63ac0adab2d70b3c344Brian Paul#include "mmath.h"
765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
77693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef HAVE_CONFIG_H
78693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "conf.h"
79693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
80a4575499679d9d91055a35c7673b81872ec127cbJouk Jansen#include "macros.h"
81e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul#include "texformat.h"
82e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul#include "texstore.h"
83724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/swrast.h"
84ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell#include "swrast_setup/swrast_setup.h"
85cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "array_cache/acache.h"
8623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "tnl/tnl.h"
87693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
88693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef GLX_NONE_EXT
89693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#define GLX_NONE_EXT 0x8000
90693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
91693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
92693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
93693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
94693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Global X driver lock
95693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
96693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul_glthread_Mutex _xmesa_lock;
97693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
98693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
99693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Lookup tables for HPCR pixel format:
102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic short hpcr_rgbTbl[3][256] = {
104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul},
122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul},
140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 40,  40,  41,  41,  42,  42,  43,  43,  44,  44,  45,  45,  46,  46,  47,  47,
143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  86,  86,  87,  87,
148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
1575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen}
158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul};
159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                     X Utility Functions                    *****/
164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * X/Mesa error reporting function:
169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void error( const char *msg )
171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
172c5a76cbed41b5816d2f5284f90c70364b062aea4Brian Paul   (void)DitherValues;		/* Muffle compiler */
173c5a76cbed41b5816d2f5284f90c70364b062aea4Brian Paul
174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (getenv("MESA_DEBUG"))
175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf( stderr, "X/Mesa error: %s\n", msg );
176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the host's byte order as LSBFirst or MSBFirst ala X.
181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int host_byte_order( void )
184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i = 1;
186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *cptr = (char *) &i;
187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return (*cptr==1) ? LSBFirst : MSBFirst;
188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Error handling.
194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int mesaXErrorFlag = 0;
197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event )
199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) event;
202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mesaXErrorFlag = 1;
203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Check if the X Shared Memory extension is available.
210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  0 = not available
211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          1 = shared XImage support available
212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          2 = shared Pixmap support available also
213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int check_for_xshm( XMesaDisplay *display )
216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM
218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int major, minor, ignore;
219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Bool pixmaps;
220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return (pixmaps==True) ? 2 : 1;
224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return 0;
227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Can't compile XSHM support */
234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the width and height of the given drawable.
242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void get_drawable_size( XMesaDisplay *dpy, XMesaDrawable d,
244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               unsigned int *width, unsigned int *height)
245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    (void) dpy;
248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    *width = d->width;
249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    *height = d->height;
250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Window root;
252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int x, y;
253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned int bw, depth;
254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   _glthread_LOCK_MUTEX(_xmesa_lock);
256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetGeometry( dpy, d, &root, &x, &y, width, height, &bw, &depth );
257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   _glthread_UNLOCK_MUTEX(_xmesa_lock);
258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Apply gamma correction to an intensity value in [0..max].  Return the
264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * new intensity value.
265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLint gamma_adjust( GLfloat gamma, GLint value, GLint max )
267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma == 1.0) {
269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return value;
270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double x = (double) value / (double) max;
27333143303feaf84afbef2e63ac0adab2d70b3c344Brian Paul      return IROUND_POS((GLfloat) max * pow(x, 1.0F/gamma));
274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the true number of bits per pixel for XImages.
281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * For example, if we request a 24-bit deep visual we may actually need/get
282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 32bpp XImages.  This function returns the appropriate bpp.
283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the X display
284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - desribes the visual to be used for XImages
285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  true number of bits per pixel for XImages
286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv )
290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   const int depth = visinfo->nplanes;
293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (screenInfo.formats[i].depth == depth)
296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return screenInfo.formats[i].bitsPerPixel;
297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return depth;  /* should never get here, but this should be safe */
299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv )
304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDisplay *dpy = xmv->display;
306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaImage *img;
308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bitsPerPixel;
309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Create a temporary XImage */
310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       ZPixmap, 0,           /*format, offset*/
312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       (char*) MALLOC(8),    /*data*/
313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       1, 1,                 /*width, height*/
314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       32,                   /*bitmap_pad*/
315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       0                     /*bytes_per_line*/
316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     );
317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(img);
318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* grab the bits/pixel value */
319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bitsPerPixel = img->bits_per_pixel;
320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* free the XImage */
321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE( img->data );
322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img->data = NULL;
323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDestroyImage( img );
324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bitsPerPixel;
325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Determine if a given X window ID is valid (window exists).
332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this by calling XGetWindowAttributes() for the window and
333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * checking if we catch an X error.
334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the display
335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         win - the window to check for existance
336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE - window exists
337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE - window doesn't exist
338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean WindowExistsFlag;
341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (xerr->error_code == BadWindow) {
346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      WindowExistsFlag = GL_FALSE;
347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes wa;
354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   WindowExistsFlag = GL_TRUE;
356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler(window_exists_err_handler);
357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSetErrorHandler(old_handler);
359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return WindowExistsFlag;
360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                Linked list of XMesaBuffers                 *****/
367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer XMesaBufferList = NULL;
370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Allocate a new XMesaBuffer, add to linked list */
373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer alloc_xmesa_buffer(void)
374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b) {
377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->Next = XMesaBufferList;
378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBufferList = b;
379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Find an XMesaBuffer by matching X display and colormap but NOT matching
386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the notThis buffer.
387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer find_xmesa_buffer(XMesaDisplay *dpy,
389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                     XMesaColormap cmap,
390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                     XMesaBuffer notThis)
391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Free an XMesaBuffer, remove from linked list, perhaps free X colormap
404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * entries.
405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void free_xmesa_buffer(int client, XMesaBuffer buffer)
407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer prev = NULL, b;
409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b==buffer) {
412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* unlink bufer from list */
413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (prev)
414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            prev->Next = buffer->Next;
415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaBufferList = buffer->Next;
417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Check to free X colors */
418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (buffer->num_alloced>0) {
419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* If no other buffer uses this X colormap then free the colors. */
420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!find_xmesa_buffer(buffer->display, buffer->cmap, buffer)) {
421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               (void)FreeColors(buffer->cmap, client,
423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				buffer->num_alloced, buffer->alloced_colors,
424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				0);
425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               XFreeColors(buffer->display, buffer->cmap,
427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                           buffer->alloced_colors, buffer->num_alloced, 0);
428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
4311832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
4321832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul         _mesa_free_framebuffer_data(&buffer->mesa_buffer);
433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         FREE(buffer);
4341832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return;
436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* continue search */
438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prev = b;
439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* buffer not found in XMesaBufferList */
44108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul   _mesa_problem(NULL,"free_xmesa_buffer() - buffer not found\n");
442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Copy X color table stuff from one XMesaBuffer to another. */
446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void copy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   dst->num_alloced = src->num_alloced;
453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->alloced_colors, src->alloced_colors,
454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          sizeof(src->alloced_colors));
455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                   Misc Private Functions                   *****/
461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return number of bits set in n.
466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bitcount( unsigned long n )
468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bits;
470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (bits=0; n>0; n=n>>1) {
471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (n&1) {
472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bits++;
473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bits;
476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Allocate a shared memory XImage back buffer for the given XMesaBuffer.
482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE if success, GL_FALSE if error
483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean alloc_shm_back_buffer( XMesaBuffer b )
486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM
488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * We have to do a _lot_ of error checking here to be sure we can
490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * really use the XSHM extension.  It seems different servers trigger
491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * errors at different points if the extension won't work.  Therefore
492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to be very careful...
493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GC gc;
495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay *, XErrorEvent * );
496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->backimage = XShmCreateImage( b->xm_visual->display,
498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                   b->xm_visual->visinfo->visual,
499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                   b->xm_visual->visinfo->depth,
500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				   ZPixmap, NULL, &b->shminfo,
501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				   b->width, b->height );
502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage == NULL) {
503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      error("alloc_back_buffer: Shared memory error (XShmCreateImage), disabling.");
504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.shmid = shmget( IPC_PRIVATE, b->backimage->bytes_per_line
509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			     * b->backimage->height, IPC_CREAT|0777 );
510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->shminfo.shmid < 0) {
511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_DEBUG"))
512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          perror("alloc_back_buffer");
513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      error("alloc_back_buffer: Shared memory error (shmget), disabling.");
516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.shmaddr = b->backimage->data
521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      = (char*)shmat( b->shminfo.shmid, 0, 0 );
522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->shminfo.shmaddr == (char *) -1) {
523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_DEBUG"))
524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          perror("alloc_back_buffer");
525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      error("alloc_back_buffer: Shared memory error (shmat), disabling.");
529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.readOnly = False;
534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mesaXErrorFlag = 0;
535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler( mesaHandleXError );
536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* This may trigger the X protocol error we're ready to catch: */
537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XShmAttach( b->xm_visual->display, &b->shminfo );
538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (mesaXErrorFlag) {
541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* we are on a remote display, this error is normal, don't print it */
542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XFlush( b->xm_visual->display );
543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      mesaXErrorFlag = 0;
544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmdt( b->shminfo.shmaddr );
546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      (void) XSetErrorHandler( old_handler );
550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   shmctl( b->shminfo.shmid, IPC_RMID, 0 ); /* nobody else needs it */
554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Finally, try an XShmPutImage to be really sure the extension works */
556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gc = XCreateGC( b->xm_visual->display, b->frontbuffer, 0, NULL );
557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XShmPutImage( b->xm_visual->display, b->frontbuffer, gc,
558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		 b->backimage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False );
559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XFreeGC( b->xm_visual->display, gc );
561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) XSetErrorHandler( old_handler );
562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (mesaXErrorFlag) {
563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XFlush( b->xm_visual->display );
564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      mesaXErrorFlag = 0;
565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmdt( b->shminfo.shmaddr );
567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage) {
574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int height = b->backimage->height;
575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR1 macro */
576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width1 = b->backimage->bytes_per_line;
577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin1 = (GLubyte *) b->backimage->data
578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width1 * (height-1);
579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR2 macro */
580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width2 = b->backimage->bytes_per_line / 2;
581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin2 = (GLushort *) b->backimage->data
582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width2 * (height-1);
583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR3 macro */
584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width3 = b->backimage->bytes_per_line;
585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin3 = (GLubyte *) b->backimage->data
586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width3 * (height-1);
587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR4 macro */
588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width4 = b->backimage->width;
589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin4 = (GLuint *) b->backimage->data
590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width4 * (height-1);
591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Can't compile XSHM support */
596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup an off-screen pixmap or Ximage to use as the back buffer.
605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the X/Mesa buffer
606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid xmesa_alloc_back_buffer( XMesaBuffer b )
608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state==BACK_XIMAGE) {
610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Deallocate the old backimage, if any */
611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backimage) {
612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XShmDetach( b->xm_visual->display, &b->shminfo );
615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XDestroyImage( b->backimage );
616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    shmdt( b->shminfo.shmaddr );
617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
620693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaDestroyImage( b->backimage );
621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = NULL;
622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Allocate new back buffer */
625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Allocate a regular XImage for the back buffer. */
628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = XMesaCreateImage(b->xm_visual->BitsPerPixel,
629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 b->width, b->height, NULL);
630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->shm==0
632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  || alloc_shm_back_buffer(b)==GL_FALSE
633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  ) {
634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Allocate a regular XImage for the back buffer. */
635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = XCreateImage( b->xm_visual->display,
636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      b->xm_visual->visinfo->visual,
637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      GET_VISUAL_DEPTH(b->xm_visual),
638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      ZPixmap, 0,   /* format, offset */
639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      NULL, b->width, b->height,
640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      8, 0 );  /* pad, bytes_per_line */
641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!b->backimage) {
643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    error("alloc_back_buffer: XCreateImage failed.");
644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->backimage->data = (char *) MALLOC( b->backimage->height
646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                             * b->backimage->bytes_per_line );
647693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!b->backimage->data) {
648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            error("alloc_back_buffer: MALLOC failed.");
649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaDestroyImage( b->backimage );
650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->backimage = NULL;
651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backpixmap = None;
654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (b->db_state==BACK_PIXMAP) {
656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaPixmap old_pixmap = b->backpixmap;
657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Free the old back pixmap */
658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backpixmap) {
659693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Allocate new back pixmap */
662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backpixmap = XMesaCreatePixmap( b->xm_visual->display, b->frontbuffer,
663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 b->width, b->height,
664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 GET_VISUAL_DEPTH(b->xm_visual) );
665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* update other references to backpixmap */
667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->buffer==(XMesaDrawable)old_pixmap) {
668693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->buffer = (XMesaDrawable)b->backpixmap;
669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
670693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
671693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
672693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
676693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * A replacement for XAllocColor.  This function should never
677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * fail to allocate a color.  When XAllocColor fails, we return
678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the nearest matching color.  If we have to allocate many colors
679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this function isn't too efficient; the XQueryColors() could be
680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * done just once.
681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Written by Michael Pichler, Brian Paul, Mark Kilgard
682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - X display
683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - X colormap
684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmapSize - size of colormap
685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In/Out: color - the XColor struct
686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  exact - 1=exact color match, 0=closest match
687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          alloced - 1=XAlloc worked, 0=XAlloc failed
688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void
690693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulnoFaultXAllocColor( int client,
691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaDisplay *dpy,
692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColormap cmap,
693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int cmapSize,
694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColor *color,
695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int *exact, int *alloced )
696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Pixel *ppixIn;
699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   xrgb *ctable;
700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* we'll try to cache ctable for better remote display performance */
702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static Display *prevDisplay = NULL;
703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColormap prevCmap = 0;
704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static int prevCmapSize = 0;
705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColor *ctable = NULL;
706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaColor subColor;
708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i, bestmatch;
709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double mindist;       /* 3*2^16^2 exceeds long int precision. */
710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* First try just using XAllocColor. */
714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->red, &color->green, &color->blue,
717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->pixel,
718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, color)) {
721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *exact = 1;
723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return;
725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Alloc failed, search for closest match */
728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Retrieve color table entries. */
730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* XXX alloca candidate. */
731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ppixIn[i] = i;
736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   QueryColors(cmap, cmapSize, ppixIn, ctable);
738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (prevDisplay != dpy || prevCmap != cmap
740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       || prevCmapSize != cmapSize || !ctable) {
741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* free previously cached color table */
742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctable)
743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         FREE(ctable);
744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Get the color table from X */
745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(ctable);
747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i = 0; i < cmapSize; i++) {
748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         ctable[i].pixel = i;
749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XQueryColors(dpy, cmap, ctable, cmapSize);
751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevDisplay = dpy;
752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmap = cmap;
753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmapSize = cmapSize;
754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Find best match. */
758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bestmatch = -1;
759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mindist = 0.0;
760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dist = dr * dr + dg * dg + db * db;
765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (bestmatch < 0 || dist < mindist) {
766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bestmatch = i;
767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         mindist = dist;
768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Return result. */
772693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.red   = ctable[bestmatch].red;
773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.green = ctable[bestmatch].green;
774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.blue  = ctable[bestmatch].blue;
775693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Try to allocate the closest match color.  This should only
776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * fail if the cell is read/write.  Otherwise, we're incrementing
777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the cell's reference count.
778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.red, &subColor.green, &subColor.blue,
782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.pixel,
783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, &subColor)) {
786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* do this to work around a problem reported by Frank Ortega */
791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.pixel = (unsigned long) bestmatch;
792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.red   = ctable[bestmatch].red;
793693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.green = ctable[bestmatch].green;
7945e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      subColor.blue  = ctable[bestmatch].blue;
795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.flags = DoRed | DoGreen | DoBlue;
796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 0;
797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(ppixIn);
800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(ctable);
801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* don't free table, save it for next time */
803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *color = subColor;
806693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *exact = 0;
807693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
808693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
809693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
810693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
811693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
812693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
813693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do setup for PF_GRAYSCALE pixel format.
814693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Note that buffer may be NULL.
815693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
816693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_grayscale( int client, XMesaVisual v,
817693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  XMesaBuffer buffer, XMesaColormap cmap )
818693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
823693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
824693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
826693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
8321832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
8331832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous XMesaBuffer which uses same
835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate 256 shades of gray */
841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int gray;
842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (gray=0;gray<256;gray++) {
844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            int exact, alloced;
848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaColor xcol;
849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.red   = (r << 8) | r;
850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.green = (g << 8) | g;
851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.blue  = (b << 8) | b;
852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            noFaultXAllocColor( client, v->display,
853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                cmap, GET_COLORMAP_SIZE(v),
854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                &xcol, &exact, &alloced );
855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!exact) {
856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               colorsfailed++;
857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (alloced) {
859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               assert(buffer->num_alloced<256);
860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->num_alloced++;
862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*OLD
865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(gray < 576);
866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+0] = xcol.pixel;
867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+1] = xcol.pixel;
868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+2] = xcol.pixel;
869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            */
874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray] = xcol.pixel;
875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray;
877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray;
878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray;
879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (colorsfailed && getenv("MESA_DEBUG")) {
882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            fprintf( stderr,
883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of 256 needed colors do not match exactly.\n",
884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  colorsfailed );
885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
888693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
889693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_GRAYSCALE;
890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_GRAYSCALE;
891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a PseudoColor, StaticColor,
898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * color.  While this function was originally designed just for 8-bit
901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Dithering code contributed by Bob Mercier.
903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_dithered_color( int client, XMesaVisual v,
905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       XMesaBuffer buffer, XMesaColormap cmap )
906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
914693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
915693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
916693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
9201832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
9211832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous, matching XMesaBuffer.
923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Do this to avoid time spent in noFaultXAllocColor.
924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate X colors and initialize color_table[], red_table[], etc */
929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int r, g, b, i;
930693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (r = 0; r < _R; r++) {
932693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            for (g = 0; g < _G; g++) {
933693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               for (b = 0; b < _B; b++) {
934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  XMesaColor xcol;
935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  int exact, alloced;
936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(_R-1),65535);
937693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(_G-1),65535);
938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(_B-1),65535);
939693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  noFaultXAllocColor( client, v->display,
940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      cmap, GET_COLORMAP_SIZE(v),
941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      &xcol, &exact, &alloced );
942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (!exact) {
943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     colorsfailed++;
944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (alloced) {
946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     assert(buffer->num_alloced<256);
947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->num_alloced++;
949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  i = _MIX( r, g, b );
951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(i < 576);
952693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->color_table[i] = xcol.pixel;
953693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(xcol.pixel < 65536);
954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (_R-1);
955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (_G-1);
956693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (_B-1);
957693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               }
958693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
959693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
961693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (colorsfailed && getenv("MESA_DEBUG")) {
962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            fprintf( stderr,
963693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of %d needed colors do not match exactly.\n",
964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  colorsfailed, _R*_G*_B );
965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_DITHER;
970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_LOOKUP;
971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
973693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Special dithering tables have to be initialized.
979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_8bit_hpcr( XMesaVisual v )
981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * on the root window AND the colormap obtainable by XGetRGBColormaps
985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * for that atom must be set on the window.  (see also tkInitWindow)
986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If that colormap is not set, the output will look stripy.
987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Setup color tables with gamma correction */
990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double g;
992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
9935e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   g = 1.0 / v->RedGamma;
9945e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   for (i=0; i<256; i++) {
99533143303feaf84afbef2e63ac0adab2d70b3c344Brian Paul      GLint red = IROUND_POS(255.0 * pow( hpcr_rgbTbl[0][i]/255.0, g ));
996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->GreenGamma;
1000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
100133143303feaf84afbef2e63ac0adab2d70b3c344Brian Paul      GLint green = IROUND_POS(255.0 * pow( hpcr_rgbTbl[1][i]/255.0, g ));
1002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
1003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->BlueGamma;
1006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
100733143303feaf84afbef2e63ac0adab2d70b3c344Brian Paul      GLint blue = IROUND_POS(255.0 * pow( hpcr_rgbTbl[2][i]/255.0, g ));
1008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
1009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
1011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_HPCR;
1012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* which method should I use to clear */
1014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_FALSE: keep the ordinary method  */
1015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_TRUE : clear with dither pattern */
1016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->hpcr_clear_flag = getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
1017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (v->hpcr_clear_flag) {
1019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
1020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               DefaultRootWindow(v->display),
1021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               16, 2, 8);
1022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
1024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       0, 0, 16, 2, AllPlanes, ZPixmap);
1025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a True/DirectColor visual.
1032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
1034190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                             XMesaColormap cmap )
1035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned long rmask, gmask, bmask;
1037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) buffer;
1038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) cmap;
1039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute red multiplier (mask) and bit shift */
1041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->rshift = 0;
1042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   rmask = GET_REDMASK(v);
1043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((rmask & 1)==0) {
1044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->rshift++;
1045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      rmask = rmask >> 1;
1046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute green multiplier (mask) and bit shift */
1049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->gshift = 0;
1050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gmask = GET_GREENMASK(v);
1051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((gmask & 1)==0) {
1052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->gshift++;
1053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gmask = gmask >> 1;
1054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute blue multiplier (mask) and bit shift */
1057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bshift = 0;
1058693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bmask = GET_BLUEMASK(v);
1059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((bmask & 1)==0) {
1060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->bshift++;
1061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      bmask = bmask >> 1;
1062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Compute component-to-pixel lookup tables and dithering kernel
1066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      static GLubyte kernel[16] = {
1069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          0*16,  8*16,  2*16, 10*16,
1070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         12*16,  4*16, 14*16,  6*16,
1071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          3*16, 11*16,  1*16,  9*16,
1072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         15*16,  7*16, 13*16,  5*16,
1073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      };
1074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint rBits = bitcount(rmask);
1075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint gBits = bitcount(gmask);
1076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint bBits = bitcount(bmask);
10773cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      GLint maxBits;
1078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLuint i;
1079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
1081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=rmask; i++)
1082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
1083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=gmask; i++)
1084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
1085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=bmask; i++)
1086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
1087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert RGB values from [0,255] to pixel components */
1089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<256;i++) {
1091693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint r = gamma_adjust(v->RedGamma,   i, 255);
1092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint g = gamma_adjust(v->GreenGamma, i, 255);
1093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
1094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
1095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
1096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
1097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* overflow protection */
1099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=256;i<512;i++) {
1100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = v->RtoPixel[255];
1101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = v->GtoPixel[255];
1102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = v->BtoPixel[255];
1103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* setup dithering kernel */
11063cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      maxBits = rBits;
11073cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (gBits > maxBits)  maxBits = gBits;
11083cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (bBits > maxBits)  maxBits = bBits;
1109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<16;i++) {
11103cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul         v->Kernel[i] = kernel[i] >> maxBits;
1111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = PF_TRUECOLOR;
1114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_TRUEDITHER : PF_TRUECOLOR;
1115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Now check for TrueColor visuals which we can optimize.
1119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (   GET_REDMASK(v)  ==0x0000ff
1121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_GREENMASK(v)==0x00ff00
1122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_BLUEMASK(v) ==0xff0000
1123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
1125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on SGI, Sun */
1128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R;
1129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
1131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
1135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on Linux, HP, IBM */
1138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8R8G8B;
1139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
1141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==24
1145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common packed 24 bpp config used on Linux */
1148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8R8G8B24;
1149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xf800
1151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x07e0
1152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x001f
1153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==16
1155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLushort)==2
1156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* 5-6-5 color weight on common PC VGA boards */
1158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = PF_5R6G5B;
1159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->dithered_pf = PF_DITHER_5R6G5B;
1160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xe0
1162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x1c
1163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x03
1164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_FOR_HPCR(v)) {
1165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      setup_8bit_hpcr( v );
1166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a monochrome visual.
1173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_monochrome( XMesaVisual v, XMesaBuffer b )
1175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) b;
1177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = v->undithered_pf = PF_1BIT;
1178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* if black=1 then we must flip pixel values */
1179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
1180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * When a context is "made current" for the first time, we can finally
1186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * finish initializing the context's visual and buffer information.
1187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual to initialize
1188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         b - the XMesaBuffer to initialize (may be NULL)
1189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - TRUE = RGBA mode, FALSE = color index mode
1190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         window - the window/pixmap we're rendering into
1191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - the colormap associated with the window/pixmap
1192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE=success, GL_FALSE=failure
1193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean initialize_visual_and_buffer( int client,
1195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaVisual v,
1196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaBuffer b,
1197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               GLboolean rgb_flag,
1198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaDrawable window,
1199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaColormap cmap
1200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                             )
1201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGCValues gcvalues;
1204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b) {
1207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(b->xm_visual == v);
1208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save true bits/pixel */
1211a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   v->BitsPerPixel = bits_per_pixel(v);
1212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v->BitsPerPixel > 0);
1213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (rgb_flag==GL_FALSE) {
1216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* COLOR-INDEXED WINDOW:
1217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Even if the visual is TrueColor or DirectColor we treat it as
1218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * being color indexed.  This is weird but might be useful to someone.
1219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->dithered_pf = v->undithered_pf = PF_INDEX;
1221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->index_bits = GET_VISUAL_DEPTH(v);
1222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* RGB WINDOW:
1225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * We support RGB rendering into almost any kind of visual.
1226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int xclass;
1228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xclass = GET_VISUAL_CLASS(v);
1229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (xclass==TrueColor || xclass==DirectColor) {
1230190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 setup_truecolor( v, b, cmap );
1231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if (xclass==StaticGray && GET_VISUAL_DEPTH(v)==1) {
1233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 setup_monochrome( v, b );
1234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if (xclass==GrayScale || xclass==StaticGray) {
1236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!setup_grayscale( client, v, b, cmap )) {
1237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if ((xclass==PseudoColor || xclass==StaticColor)
1241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
1242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!setup_dithered_color( client, v, b, cmap )) {
1243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 error("XMesa: RGB mode rendering not supported in given visual.");
1248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return GL_FALSE;
1249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->index_bits = 0;
1251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_NO_DITHER")) {
1253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 v->dithered_pf = v->undithered_pf;
1254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If MESA_INFO env var is set print out some debugging info
1260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * which can help Brian figure out what's going on when a user
1261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * reports bugs.
1262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (getenv("MESA_INFO")) {
12644b7ccad6829d11c07f1ceac3b3d12f8aec9e640bBrian Paul      fprintf(stderr, "X/Mesa visual = %p\n", (void *) v);
1265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa dithered pf = %u\n", v->dithered_pf);
1266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa undithered pf = %u\n", v->undithered_pf);
1267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa level = %d\n", v->level);
1268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
1269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
1270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b && window) {
1273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Do window-specific initializations */
1274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Window dimensions */
1276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      unsigned int w, h;
1277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      get_drawable_size( v->display, window, &w, &h );
1278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->width = w;
1279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->height = h;
1280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->frontbuffer = window;
1282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Setup for single/double buffering */
12841832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (v->mesa_visual.doubleBufferMode) {
1285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Double buffered */
1286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->shm = check_for_xshm( v->display );
1288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         xmesa_alloc_back_buffer( b );
1290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->db_state==BACK_PIXMAP) {
1291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->buffer = (XMesaDrawable)b->backpixmap;
1292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else {
1294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->buffer = XIMAGE;
1295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Single Buffered */
1299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->buffer = b->frontbuffer;
1300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* X11 graphics contexts */
1303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1304c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = CreateScratchGC(v->display, window->depth);
1305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1306c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = XCreateGC( v->display, window, 0, NULL );
1307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1308c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      XMesaSetFunction( v->display, b->gc, GXcopy );
1309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
13109ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      /* cleargc - for glClear() */
13119ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#ifdef XFree86Server
13129ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = CreateScratchGC(v->display, window->depth);
13139ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#else
13149ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = XCreateGC( v->display, window, 0, NULL );
13159ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#endif
13169ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->cleargc, GXcopy );
13179ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul
1318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
1320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Michael Pichler May 15, 1995.
1321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
13239ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->swapgc = CreateScratchGC(v->display, window->depth);
1324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
1325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  CARD32 v[1];
1326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  v[0] = FALSE;
13279ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul	  dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
1328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gcvalues.graphics_exposures = False;
13319ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->swapgc = XCreateGC( v->display, window,
1332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              GCGraphicsExposures, &gcvalues);
1333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
13349ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->swapgc, GXcopy );
1335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Set fill style and tile pixmap once for all for HPCR stuff
1337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * (instead of doing it each time in clear_color_HPCR_pixmap())
1338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Initialize whole stuff
1339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Jacques Leroy March 8, 1998.
1340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->hpcr_clear_flag && b->buffer!=XIMAGE) {
1342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	int i;
1343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	for (i=0; i<16; i++)
1344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        {
1345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
1346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
1347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        }
1348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        XMesaPutImage(b->display, (XMesaDrawable)v->hpcr_clear_pixmap,
1349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
1350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
1351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
1352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Initialize the row buffer XImage for use in write_color_span() */
1355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1,
1357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (char *)MALLOC(MAX_WIDTH*4));
1358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XCreateImage( v->display,
1360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->visual,
1361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->depth,
1362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  ZPixmap, 0,           /*format, offset*/
1363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  (char*) MALLOC(MAX_WIDTH*4),  /*data*/
1364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  MAX_WIDTH, 1,         /*width, height*/
1365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  32,                   /*bitmap_pad*/
1366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  0                     /*bytes_per_line*/ );
1367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Convert an RGBA color to a pixel value.
1377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long
1379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulxmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLubyte a,
1380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      GLuint pixelFormat)
1381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (pixelFormat) {
1383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_INDEX:
1384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
1385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_TRUECOLOR:
1386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
1389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
1392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
1393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
1394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B24:
1396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
1397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
1398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
1399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_DITHER:
1400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
1402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( 1, 0, r, g, b );
1403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_1BIT:
1405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
1406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
1408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(1, 1, r, g, b);
1409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_LOOKUP:
1410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
1412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
1413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_GRAYSCALE:
1415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
1416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_TRUEDITHER:
1417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_DITHER_5R6G5B:
1419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, 1, 0, r, g, b);
1422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
142508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "Bad pixel format in xmesa_color_to_pixel");
1426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
1428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                       Public Functions                     *****/
1433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new X/Mesa visual.
1438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  display - X11 display
1439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - an XVisualInfo pointer
1440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - GL_TRUE = RGB mode,
1441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                    GL_FALSE = color index mode
1442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         alpha_flag - alpha buffer requested?
1443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         db_flag - GL_TRUE = double-buffered,
1444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                   GL_FALSE = single buffered
1445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stereo_flag - stereo visual?
1446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                       GL_FALSE = use an off-screen pixmap for back buffer
1448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         depth_size - requested bits/depth values, or zero
1449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stencil_size - requested bits/stencil values, or zero
1450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_red_size - requested bits/red accum values, or zero
1451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_green_size - requested bits/green accum values, or zero
1452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_blue_size - requested bits/blue accum values, or zero
1453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_alpha_size - requested bits/alpha accum values, or zero
1454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         num_samples - number of samples/pixel if multisampling, or zero
1455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         level - visual level, usually 0
1456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
1457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return;  a new XMesaVisual or 0 if error.
1458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1459693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
1460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               XMesaVisualInfo visinfo,
1461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean rgb_flag,
1462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean alpha_flag,
1463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean db_flag,
1464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean stereo_flag,
1465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean ximage_flag,
1466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint depth_size,
1467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint stencil_size,
1468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_red_size,
1469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_green_size,
1470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_blue_size,
1471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_alpha_size,
1472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint num_samples,
1473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint level,
1474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint visualCaveat )
1475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *gamma;
1477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisual v;
1478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint red_bits, green_bits, blue_bits, alpha_bits;
1479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* For debugging only */
1481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (getenv("MESA_XSYNC")) {
1482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* This makes debugging X easier.
1483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * In your debugger, set a breakpoint on _XError to stop when an
1484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * X protocol error is generated.
1485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
1488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSynchronize( display, 1 );
1490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!v) {
1495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * In the X server, NULL is passed in for the display.  It will have
1500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * to be set before using this visual.  See XMesaSetVisualDisplay()
1501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * below.
1502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->display = display;
1504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save a copy of the XVisualInfo struct because the user may XFREE()
1506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the struct but we may need some of the information contained in it
1507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * at a later time.
1508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = visinfo;
1511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if(!v->visinfo) {
1514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE(v);
1515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
1518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save a copy of the pointer now so we can find this visual again
1520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * if we need to search for it in find_glx_visual().
1521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->vishandle = visinfo;
1523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Initialize the depth of the screen */
1527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       PixmapFormatRec *format;
1529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       for (format = screenInfo.formats;
1531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    format->depth != display->rootDepth;
1532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    format++)
1533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   ;
1534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       v->screen_depth = format->bitsPerPixel;
1535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* check for MESA_GAMMA environment variable */
1539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gamma = getenv("MESA_GAMMA");
1540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma) {
1541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->ximage_flag = ximage_flag;
1552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->level = level;
1553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->VisualCaveat = visualCaveat;
1554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
1556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int xclass;
1559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xclass = GET_VISUAL_CLASS(v);
1560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (xclass==TrueColor || xclass==DirectColor) {
1561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits   = bitcount(GET_REDMASK(v));
1562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = bitcount(GET_GREENMASK(v));
1563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits  = bitcount(GET_BLUEMASK(v));
1564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* this is an approximation */
1568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int depth;
1569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth = GET_VISUAL_DEPTH(v);
1570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits = depth / 3;
1571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= red_bits;
1572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = depth / 2;
1573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= green_bits;
1574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits = depth;
1575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
1577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (alpha_flag && alpha_bits == 0)
1581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      alpha_bits = 8;
1582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
15831832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_visual( &v->mesa_visual,
15841832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            rgb_flag, db_flag, stereo_flag,
15851832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            red_bits, green_bits,
15861832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            blue_bits, alpha_bits,
15871832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            v->index_bits,
15881832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            depth_size,
15891832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            stencil_size,
15901832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_red_size, accum_green_size,
15911832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_blue_size, accum_alpha_size,
15921832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            0 );
1593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return v;
1594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSetVisualDisplay( XMesaDisplay *dpy, XMesaVisual v )
1598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    v->display = dpy;
1600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyVisual( XMesaVisual v )
1604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(v->visinfo);
1607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(v);
1609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaContext.
1615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - XMesaVisual
1616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         share_list - another XMesaContext with which to share display
1617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                      lists or NULL if no sharing is wanted.
1618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  an XMesaContext or NULL if error.
1619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
16207a1f3a37a10b162b067239dafa19fc6865a41f14Keith WhitwellXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
16229a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul   static GLboolean firstTime = GL_TRUE;
1623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaContext c;
1624ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   GLcontext *ctx;
16259a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul   __GLimports imports;
1626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (firstTime) {
1628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _glthread_INIT_MUTEX(_xmesa_lock);
1629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      firstTime = GL_FALSE;
1630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!c) {
1634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16379a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul   _mesa_init_default_imports( &imports, (void *) c );
16381832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   ctx = c->gl_ctx = _mesa_create_context( &v->mesa_visual,
16397a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell                      share_list ? share_list->gl_ctx : (GLcontext *) NULL,
16409a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul                      &imports );
1641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!c->gl_ctx) {
1642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE(c);
1643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16465a9026c65d260dc185e072163999f5d810015108Brian Paul   _mesa_enable_sw_extensions(ctx);
16472a88946f9ad82350c2f7edc2185bf9394d2d4764Brian Paul   _mesa_enable_1_3_extensions(ctx);
1648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (CHECK_BYTE_ORDER(v)) {
1650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->swapbytes = GL_FALSE;
1651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->swapbytes = GL_TRUE;
1654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_visual = v;
16573b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul   c->xm_draw_buffer = NULL;   /* set later by XMesaMakeCurrent */
16583b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul   c->xm_read_buffer = NULL;   /* set later by XMesaMakeCurrent */
1659693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->display = v->display;
1661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1663ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   ctx->Driver.UpdateState = xmesa_update_state;
1664a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell
1665ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   /* Initialize the software rasterizer and helper modules.
1666ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell    */
1667ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   _swrast_CreateContext( ctx );
1668cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _ac_CreateContext( ctx );
166923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell   _tnl_CreateContext( ctx );
1670cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swsetup_CreateContext( ctx );
1671ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1672ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   xmesa_register_swrast_functions( ctx );
1673ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1674709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /* Set up some constant pointers:
1675709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    */
1676709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   xmesa_init_pointers( ctx );
1677709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
16787a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   return c;
1679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyContext( XMesaContext c )
1685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
16873b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul   if (c->xm_draw_buffer && c->xm_buffer->FXctx)
16883b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      fxMesaDestroyContext(c->xm_draw_buffer->FXctx);
1689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1690ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   if (c->gl_ctx) {
1691ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell      _swsetup_DestroyContext( c->gl_ctx );
1692ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell      _swrast_DestroyContext( c->gl_ctx );
1693709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _tnl_DestroyContext( c->gl_ctx );
1694709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _ac_DestroyContext( c->gl_ctx );
1695b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_context( c->gl_ctx );
1696ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   }
1697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE( c );
1699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XXX this isn't a public function!  It's a hack for the 3Dfx driver.
1705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X window.
1706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual
1707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         w - the window
1708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         c - the context
1709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  new XMesaBuffer or NULL if error
1710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1711693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
1712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      XMesaContext c )
1713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes attr;
1716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *fxEnvVar;
1719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b) {
1724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
1728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)w)->id);
1731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v);
1734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
17367a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) {
1737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
17387a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   XGetWindowAttributes( v->display, w, &attr );
17397a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell
17407a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (GET_VISUAL_DEPTH(v) != attr.depth) {
1741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_DEBUG")) {
1743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fprintf(stderr, "XMesaCreateWindowBuffer: depth mismatch between visual and window!\n");
1744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->xm_visual = v;
1749a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   b->type = WINDOW;
1750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->display = v->display;
1751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (attr.colormap) {
1755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->cmap = attr.colormap;
1756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_DEBUG")) {
1759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fprintf(stderr, "Window %u has no colormap!\n", (unsigned int) w);
1760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* this is weird, a window w/out a colormap!? */
1762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* OK, let's just allocate a new one and hope for the best */
1763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* determine back buffer implementation */
17681832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (v->mesa_visual.doubleBufferMode) {
1769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->ximage_flag) {
1770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_XIMAGE;
1771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1772693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_PIXMAP;
1774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1775693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->db_state = 0;
1778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17801832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_framebuffer(&b->mesa_buffer,
17811832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                &v->mesa_visual,
17821832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.depthBits > 0,
17831832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.stencilBits > 0,
17841832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.accumRedBits > 0,
17851832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.alphaBits > 0 );
1786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17871832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
1788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      (XMesaDrawable)w, b->cmap )) {
1789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1793693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   fxEnvVar = getenv("MESA_GLX_FX");
1795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fxEnvVar) {
17967a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell     if (fxEnvVar[0]!='d') {
17977a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int attribs[100];
17987a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int numAttribs = 0;
17997a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int hw;
18001832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.depthBits > 0) {
18017a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
18027a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = 1;
18037a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18041832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.doubleBufferMode) {
18057a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
18067a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18071832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.accumRedBits > 0) {
18087a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_ACCUM_SIZE;
18091832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul	 attribs[numAttribs++] = v->mesa_visual.accumRedBits;
18107a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18111832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.stencilBits > 0) {
18127a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_STENCIL_SIZE;
18131832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul         attribs[numAttribs++] = v->mesa_visual.stencilBits;
18147a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18151832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.alphaBits > 0) {
18167a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
18177a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = 1;
18187a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18197a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       if (c->gl_ctx) {
1820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#define FXMESA_SHARE_CONTEXT 990099  /* keep in sync with fxapi.c! */
18217a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
18227a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = (int) c->gl_ctx;
18237a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18247a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       attribs[numAttribs++] = FXMESA_NONE;
18257a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell
18267a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       if ((hw = fxQueryHardware())==GR_SSTTYPE_VOODOO) {
18277a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
18287a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         if ((v->undithered_pf!=PF_INDEX) && (b->backimage)) {
18297a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
18307a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
18317a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	     b->FXwindowHack = b->FXctx ? GL_TRUE : GL_FALSE;
18327a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   else
18337a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	     b->FXwindowHack = GL_FALSE;
18347a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         }
18357a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18367a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       else {
18377a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
18387a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE,
18397a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell					  GR_REFRESH_75Hz, attribs);
18407a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         else
18417a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
18427a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXisHackUsable = GL_FALSE;
18437a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXwindowHack = GL_FALSE;
18447a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18457a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       /*
18467a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       fprintf(stderr,
18477a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell               "voodoo %d, wid %d height %d hack: usable %d active %d\n",
18487a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell               hw, b->width, b->height, b->FXisHackUsable, b->FXwindowHack);
18497a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       */
18507a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell     }
1851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr,"WARNING: This Mesa Library includes the Glide driver but\n");
1854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr,"         you have not defined the MESA_GLX_FX env. var.\n");
1855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr,"         (check the README.3DFX file for more information).\n\n");
1856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr,"         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
1857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1864693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w )
1865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaCreateWindowBuffer2( v, w, NULL );
1867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X pixmap.
1872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual
1873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         p - the pixmap
1874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - the colormap, may be 0 if using a TrueColor or DirectColor
1875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                visual for the pixmap
1876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  new XMesaBuffer or NULL if error
1877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1878693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
1879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     XMesaPixmap p, XMesaColormap cmap )
1880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b) {
1884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1888693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1889693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)p)->id);
1890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v);
1893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->xm_visual = v;
1895a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   b->type = PIXMAP;
1896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->display = v->display;
1897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->cmap = cmap;
1898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* determine back buffer implementation */
19001832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (v->mesa_visual.doubleBufferMode) {
1901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->ximage_flag) {
1902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_XIMAGE;
1903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_PIXMAP;
1906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->db_state = 0;
1910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
19121832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_framebuffer(&b->mesa_buffer,
19131832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                &v->mesa_visual,
19141832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.depthBits > 0,
19151832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.stencilBits > 0,
19161832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.accumRedBits +
19171832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.accumGreenBits +
19181832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.accumBlueBits > 0,
19191832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.alphaBits > 0 );
1920693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
19211832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (XMesaDrawable)p, cmap)) {
1923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1930693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1932190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul#if 0 /* not done */
1933190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian PaulXMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
1934190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                unsigned int width, unsigned int height )
1935190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul{
1936190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   int client = 0;
1937190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1938190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (!b) {
1939190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      return NULL;
1940190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1941190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1942190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   b->xm_visual = v;
1943190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   b->pbuffer_flag = GL_TRUE;
1944190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   b->display = v->display;
1945190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   b->cmap = cmap;
1946190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1947190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   /* determine back buffer implementation */
1948190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (v->mesa_visual.doubleBufferMode) {
1949190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      if (v->ximage_flag) {
1950190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 b->db_state = BACK_XIMAGE;
1951190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      }
1952190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      else {
1953190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 b->db_state = BACK_PIXMAP;
1954190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      }
1955190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1956190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   else {
1957190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      b->db_state = 0;
1958190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1959190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1960190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   _mesa_initialize_framebuffer(&b->mesa_buffer,
1961190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                &v->mesa_visual,
1962190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.depthBits > 0,
1963190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.stencilBits > 0,
1964190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.accumRedBits +
1965190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.accumGreenBits +
1966190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.accumBlueBits > 0,
1967190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.alphaBits > 0 );
1968190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1969190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1970190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul				     0, cmap)) {
1971190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      free_xmesa_buffer(client, b);
1972190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      return NULL;
1973190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1974190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1975190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   return b;
1976190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul}
1977190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul#endif
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
1989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->frontbuffer)
1990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       client = CLIENT_ID(b->frontbuffer->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
1997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage) {
1998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
1999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (b->shm) {
2000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XShmDetach( b->xm_visual->display, &b->shminfo );
2001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XDestroyImage( b->backimage );
2002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   shmdt( b->shminfo.shmaddr );
2003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
2004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       else
2005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaDestroyImage( b->backimage );
2007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backpixmap) {
2009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
2010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->xm_visual->hpcr_clear_flag) {
2011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaFreePixmap( b->xm_visual->display,
2012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			 b->xm_visual->hpcr_clear_pixmap );
2013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaDestroyImage( b->xm_visual->hpcr_clear_ximage );
2014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->rowimage) {
2017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE( b->rowimage->data );
2018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage->data = NULL;
2019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaDestroyImage( b->rowimage );
2020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   free_xmesa_buffer(client, b);
2023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
2029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2030693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
2031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaMakeCurrent2( c, b, b );
2033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
2038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2039693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
2040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                             XMesaBuffer readBuffer )
2041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
2043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!drawBuffer || !readBuffer)
2044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;  /* must specify buffers! */
2045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (drawBuffer->FXctx) {
2048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaMakeCurrent(drawBuffer->FXctx);
2049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20503b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul         c->xm_draw_buffer = drawBuffer;
2051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->xm_read_buffer = readBuffer;
20523b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul         c->xm_buffer = drawBuffer;
2053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
2055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2057b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      if (c->gl_ctx == _mesa_get_current_context()
20583b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul          && c->xm_draw_buffer == drawBuffer
2059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          && c->xm_read_buffer == readBuffer
20603b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul          && c->xm_draw_buffer->wasCurrent) {
2061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* same context and buffer, do nothing */
2062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
2063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20653b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_draw_buffer = drawBuffer;
2066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->xm_read_buffer = readBuffer;
20673b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_buffer = drawBuffer;
2068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20691832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      _mesa_make_current2(c->gl_ctx,
20701832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                          &drawBuffer->mesa_buffer,
20711832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                          &readBuffer->mesa_buffer);
2072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (c->gl_ctx->Viewport.Width == 0) {
2074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* initialize viewport to window size */
2075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 _mesa_Viewport( 0, 0, drawBuffer->width, drawBuffer->height );
2076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 c->gl_ctx->Scissor.Width = drawBuffer->width;
2077693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 c->gl_ctx->Scissor.Height = drawBuffer->height;
2078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20801832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (c->xm_visual->mesa_visual.rgbMode) {
2081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*
2082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Must recompute and set these pixel values because colormap
2083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * can be different for different windows.
2084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
2085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->clearpixel = xmesa_color_to_pixel( c,
2086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[0],
2087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[1],
2088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[2],
2089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[3],
2090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->xm_visual->undithered_pf);
20913b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul         XMesaSetForeground(c->display, c->xm_draw_buffer->cleargc, c->clearpixel);
2092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
20953b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_draw_buffer->wasCurrent = GL_TRUE;
2096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Detach */
2099b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_make_current2( NULL, NULL, NULL );
2100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Unbind the context c from its buffer.
2107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2108693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaUnbindContext( XMesaContext c )
2109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* A no-op for XFree86 integration purposes */
2111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2115693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaGetCurrentContext( void )
2116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
2119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return xmesa;
2121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2128693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentBuffer( void )
2129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
2132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
21333b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      return xmesa->xm_draw_buffer;
2134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* New in Mesa 3.1 */
2142693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentReadBuffer( void )
2143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
2146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
21473b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      return xmesa->xm_read_buffer;
2148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2155693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaForceCurrent(XMesaContext c)
2156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
2158b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      if (c->gl_ctx != _mesa_get_current_context()) {
21593b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul	 _mesa_make_current(c->gl_ctx, &c->xm_draw_buffer->mesa_buffer);
2160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2163b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_make_current(NULL, NULL);
2164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2169693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaLoseCurrent(XMesaContext c)
2170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2172b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_make_current(NULL, NULL);
2173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Switch 3Dfx support hack between window and full-screen mode.
2179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2180693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaSetFXmode( GLint mode )
2181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   const char *fx = getenv("MESA_GLX_FX");
2184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fx && fx[0] != 'd') {
2185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GET_CURRENT_CONTEXT(ctx);
2186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GrHwConfiguration hw;
2187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!FX_grSstQueryHardware(&hw)) {
2188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "!grSstQueryHardware\n");*/
2189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (hw.num_sst < 1) {
2192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "hw.num_sst < 1\n");*/
2193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctx) {
2196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (mode == XMESA_FX_WINDOW) {
21983b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul	    if (xmesa->xm_draw_buffer->FXisHackUsable) {
2199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       FX_grSstControl(GR_CONTROL_DEACTIVATE);
22003b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul	       xmesa->xm_draw_buffer->FXwindowHack = GL_TRUE;
2201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       return GL_TRUE;
2202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    }
2203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else if (mode == XMESA_FX_FULLSCREEN) {
2205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    FX_grSstControl(GR_CONTROL_ACTIVATE);
22063b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul	    xmesa->xm_draw_buffer->FXwindowHack = GL_FALSE;
2207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    return GL_TRUE;
2208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else {
2210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    /* Error: Bad mode value */
2211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*fprintf(stderr, "fallthrough\n");*/
2215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) mode;
2217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
2219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Read image from VooDoo frame buffer into X/Mesa's back XImage.
2226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void FXgetImage( XMesaBuffer b )
2228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
22291d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   GET_CURRENT_CONTEXT(ctx);
2230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static unsigned short pixbuf[MAX_WIDTH];
223101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul   GLuint x, y;
223201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul   int xpos, ypos;
2233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaWindow root;
2234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned int bw, depth, width, height;
22351d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   x = b->frontbuffer->x;
2239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   y = b->frontbuffer->y;
2240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   width = b->frontbuffer->width;
2241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   height = b->frontbuffer->height;
2242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   depth = b->frontbuffer->depth;
2243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
22443ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul   XGetGeometry( b->xm_visual->display, b->frontbuffer,
224501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul                 &root, &xpos, &ypos, &width, &height, &bw, &depth);
2246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->width != width || b->height != height) {
22483ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul      b->width = MIN2((int)width, b->FXctx->width);
22493ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul      b->height = MIN2((int)height, b->FXctx->height);
2250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->width & 1)
2251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->width--;  /* prevent odd width */
2252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xmesa_alloc_back_buffer( b );
2253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   grLfbWriteColorFormat(GR_COLORFORMAT_ARGB);
22563ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul   if (b->xm_visual->undithered_pf==PF_5R6G5B) {
2257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 16bpp RGB */
2258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
22593ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                       0, b->FXctx->height - b->height,  /*pos*/
2260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->width, b->height,         /* size */
2261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->width * sizeof(GLushort), /* stride */
2262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->backimage->data);         /* dest buffer */
2263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
22643ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul   else if (b->xm_visual->dithered_pf==PF_DITHER
22653ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul	    && GET_VISUAL_DEPTH(b->xm_visual)==8) {
2266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 8bpp RGB */
2267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (y=0;y<b->height;y++) {
22683ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul         GLubyte *ptr = (GLubyte*) b->backimage->data
22693ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                        + b->backimage->bytes_per_line * y;
2270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XDITHER_SETUP(y);
2271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
22743ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                          0, b->FXctx->height-(b->height-y),
22755e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                          b->width, 1,
2276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
2280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (x=0;x<b->width;x++) {
2281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte r = (pixbuf[x] & 0xf800) >> 8;
2282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte g = (pixbuf[x] & 0x07e0) >> 3;
2283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte b = (pixbuf[x] & 0x001f) << 3;
2284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            *ptr++ = XDITHER( x, r, g, b);
2285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* General case: slow! */
2290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (y=0;y<b->height;y++) {
2291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
22933ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                          0, b->FXctx->height-(b->height-y),
22945e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                          b->width, 1,
2295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
2299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (x=0;x<b->width;x++) {
2300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutPixel(b->backimage,x,y,
2301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  xmesa_color_to_pixel(xmesa,
2302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0xf800) >> 8,
2303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x07e0) >> 3,
2304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x001f) << 3,
23053ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul					       0xff,
23063ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                                               b->xm_visual->undithered_pf));
2307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   grLfbWriteColorFormat(GR_COLORFORMAT_ABGR);
2311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy the back buffer to the front buffer.  If there's no back buffer
2317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this is a no-op.
2318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSwapBuffers( XMesaBuffer b )
2320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
232618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
2327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _mesa_swapbuffers(ctx);
2328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul     if (b->backimage) {
2341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy Ximage from host's memory to server's window */
2342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
2344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XShmPutImage( b->xm_visual->display, b->frontbuffer,
23469ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			  b->swapgc,
2347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  b->backimage, 0, 0,
2348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  0, 0, b->width, b->height, False );
2349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
2352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
23569ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   b->backimage, 0, 0,
2358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   0, 0, b->width, b->height );
2359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy pixmap to window on server */
2364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaCopyArea( b->xm_visual->display,
2366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->backpixmap,   /* source drawable */
2367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->frontbuffer,  /* dest. drawable */
23689ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
2369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0, b->width, b->height,  /* source region */
2370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0                 /* dest region */
2371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      );
2372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2375655ba5d9927187e76b66f5886d090624dc4b1dd9Brian Paul#if !defined(XFree86Server)
2376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
2377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy sub-region of back buffer to front buffer
2384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
23921d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
2393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _mesa_swapbuffers(ctx);
2394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2396536ede7e00ff5e2f10be3bf9b60cd2cfa80b3518Brian Paul      int yTop = b->height - y - height;
2397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backimage) {
2407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy Ximage from host's memory to server's window */
2408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->shm) {
2410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XShmPutImage( b->xm_visual->display, b->frontbuffer,
24129ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul                          b->swapgc,
2413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          b->backimage, x, yTop,
2414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          x, yTop, width, height, False );
2415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* wait for finished event??? */
2416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
24229ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   b->backimage, x, yTop,
2424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   x, yTop, width, height );
2425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy pixmap to window on server */
2429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaCopyArea( b->xm_visual->display,
2430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->backpixmap,           /* source drawable */
2431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->frontbuffer,          /* dest. drawable */
24329ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
2433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop, width, height,  /* source region */
2434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop                  /* dest region */
2435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      );
2436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
2443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * is a way to get "under the hood" of X/Mesa so one can manipulate the
2444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * back buffer directly.
2445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  pixmap - pointer to back buffer's Pixmap, or 0
2446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          ximage - pointer to back buffer's XImage, or NULL
2447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE = context is double buffered
2448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE = context is single buffered
2449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2450693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetBackBuffer( XMesaBuffer b,
2451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaPixmap *pixmap,
2452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaImage **ximage )
2453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (pixmap)  *pixmap = b->backpixmap;
2456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ximage)  *ximage = b->backimage;
2457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *pixmap = 0;
2461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *ximage = NULL;
2462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the depth buffer associated with an XMesaBuffer.
2469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the XMesa buffer handle
2470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  width, height - size of buffer in pixels
2471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          bytesPerValue - bytes per depth value (2 or 4)
2472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          buffer - pointer to depth buffer values
2473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2475693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint *bytesPerValue, void **buffer )
2477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
24781832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!b->mesa_buffer.DepthBuffer) {
2479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *width = 0;
2480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *height = 0;
2481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = 0;
2482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *buffer = 0;
2483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
24861832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *width = b->mesa_buffer.Width;
24871832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *height = b->mesa_buffer.Height;
2488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = sizeof(GLdepth);
24891832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *buffer = b->mesa_buffer.DepthBuffer;
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) {
25122a88946f9ad82350c2f7edc2185bf9394d2d4764Brian Paul      return "3.5";
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) {
2528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->frontbuffer==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;
2546a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul      if (b->display && b->frontbuffer && b->type == WINDOW) {
2547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* NOT_NEEDED */
2549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XSync(b->display, False);
2551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!window_exists( b->display, b->frontbuffer )) {
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{
2574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint r = (GLint) (red   * 255.0F);
2575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint g = (GLint) (green * 255.0F);
2576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint b = (GLint) (blue  * 255.0F);
2577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint a = (GLint) (alpha * 255.0F);
2578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (xmesa->pixelformat) {
2580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_INDEX:
2581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
2582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_TRUECOLOR:
2583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
2586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
2589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
2590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
2591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
2592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
2593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
2594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_DITHER:
2595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
2597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( x, y, r, g, b );
2598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_1BIT:
2600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
2601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
2602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
2603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(x, y, r, g, b);
2604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_LOOKUP:
2605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
2607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
2608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_GRAYSCALE:
2610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
2611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_DITHER_5R6G5B:
2612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
2613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_TRUEDITHER:
2614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, x, y, r, g, b);
2617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
262008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
2621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
2623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
262618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul/*
262718a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * This is typically called when the window size changes and we need
262818a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * to reallocate the buffer's back/depth/stencil/accum buffers.
262918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul */
263018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paulvoid XMesaResizeBuffers( XMesaBuffer b )
263118a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul{
263218a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   xmesa_resize_buffers( &(b->mesa_buffer) );
263318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul
263418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul}
263518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul
2636