xm_api.c revision ec0585883a85a495d94e24970d64e5d6fc889147
1ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell/* $Id: xm_api.c,v 1.6 2000/11/05 18:26:12 keithw Exp $ */
2693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
3693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
4693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa 3-D graphics library
5693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Version:  3.3
6693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
7693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
8693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
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:
15693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
16693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The above copyright notice and this permission notice shall be included
17693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in all copies or substantial portions of the Software.
18693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
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 */
26693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
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"
72693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "matrix.h"
73693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "mem.h"
74693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "types.h"
75693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef HAVE_CONFIG_H
76693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "conf.h"
77693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
78a4575499679d9d91055a35c7673b81872ec127cbJouk Jansen#include "macros.h"
79724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/swrast.h"
80ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell#include "swrast_setup/swrast_setup.h"
81693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
82693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef GLX_NONE_EXT
83693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#define GLX_NONE_EXT 0x8000
84693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
85693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
86693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
87693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
88693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Global X driver lock
89693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
90693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul_glthread_Mutex _xmesa_lock;
91693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
92693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
93693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
94693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
95693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Lookup tables for HPCR pixel format:
96693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
97693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic short hpcr_rgbTbl[3][256] = {
98693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
99693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul},
116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul},
134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 40,  40,  41,  41,  42,  42,  43,  43,  44,  44,  45,  45,  46,  46,  47,  47,
137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  86,  86,  87,  87,
142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul};
153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                     X Utility Functions                    *****/
158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * X/Mesa error reporting function:
163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void error( const char *msg )
165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (getenv("MESA_DEBUG"))
167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf( stderr, "X/Mesa error: %s\n", msg );
168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the host's byte order as LSBFirst or MSBFirst ala X.
173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int host_byte_order( void )
176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i = 1;
178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *cptr = (char *) &i;
179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return (*cptr==1) ? LSBFirst : MSBFirst;
180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Error handling.
186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int mesaXErrorFlag = 0;
189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event )
191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) event;
194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mesaXErrorFlag = 1;
195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Check if the X Shared Memory extension is available.
202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  0 = not available
203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          1 = shared XImage support available
204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          2 = shared Pixmap support available also
205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int check_for_xshm( XMesaDisplay *display )
208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM
210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int major, minor, ignore;
211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Bool pixmaps;
212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return (pixmaps==True) ? 2 : 1;
216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return 0;
219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Can't compile XSHM support */
226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the width and height of the given drawable.
234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void get_drawable_size( XMesaDisplay *dpy, XMesaDrawable d,
236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               unsigned int *width, unsigned int *height)
237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    (void) dpy;
240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    *width = d->width;
241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    *height = d->height;
242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Window root;
244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int x, y;
245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned int bw, depth;
246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   _glthread_LOCK_MUTEX(_xmesa_lock);
248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetGeometry( dpy, d, &root, &x, &y, width, height, &bw, &depth );
249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   _glthread_UNLOCK_MUTEX(_xmesa_lock);
250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Apply gamma correction to an intensity value in [0..max].  Return the
256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * new intensity value.
257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLint gamma_adjust( GLfloat gamma, GLint value, GLint max )
259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma == 1.0) {
261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return value;
262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double x = (double) value / (double) max;
265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return (GLint) ((GLfloat) max * pow( x, 1.0F/gamma ) + 0.5F);
266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the true number of bits per pixel for XImages.
273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * For example, if we request a 24-bit deep visual we may actually need/get
274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 32bpp XImages.  This function returns the appropriate bpp.
275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the X display
276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - desribes the visual to be used for XImages
277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  true number of bits per pixel for XImages
278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#define GET_BITS_PER_PIXEL(xmv) bits_per_pixel(xmv)
280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv )
284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   const int depth = visinfo->nplanes;
287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (screenInfo.formats[i].depth == depth)
290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return screenInfo.formats[i].bitsPerPixel;
291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return depth;  /* should never get here, but this should be safe */
293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv )
298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDisplay *dpy = xmv->display;
300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaImage *img;
302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bitsPerPixel;
303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Create a temporary XImage */
304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       ZPixmap, 0,           /*format, offset*/
306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       (char*) MALLOC(8),    /*data*/
307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       1, 1,                 /*width, height*/
308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       32,                   /*bitmap_pad*/
309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       0                     /*bytes_per_line*/
310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     );
311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(img);
312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* grab the bits/pixel value */
313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bitsPerPixel = img->bits_per_pixel;
314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* free the XImage */
315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE( img->data );
316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img->data = NULL;
317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDestroyImage( img );
318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bitsPerPixel;
319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Determine if a given X window ID is valid (window exists).
326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this by calling XGetWindowAttributes() for the window and
327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * checking if we catch an X error.
328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the display
329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         win - the window to check for existance
330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE - window exists
331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE - window doesn't exist
332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean WindowExistsFlag;
335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (xerr->error_code == BadWindow) {
340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      WindowExistsFlag = GL_FALSE;
341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes wa;
348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   WindowExistsFlag = GL_TRUE;
350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler(window_exists_err_handler);
351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSetErrorHandler(old_handler);
353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return WindowExistsFlag;
354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                Linked list of XMesaBuffers                 *****/
361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer XMesaBufferList = NULL;
364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Allocate a new XMesaBuffer, add to linked list */
367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer alloc_xmesa_buffer(void)
368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b) {
371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->Next = XMesaBufferList;
372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBufferList = b;
373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Find an XMesaBuffer by matching X display and colormap but NOT matching
380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the notThis buffer.
381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer find_xmesa_buffer(XMesaDisplay *dpy,
383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                     XMesaColormap cmap,
384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                     XMesaBuffer notThis)
385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Free an XMesaBuffer, remove from linked list, perhaps free X colormap
398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * entries.
399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void free_xmesa_buffer(int client, XMesaBuffer buffer)
401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer prev = NULL, b;
403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b==buffer) {
406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* unlink bufer from list */
407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (prev)
408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            prev->Next = buffer->Next;
409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaBufferList = buffer->Next;
411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Check to free X colors */
412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (buffer->num_alloced>0) {
413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* If no other buffer uses this X colormap then free the colors. */
414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!find_xmesa_buffer(buffer->display, buffer->cmap, buffer)) {
415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               (void)FreeColors(buffer->cmap, client,
417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				buffer->num_alloced, buffer->alloced_colors,
418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				0);
419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               XFreeColors(buffer->display, buffer->cmap,
421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                           buffer->alloced_colors, buffer->num_alloced, 0);
422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         FREE(buffer);
426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return;
427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* continue search */
429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prev = b;
430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* buffer not found in XMesaBufferList */
432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gl_problem(NULL,"free_xmesa_buffer() - buffer not found\n");
433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Copy X color table stuff from one XMesaBuffer to another. */
437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void copy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   dst->num_alloced = src->num_alloced;
444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->alloced_colors, src->alloced_colors,
445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          sizeof(src->alloced_colors));
446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                   Misc Private Functions                   *****/
452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return number of bits set in n.
457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bitcount( unsigned long n )
459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bits;
461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (bits=0; n>0; n=n>>1) {
462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (n&1) {
463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bits++;
464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bits;
467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Allocate a shared memory XImage back buffer for the given XMesaBuffer.
473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE if success, GL_FALSE if error
474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean alloc_shm_back_buffer( XMesaBuffer b )
477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM
479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * We have to do a _lot_ of error checking here to be sure we can
481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * really use the XSHM extension.  It seems different servers trigger
482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * errors at different points if the extension won't work.  Therefore
483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to be very careful...
484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GC gc;
486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay *, XErrorEvent * );
487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->backimage = XShmCreateImage( b->xm_visual->display,
489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                   b->xm_visual->visinfo->visual,
490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                   b->xm_visual->visinfo->depth,
491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				   ZPixmap, NULL, &b->shminfo,
492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				   b->width, b->height );
493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage == NULL) {
494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      error("alloc_back_buffer: Shared memory error (XShmCreateImage), disabling.");
495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.shmid = shmget( IPC_PRIVATE, b->backimage->bytes_per_line
500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			     * b->backimage->height, IPC_CREAT|0777 );
501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->shminfo.shmid < 0) {
502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_DEBUG"))
503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          perror("alloc_back_buffer");
504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      error("alloc_back_buffer: Shared memory error (shmget), disabling.");
507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.shmaddr = b->backimage->data
512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      = (char*)shmat( b->shminfo.shmid, 0, 0 );
513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->shminfo.shmaddr == (char *) -1) {
514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_DEBUG"))
515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          perror("alloc_back_buffer");
516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      error("alloc_back_buffer: Shared memory error (shmat), disabling.");
520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.readOnly = False;
525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mesaXErrorFlag = 0;
526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler( mesaHandleXError );
527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* This may trigger the X protocol error we're ready to catch: */
528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XShmAttach( b->xm_visual->display, &b->shminfo );
529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (mesaXErrorFlag) {
532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* we are on a remote display, this error is normal, don't print it */
533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XFlush( b->xm_visual->display );
534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      mesaXErrorFlag = 0;
535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmdt( b->shminfo.shmaddr );
537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      (void) XSetErrorHandler( old_handler );
541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   shmctl( b->shminfo.shmid, IPC_RMID, 0 ); /* nobody else needs it */
545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Finally, try an XShmPutImage to be really sure the extension works */
547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gc = XCreateGC( b->xm_visual->display, b->frontbuffer, 0, NULL );
548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XShmPutImage( b->xm_visual->display, b->frontbuffer, gc,
549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		 b->backimage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False );
550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XFreeGC( b->xm_visual->display, gc );
552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) XSetErrorHandler( old_handler );
553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (mesaXErrorFlag) {
554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XFlush( b->xm_visual->display );
555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      mesaXErrorFlag = 0;
556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmdt( b->shminfo.shmaddr );
558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage) {
565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int height = b->backimage->height;
566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR1 macro */
567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width1 = b->backimage->bytes_per_line;
568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin1 = (GLubyte *) b->backimage->data
569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width1 * (height-1);
570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR2 macro */
571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width2 = b->backimage->bytes_per_line / 2;
572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin2 = (GLushort *) b->backimage->data
573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width2 * (height-1);
574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR3 macro */
575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width3 = b->backimage->bytes_per_line;
576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin3 = (GLubyte *) b->backimage->data
577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width3 * (height-1);
578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR4 macro */
579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width4 = b->backimage->width;
580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin4 = (GLuint *) b->backimage->data
581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width4 * (height-1);
582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Can't compile XSHM support */
587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup an off-screen pixmap or Ximage to use as the back buffer.
596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the X/Mesa buffer
597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid xmesa_alloc_back_buffer( XMesaBuffer b )
599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state==BACK_XIMAGE) {
601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Deallocate the old backimage, if any */
602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backimage) {
603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XShmDetach( b->xm_visual->display, &b->shminfo );
606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XDestroyImage( b->backimage );
607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    shmdt( b->shminfo.shmaddr );
608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaDestroyImage( b->backimage );
612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = NULL;
613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Allocate new back buffer */
616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Allocate a regular XImage for the back buffer. */
619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = XMesaCreateImage(b->xm_visual->BitsPerPixel,
620693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 b->width, b->height, NULL);
621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->shm==0
623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  || alloc_shm_back_buffer(b)==GL_FALSE
624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  ) {
625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Allocate a regular XImage for the back buffer. */
626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = XCreateImage( b->xm_visual->display,
627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      b->xm_visual->visinfo->visual,
628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      GET_VISUAL_DEPTH(b->xm_visual),
629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      ZPixmap, 0,   /* format, offset */
630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      NULL, b->width, b->height,
631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      8, 0 );  /* pad, bytes_per_line */
632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!b->backimage) {
634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    error("alloc_back_buffer: XCreateImage failed.");
635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->backimage->data = (char *) MALLOC( b->backimage->height
637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                             * b->backimage->bytes_per_line );
638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!b->backimage->data) {
639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            error("alloc_back_buffer: MALLOC failed.");
640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaDestroyImage( b->backimage );
641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->backimage = NULL;
642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backpixmap = None;
645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (b->db_state==BACK_PIXMAP) {
647693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaPixmap old_pixmap = b->backpixmap;
648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Free the old back pixmap */
649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backpixmap) {
650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Allocate new back pixmap */
653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backpixmap = XMesaCreatePixmap( b->xm_visual->display, b->frontbuffer,
654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 b->width, b->height,
655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 GET_VISUAL_DEPTH(b->xm_visual) );
656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* update other references to backpixmap */
658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->buffer==(XMesaDrawable)old_pixmap) {
659693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->buffer = (XMesaDrawable)b->backpixmap;
660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * A replacement for XAllocColor.  This function should never
668693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * fail to allocate a color.  When XAllocColor fails, we return
669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the nearest matching color.  If we have to allocate many colors
670693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this function isn't too efficient; the XQueryColors() could be
671693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * done just once.
672693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Written by Michael Pichler, Brian Paul, Mark Kilgard
673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - X display
674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - X colormap
675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmapSize - size of colormap
676693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In/Out: color - the XColor struct
677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  exact - 1=exact color match, 0=closest match
678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          alloced - 1=XAlloc worked, 0=XAlloc failed
679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void
681693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulnoFaultXAllocColor( int client,
682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaDisplay *dpy,
683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColormap cmap,
684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int cmapSize,
685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColor *color,
686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int *exact, int *alloced )
687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Pixel *ppixIn;
690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   xrgb *ctable;
691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* we'll try to cache ctable for better remote display performance */
693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static Display *prevDisplay = NULL;
694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColormap prevCmap = 0;
695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static int prevCmapSize = 0;
696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColor *ctable = NULL;
697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaColor subColor;
699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i, bestmatch;
700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double mindist;       /* 3*2^16^2 exceeds long int precision. */
701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* First try just using XAllocColor. */
705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->red, &color->green, &color->blue,
708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->pixel,
709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, color)) {
712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *exact = 1;
714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return;
716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Alloc failed, search for closest match */
719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Retrieve color table entries. */
721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* XXX alloca candidate. */
722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ppixIn[i] = i;
727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   QueryColors(cmap, cmapSize, ppixIn, ctable);
729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (prevDisplay != dpy || prevCmap != cmap
731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       || prevCmapSize != cmapSize || !ctable) {
732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* free previously cached color table */
733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctable)
734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         FREE(ctable);
735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Get the color table from X */
736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(ctable);
738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i = 0; i < cmapSize; i++) {
739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         ctable[i].pixel = i;
740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XQueryColors(dpy, cmap, ctable, cmapSize);
742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevDisplay = dpy;
743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmap = cmap;
744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmapSize = cmapSize;
745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Find best match. */
749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bestmatch = -1;
750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mindist = 0.0;
751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dist = dr * dr + dg * dg + db * db;
756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (bestmatch < 0 || dist < mindist) {
757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bestmatch = i;
758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         mindist = dist;
759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Return result. */
763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.red   = ctable[bestmatch].red;
764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.green = ctable[bestmatch].green;
765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.blue  = ctable[bestmatch].blue;
766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Try to allocate the closest match color.  This should only
767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * fail if the cell is read/write.  Otherwise, we're incrementing
768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the cell's reference count.
769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
772693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.red, &subColor.green, &subColor.blue,
773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.pixel,
774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
775693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, &subColor)) {
777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* do this to work around a problem reported by Frank Ortega */
782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.pixel = (unsigned long) bestmatch;
783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.red   = ctable[bestmatch].red;
784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.green = ctable[bestmatch].green;
785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.blue  = ctable[bestmatch].blue;
786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.flags = DoRed | DoGreen | DoBlue;
787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 0;
788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(ppixIn);
791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(ctable);
792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
793693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* don't free table, save it for next time */
794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *color = subColor;
797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *exact = 0;
798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do setup for PF_GRAYSCALE pixel format.
805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Note that buffer may be NULL.
806693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
807693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_grayscale( int client, XMesaVisual v,
808693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  XMesaBuffer buffer, XMesaColormap cmap )
809693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
810693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
811693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
812693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
813693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
814693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
815693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
816693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
817693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
818693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
823693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          (buffer->xm_visual->gl_visual->RGBAflag ==
824693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul           prevBuffer->xm_visual->gl_visual->RGBAflag)) {
825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous XMesaBuffer which uses same
826693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate 256 shades of gray */
832693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int gray;
833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (gray=0;gray<256;gray++) {
835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            int exact, alloced;
839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaColor xcol;
840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.red   = (r << 8) | r;
841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.green = (g << 8) | g;
842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.blue  = (b << 8) | b;
843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            noFaultXAllocColor( client, v->display,
844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                cmap, GET_COLORMAP_SIZE(v),
845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                &xcol, &exact, &alloced );
846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!exact) {
847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               colorsfailed++;
848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (alloced) {
850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               assert(buffer->num_alloced<256);
851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->num_alloced++;
853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*OLD
856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(gray < 576);
857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+0] = xcol.pixel;
858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+1] = xcol.pixel;
859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+2] = xcol.pixel;
860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            */
865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray] = xcol.pixel;
866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray;
868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray;
869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray;
870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (colorsfailed && getenv("MESA_DEBUG")) {
873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            fprintf( stderr,
874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of 256 needed colors do not match exactly.\n",
875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  colorsfailed );
876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_GRAYSCALE;
881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_GRAYSCALE;
882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
888693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a PseudoColor, StaticColor,
889693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * color.  While this function was originally designed just for 8-bit
892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Dithering code contributed by Bob Mercier.
894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_dithered_color( int client, XMesaVisual v,
896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       XMesaBuffer buffer, XMesaColormap cmap )
897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          (buffer->xm_visual->gl_visual->RGBAflag ==
912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul           prevBuffer->xm_visual->gl_visual->RGBAflag)) {
913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous, matching XMesaBuffer.
914693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Do this to avoid time spent in noFaultXAllocColor.
915693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
916693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate X colors and initialize color_table[], red_table[], etc */
920693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int r, g, b, i;
921693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (r = 0; r < _R; r++) {
923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            for (g = 0; g < _G; g++) {
924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               for (b = 0; b < _B; b++) {
925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  XMesaColor xcol;
926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  int exact, alloced;
927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(_R-1),65535);
928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(_G-1),65535);
929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(_B-1),65535);
930693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  noFaultXAllocColor( client, v->display,
931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      cmap, GET_COLORMAP_SIZE(v),
932693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      &xcol, &exact, &alloced );
933693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (!exact) {
934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     colorsfailed++;
935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (alloced) {
937693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     assert(buffer->num_alloced<256);
938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
939693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->num_alloced++;
940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  i = _MIX( r, g, b );
942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(i < 576);
943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->color_table[i] = xcol.pixel;
944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(xcol.pixel < 65536);
945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (_R-1);
946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (_G-1);
947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (_B-1);
948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               }
949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
952693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (colorsfailed && getenv("MESA_DEBUG")) {
953693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            fprintf( stderr,
954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of %d needed colors do not match exactly.\n",
955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  colorsfailed, _R*_G*_B );
956693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
957693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
958693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
959693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_DITHER;
961693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_LOOKUP;
962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
963693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Special dithering tables have to be initialized.
970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_8bit_hpcr( XMesaVisual v )
972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
973693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * on the root window AND the colormap obtainable by XGetRGBColormaps
976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * for that atom must be set on the window.  (see also tkInitWindow)
977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If that colormap is not set, the output will look stripy.
978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Setup color tables with gamma correction */
981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double g;
983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->RedGamma;
985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint red = (GLint) (255.0 * pow( hpcr_rgbTbl[0][i]/255.0, g ) + 0.5);
987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->GreenGamma;
991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint green = (GLint) (255.0 * pow( hpcr_rgbTbl[1][i]/255.0, g ) + 0.5);
993693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
994693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->BlueGamma;
997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint blue = (GLint) (255.0 * pow( hpcr_rgbTbl[2][i]/255.0, g ) + 0.5);
999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
1000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
1002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_HPCR;
1003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* which method should I use to clear */
1005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_FALSE: keep the ordinary method  */
1006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_TRUE : clear with dither pattern */
1007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->hpcr_clear_flag = getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
1008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (v->hpcr_clear_flag) {
1010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
1011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               DefaultRootWindow(v->display),
1012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               16, 2, 8);
1013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
1015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       0, 0, 16, 2, AllPlanes, ZPixmap);
1016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a True/DirectColor visual.
1023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
1025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                             XMesaWindow window, XMesaColormap cmap )
1026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned long rmask, gmask, bmask;
1028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) buffer;
1029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) window;
1030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) cmap;
1031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute red multiplier (mask) and bit shift */
1033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->rshift = 0;
1034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   rmask = GET_REDMASK(v);
1035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((rmask & 1)==0) {
1036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->rshift++;
1037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      rmask = rmask >> 1;
1038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute green multiplier (mask) and bit shift */
1041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->gshift = 0;
1042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gmask = GET_GREENMASK(v);
1043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((gmask & 1)==0) {
1044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->gshift++;
1045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gmask = gmask >> 1;
1046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute blue multiplier (mask) and bit shift */
1049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bshift = 0;
1050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bmask = GET_BLUEMASK(v);
1051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((bmask & 1)==0) {
1052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->bshift++;
1053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      bmask = bmask >> 1;
1054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Compute component-to-pixel lookup tables and dithering kernel
1058693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      static GLubyte kernel[16] = {
1061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          0*16,  8*16,  2*16, 10*16,
1062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         12*16,  4*16, 14*16,  6*16,
1063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          3*16, 11*16,  1*16,  9*16,
1064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         15*16,  7*16, 13*16,  5*16,
1065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      };
1066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint rBits = bitcount(rmask);
1067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint gBits = bitcount(gmask);
1068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint bBits = bitcount(bmask);
1069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint minBits;
1070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLuint i;
1071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
1073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=rmask; i++)
1074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
1075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=gmask; i++)
1076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
1077693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=bmask; i++)
1078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
1079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert RGB values from [0,255] to pixel components */
1081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<256;i++) {
1083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint r = gamma_adjust(v->RedGamma,   i, 255);
1084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint g = gamma_adjust(v->GreenGamma, i, 255);
1085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
1086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
1087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
1088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
1089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* overflow protection */
1091693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=256;i<512;i++) {
1092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = v->RtoPixel[255];
1093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = v->GtoPixel[255];
1094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = v->BtoPixel[255];
1095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* setup dithering kernel */
1098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      minBits = rBits;
1099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (gBits < minBits)  minBits = gBits;
1100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (bBits < minBits)  minBits = bBits;
1101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<16;i++) {
1102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->Kernel[i] = kernel[i] >> minBits;
1103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = PF_TRUECOLOR;
1106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_TRUEDITHER : PF_TRUECOLOR;
1107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Now check for TrueColor visuals which we can optimize.
1111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (   GET_REDMASK(v)  ==0x0000ff
1113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_GREENMASK(v)==0x00ff00
1114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_BLUEMASK(v) ==0xff0000
1115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
1117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on SGI, Sun */
1120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R;
1121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
1123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
1127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on Linux, HP, IBM */
1130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8R8G8B;
1131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
1133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==24
1137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common packed 24 bpp config used on Linux */
1140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8R8G8B24;
1141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xf800
1143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x07e0
1144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x001f
1145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==16
1147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLushort)==2
1148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* 5-6-5 color weight on common PC VGA boards */
1150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = PF_5R6G5B;
1151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->dithered_pf = PF_DITHER_5R6G5B;
1152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xe0
1154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x1c
1155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x03
1156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_FOR_HPCR(v)) {
1157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      setup_8bit_hpcr( v );
1158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a monochrome visual.
1165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_monochrome( XMesaVisual v, XMesaBuffer b )
1167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) b;
1169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = v->undithered_pf = PF_1BIT;
1170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* if black=1 then we must flip pixel values */
1171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
1172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * When a context is "made current" for the first time, we can finally
1178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * finish initializing the context's visual and buffer information.
1179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual to initialize
1180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         b - the XMesaBuffer to initialize (may be NULL)
1181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - TRUE = RGBA mode, FALSE = color index mode
1182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         window - the window/pixmap we're rendering into
1183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - the colormap associated with the window/pixmap
1184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE=success, GL_FALSE=failure
1185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean initialize_visual_and_buffer( int client,
1187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaVisual v,
1188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaBuffer b,
1189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               GLboolean rgb_flag,
1190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaDrawable window,
1191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaColormap cmap
1192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                             )
1193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGCValues gcvalues;
1196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b) {
1199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(b->xm_visual == v);
1200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save true bits/pixel */
1203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->BitsPerPixel = GET_BITS_PER_PIXEL(v);
1204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v->BitsPerPixel > 0);
1205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (rgb_flag==GL_FALSE) {
1208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* COLOR-INDEXED WINDOW:
1209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Even if the visual is TrueColor or DirectColor we treat it as
1210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * being color indexed.  This is weird but might be useful to someone.
1211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->dithered_pf = v->undithered_pf = PF_INDEX;
1213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->index_bits = GET_VISUAL_DEPTH(v);
1214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* RGB WINDOW:
1217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * We support RGB rendering into almost any kind of visual.
1218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int xclass;
1220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xclass = GET_VISUAL_CLASS(v);
1221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (xclass==TrueColor || xclass==DirectColor) {
1222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 setup_truecolor( v, b, (XMesaWindow)window, cmap );
1223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if (xclass==StaticGray && GET_VISUAL_DEPTH(v)==1) {
1225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 setup_monochrome( v, b );
1226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if (xclass==GrayScale || xclass==StaticGray) {
1228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!setup_grayscale( client, v, b, cmap )) {
1229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if ((xclass==PseudoColor || xclass==StaticColor)
1233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
1234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!setup_dithered_color( client, v, b, cmap )) {
1235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 error("XMesa: RGB mode rendering not supported in given visual.");
1240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return GL_FALSE;
1241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->index_bits = 0;
1243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_NO_DITHER")) {
1245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 v->dithered_pf = v->undithered_pf;
1246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If MESA_INFO env var is set print out some debugging info
1252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * which can help Brian figure out what's going on when a user
1253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * reports bugs.
1254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (getenv("MESA_INFO")) {
1256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa visual = %p\n", v);
1257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa dithered pf = %u\n", v->dithered_pf);
1258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa undithered pf = %u\n", v->undithered_pf);
1259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa level = %d\n", v->level);
1260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
1261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr, "X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
1262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b && window) {
1265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Do window-specific initializations */
1266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Window dimensions */
1268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      unsigned int w, h;
1269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      get_drawable_size( v->display, window, &w, &h );
1270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->width = w;
1271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->height = h;
1272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->frontbuffer = window;
1274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert( v->gl_visual );
1276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Setup for single/double buffering */
1278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->gl_visual->DBflag) {
1279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Double buffered */
1280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->shm = check_for_xshm( v->display );
1282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         xmesa_alloc_back_buffer( b );
1284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->db_state==BACK_PIXMAP) {
1285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->buffer = (XMesaDrawable)b->backpixmap;
1286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else {
1288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->buffer = XIMAGE;
1289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Single Buffered */
1293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->buffer = b->frontbuffer;
1294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* X11 graphics contexts */
1297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->gc1 = CreateScratchGC(v->display, window->depth);
1299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->gc2 = CreateScratchGC(v->display, window->depth);
1300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->gc1 = XCreateGC( v->display, window, 0, NULL );
1302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->gc2 = XCreateGC( v->display, window, 0, NULL );
1303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaSetFunction( v->display, b->gc1, GXcopy );
1305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaSetFunction( v->display, b->gc2, GXcopy );
1306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
1309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Michael Pichler May 15, 1995.
1310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->cleargc = CreateScratchGC(v->display, window->depth);
1313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
1314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  CARD32 v[1];
1315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  v[0] = FALSE;
1316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  dixChangeGC(NullClient, b->cleargc, GCGraphicsExposures, v, NULL);
1317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gcvalues.graphics_exposures = False;
1320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->cleargc = XCreateGC( v->display, window,
1321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              GCGraphicsExposures, &gcvalues);
1322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaSetFunction( v->display, b->cleargc, GXcopy );
1324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Set fill style and tile pixmap once for all for HPCR stuff
1326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * (instead of doing it each time in clear_color_HPCR_pixmap())
1327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Initialize whole stuff
1328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Jacques Leroy March 8, 1998.
1329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->hpcr_clear_flag && b->buffer!=XIMAGE) {
1331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	int i;
1332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	for (i=0; i<16; i++)
1333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        {
1334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
1335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
1336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        }
1337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        XMesaPutImage(b->display, (XMesaDrawable)v->hpcr_clear_pixmap,
1338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
1339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
1340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
1341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Initialize the row buffer XImage for use in write_color_span() */
1344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1,
1346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (char *)MALLOC(MAX_WIDTH*4));
1347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XCreateImage( v->display,
1349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->visual,
1350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->depth,
1351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  ZPixmap, 0,           /*format, offset*/
1352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  (char*) MALLOC(MAX_WIDTH*4),  /*data*/
1353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  MAX_WIDTH, 1,         /*width, height*/
1354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  32,                   /*bitmap_pad*/
1355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  0                     /*bytes_per_line*/ );
1356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Convert an RGBA color to a pixel value.
1366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long
1368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulxmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLubyte a,
1369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      GLuint pixelFormat)
1370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (pixelFormat) {
1372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_INDEX:
1373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
1374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_TRUECOLOR:
1375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
1378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
1381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
1382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
1383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B24:
1385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
1386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
1387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
1388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_DITHER:
1389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
1391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( 1, 0, r, g, b );
1392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_1BIT:
1394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
1395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
1397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(1, 1, r, g, b);
1398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_LOOKUP:
1399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
1401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
1402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_GRAYSCALE:
1404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
1405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_TRUEDITHER:
1406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_DITHER_5R6G5B:
1408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, 1, 0, r, g, b);
1411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
1414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         gl_problem(NULL, "Bad pixel format in xmesa_color_to_pixel");
1415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
1417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                       Public Functions                     *****/
1422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new X/Mesa visual.
1427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  display - X11 display
1428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - an XVisualInfo pointer
1429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - GL_TRUE = RGB mode,
1430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                    GL_FALSE = color index mode
1431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         alpha_flag - alpha buffer requested?
1432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         db_flag - GL_TRUE = double-buffered,
1433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                   GL_FALSE = single buffered
1434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stereo_flag - stereo visual?
1435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                       GL_FALSE = use an off-screen pixmap for back buffer
1437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         depth_size - requested bits/depth values, or zero
1438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stencil_size - requested bits/stencil values, or zero
1439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_red_size - requested bits/red accum values, or zero
1440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_green_size - requested bits/green accum values, or zero
1441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_blue_size - requested bits/blue accum values, or zero
1442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_alpha_size - requested bits/alpha accum values, or zero
1443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         num_samples - number of samples/pixel if multisampling, or zero
1444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         level - visual level, usually 0
1445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
1446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return;  a new XMesaVisual or 0 if error.
1447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1448693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
1449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               XMesaVisualInfo visinfo,
1450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean rgb_flag,
1451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean alpha_flag,
1452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean db_flag,
1453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean stereo_flag,
1454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean ximage_flag,
1455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint depth_size,
1456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint stencil_size,
1457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_red_size,
1458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_green_size,
1459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_blue_size,
1460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_alpha_size,
1461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint num_samples,
1462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint level,
1463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint visualCaveat )
1464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *gamma;
1466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisual v;
1467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint red_bits, green_bits, blue_bits, alpha_bits;
1468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* For debugging only */
1470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (getenv("MESA_XSYNC")) {
1471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* This makes debugging X easier.
1472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * In your debugger, set a breakpoint on _XError to stop when an
1473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * X protocol error is generated.
1474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
1477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSynchronize( display, 1 );
1479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!v) {
1484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * In the X server, NULL is passed in for the display.  It will have
1489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * to be set before using this visual.  See XMesaSetVisualDisplay()
1490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * below.
1491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->display = display;
1493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save a copy of the XVisualInfo struct because the user may XFREE()
1495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the struct but we may need some of the information contained in it
1496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * at a later time.
1497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = visinfo;
1500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if(!v->visinfo) {
1503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE(v);
1504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
1507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save a copy of the pointer now so we can find this visual again
1509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * if we need to search for it in find_glx_visual().
1510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->vishandle = visinfo;
1512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Initialize the depth of the screen */
1516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       PixmapFormatRec *format;
1518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       for (format = screenInfo.formats;
1520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    format->depth != display->rootDepth;
1521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    format++)
1522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   ;
1523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       v->screen_depth = format->bitsPerPixel;
1524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* check for MESA_GAMMA environment variable */
1528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gamma = getenv("MESA_GAMMA");
1529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma) {
1530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->ximage_flag = ximage_flag;
1541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->level = level;
1542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->VisualCaveat = visualCaveat;
1543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
1545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int xclass;
1548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xclass = GET_VISUAL_CLASS(v);
1549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (xclass==TrueColor || xclass==DirectColor) {
1550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits   = bitcount(GET_REDMASK(v));
1551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = bitcount(GET_GREENMASK(v));
1552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits  = bitcount(GET_BLUEMASK(v));
1553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* this is an approximation */
1557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int depth;
1558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth = GET_VISUAL_DEPTH(v);
1559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits = depth / 3;
1560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= red_bits;
1561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = depth / 2;
1562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= green_bits;
1563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits = depth;
1564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
1566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (alpha_flag && alpha_bits == 0)
1570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      alpha_bits = 8;
1571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->gl_visual = _mesa_create_visual( rgb_flag, db_flag, stereo_flag,
1573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       red_bits, green_bits,
1574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       blue_bits, alpha_bits,
1575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       v->index_bits,
1576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       depth_size,
1577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       stencil_size,
1578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       accum_red_size, accum_green_size,
1579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       accum_blue_size, accum_alpha_size,
1580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       0 );
1581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!v->gl_visual) {
1582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE(v->visinfo);
1584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE(v);
1586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return v;
1590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSetVisualDisplay( XMesaDisplay *dpy, XMesaVisual v )
1594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    v->display = dpy;
1596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyVisual( XMesaVisual v )
1600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   _mesa_destroy_visual( v->gl_visual );
1602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(v->visinfo);
1604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(v);
1606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaContext.
1612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - XMesaVisual
1613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         share_list - another XMesaContext with which to share display
1614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                      lists or NULL if no sharing is wanted.
1615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  an XMesaContext or NULL if error.
1616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1617693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaContext c;
1620ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   GLcontext *ctx;
1621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLboolean direct = GL_TRUE; /* XXXX */
1622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* NOT_DONE: should this be GL_FALSE??? */
1623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static GLboolean firstTime = GL_TRUE;
1624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (firstTime) {
1626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _glthread_INIT_MUTEX(_xmesa_lock);
1627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      firstTime = GL_FALSE;
1628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!c) {
1632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1635ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   ctx = c->gl_ctx = _mesa_create_context( v->gl_visual,
1636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      share_list ? share_list->gl_ctx : (GLcontext *) NULL,
1637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      (void *) c, direct );
1638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!c->gl_ctx) {
1639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE(c);
1640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1643ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   gl_extensions_enable(ctx, "GL_HP_occlusion_test");
1644ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   gl_extensions_enable(ctx, "GL_ARB_texture_cube_map");
1645ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   gl_extensions_enable(ctx, "GL_EXT_texture_env_combine");
1646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1647693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (CHECK_BYTE_ORDER(v)) {
1648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->swapbytes = GL_FALSE;
1649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->swapbytes = GL_TRUE;
1652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_visual = v;
1655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->display = v->display;
1657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1659ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   ctx->Driver.UpdateState = xmesa_update_state;
1660ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   ctx->Driver.UpdateStateNotify = ~0;
1661a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell
1662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(GLX_DIRECT_RENDERING) && !defined(XFree86Server)
1663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->driContextPriv = driContextPriv;
1664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1666ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   /* Set up some constant pointers:
1667ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell    */
1668ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   xmesa_init_pointers( ctx );
1669ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1670ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   if (ctx->VB)
1671ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell      _swsetup_RegisterVB( ctx->VB );
1672ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1673ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1674ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   /* Initialize the software rasterizer and helper modules.
1675ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell    */
1676ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   _swrast_CreateContext( ctx );
1677ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   _swsetup_CreateContext( ctx );
1678ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1679ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   xmesa_register_swrast_functions( ctx );
1680ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1681ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   /* Run the config file
1682ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell    */
1683ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   _mesa_context_initialize( ctx );
1684ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return c;
1687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyContext( XMesaContext c )
1693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c->xm_buffer && c->xm_buffer->FXctx)
1696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fxMesaDestroyContext(c->xm_buffer->FXctx);
1697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1698ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   if (c->gl_ctx) {
1699ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell      _swsetup_DestroyContext( c->gl_ctx );
1700ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell      _swrast_DestroyContext( c->gl_ctx );
1701b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_context( c->gl_ctx );
1702ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   }
1703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Disassociate old buffer with this context */
1705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c->xm_buffer)
1706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       c->xm_buffer->xm_context = NULL;
1707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Destroy any buffers which are using this context.  If we don't
1709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we may have dangling references.  Hmm, maybe we should just
1710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * set the buffer's context pointer to NULL instead of deleting it?
1711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Let's see if we get any bug reports...
1712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * This contributed by Doug Rabson <dfr@calcaphon.com>
1713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer b, next;
1716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (b = XMesaBufferList; b; b = next) {
1717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         next = b->Next;
1718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!b->pixmap_flag) {
1719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XSync(b->display, False);
1721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (b->xm_context == c) {
1723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               /* found a context created for this context */
1724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               XMesaDestroyBuffer( b );
1725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
1726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE( c );
1731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XXX this isn't a public function!  It's a hack for the 3Dfx driver.
1737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X window.
1738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual
1739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         w - the window
1740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         c - the context
1741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  new XMesaBuffer or NULL if error
1742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1743693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
1744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      XMesaContext c )
1745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes attr;
1748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *fxEnvVar;
1751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b) {
1756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
1760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)w)->id);
1763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v);
1766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) {
1769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetWindowAttributes( v->display, w, &attr );
1771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1772693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v) != attr.depth) {
1773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_DEBUG")) {
1775693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fprintf(stderr, "XMesaCreateWindowBuffer: depth mismatch between visual and window!\n");
1776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->xm_context = NULL; /* Associate no context with this buffer */
1781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->xm_visual = v;
1783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->pixmap_flag = GL_FALSE;
1784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->display = v->display;
1785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (attr.colormap) {
1789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->cmap = attr.colormap;
1790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (getenv("MESA_DEBUG")) {
1793693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fprintf(stderr, "Window %u has no colormap!\n", (unsigned int) w);
1794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* this is weird, a window w/out a colormap!? */
1796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* OK, let's just allocate a new one and hope for the best */
1797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* determine back buffer implementation */
1802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (v->gl_visual->DBflag) {
1803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->ximage_flag) {
1804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_XIMAGE;
1805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1806693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1807693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_PIXMAP;
1808693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1809693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1810693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1811693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->db_state = 0;
1812693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1813693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1814b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   b->gl_buffer = _mesa_create_framebuffer( v->gl_visual,
1815b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->DepthBits > 0,
1816b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->StencilBits > 0,
1817b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->AccumRedBits > 0,
1818b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->AlphaBits > 0 );
1819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b->gl_buffer) {
1820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1823693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1824693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!initialize_visual_and_buffer( client, v, b, v->gl_visual->RGBAflag,
1825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      (XMesaDrawable)w, b->cmap )) {
1826b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_framebuffer( b->gl_buffer );
1827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1832693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   fxEnvVar = getenv("MESA_GLX_FX");
1833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fxEnvVar) {
1834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul     if (fxEnvVar[0]!='d') {
1835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       int attribs[100];
1836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       int numAttribs = 0;
1837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       int hw;
1838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (v->gl_visual->DepthBits > 0) {
1839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
1840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 attribs[numAttribs++] = 1;
1841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (v->gl_visual->DBflag) {
1843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
1844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (v->gl_visual->AccumRedBits > 0) {
1846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 attribs[numAttribs++] = FXMESA_ACCUM_SIZE;
1847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 attribs[numAttribs++] = v->gl_visual->AccumRedBits;
1848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (v->gl_visual->StencilBits > 0) {
1850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         attribs[numAttribs++] = FXMESA_STENCIL_SIZE;
1851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         attribs[numAttribs++] = v->gl_visual->StencilBits;
1852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (v->gl_visual->AlphaBits > 0) {
1854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
1855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         attribs[numAttribs++] = 1;
1856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (c->gl_ctx) {
1858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#define FXMESA_SHARE_CONTEXT 990099  /* keep in sync with fxapi.c! */
1859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
1860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         attribs[numAttribs++] = (int) c->gl_ctx;
1861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       attribs[numAttribs++] = FXMESA_NONE;
1863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if ((hw = fxQueryHardware())==GR_SSTTYPE_VOODOO) {
1865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
1866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if ((v->undithered_pf!=PF_INDEX) && (b->backimage)) {
1867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
1868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
1869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	     b->FXwindowHack = b->FXctx ? GL_TRUE : GL_FALSE;
1870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   else
1871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	     b->FXwindowHack = GL_FALSE;
1872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       else {
1875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
1876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE,
1877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					  GR_REFRESH_75Hz, attribs);
1878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
1879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
1880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->FXisHackUsable = GL_FALSE;
1881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->FXwindowHack = GL_FALSE;
1882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       /*
1884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       fprintf(stderr,
1885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               "voodoo %d, wid %d height %d hack: usable %d active %d\n",
1886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               hw, b->width, b->height, b->FXisHackUsable, b->FXwindowHack);
1887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1888693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul     }
1889693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr,"WARNING: This Mesa Library includes the Glide driver but\n");
1892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr,"         you have not defined the MESA_GLX_FX env. var.\n");
1893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr,"         (check the README.3DFX file for more information).\n\n");
1894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      fprintf(stderr,"         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
1895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(GLX_DIRECT_RENDERING) && !defined(XFree86Server)
1899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->driDrawPriv = driDrawPriv;
1900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1906693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w )
1907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaCreateWindowBuffer2( v, w, NULL );
1909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X pixmap.
1914693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual
1915693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         p - the pixmap
1916693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - the colormap, may be 0 if using a TrueColor or DirectColor
1917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                visual for the pixmap
1918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  new XMesaBuffer or NULL if error
1919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1920693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
1921693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     XMesaPixmap p, XMesaColormap cmap )
1922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b) {
1926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1930693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)p)->id);
1932693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1933693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v);
1935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->xm_context = NULL; /* Associate no context with this buffer */
1937693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->xm_visual = v;
1939693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->pixmap_flag = GL_TRUE;
1940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->display = v->display;
1941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->cmap = cmap;
1942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* determine back buffer implementation */
1944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (v->gl_visual->DBflag) {
1945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->ximage_flag) {
1946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_XIMAGE;
1947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_PIXMAP;
1950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1952693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1953693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->db_state = 0;
1954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1956b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   b->gl_buffer = _mesa_create_framebuffer( v->gl_visual,
1957b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->DepthBits > 0,
1958b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->StencilBits > 0,
1959b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->AccumRedBits +
1960b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->AccumGreenBits +
1961b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->AccumBlueBits > 0,
1962b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                            v->gl_visual->AlphaBits > 0 );
1963693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b->gl_buffer) {
1964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!initialize_visual_and_buffer(client, v, b, v->gl_visual->RGBAflag,
1969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (XMesaDrawable)p, cmap)) {
1970b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_framebuffer( b->gl_buffer );
1971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1973693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(GLX_DIRECT_RENDERING) && !defined(XFree86Server)
1976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->driDrawPriv = driDrawPriv;
1977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate an XMesaBuffer structure and all related info.
1986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyBuffer( XMesaBuffer b )
1988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->frontbuffer)
1993693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       client = CLIENT_ID(b->frontbuffer->id);
1994693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->gc1)  XMesaFreeGC( b->xm_visual->display, b->gc1 );
1997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->gc2)  XMesaFreeGC( b->xm_visual->display, b->gc2 );
1998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->cleargc)  XMesaFreeGC( b->xm_visual->display, b->cleargc );
1999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage) {
2001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (b->shm) {
2003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XShmDetach( b->xm_visual->display, &b->shminfo );
2004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XDestroyImage( b->backimage );
2005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   shmdt( b->shminfo.shmaddr );
2006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
2007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       else
2008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaDestroyImage( b->backimage );
2010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backpixmap) {
2012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
2013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->xm_visual->hpcr_clear_flag) {
2014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaFreePixmap( b->xm_visual->display,
2015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			 b->xm_visual->hpcr_clear_pixmap );
2016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaDestroyImage( b->xm_visual->hpcr_clear_ximage );
2017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->rowimage) {
2020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE( b->rowimage->data );
2021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage->data = NULL;
2022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaDestroyImage( b->rowimage );
2023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->xm_context)
2026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       b->xm_context->xm_buffer = NULL;
2027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2028b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_destroy_framebuffer( b->gl_buffer );
2029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   free_xmesa_buffer(client, b);
2030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
2036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2037693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
2038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaMakeCurrent2( c, b, b );
2040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
2045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2046693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
2047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                             XMesaBuffer readBuffer )
2048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
2050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!drawBuffer || !readBuffer)
2051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;  /* must specify buffers! */
2052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (drawBuffer->FXctx) {
2055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaMakeCurrent(drawBuffer->FXctx);
2056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Disassociate old buffer from this context */
2058693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (c->xm_buffer)
2059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            c->xm_buffer->xm_context = NULL;
2060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Associate the context with this buffer */
2062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         drawBuffer->xm_context = c;
2063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->xm_buffer = drawBuffer;
2065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->xm_read_buffer = readBuffer;
2066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->use_read_buffer = (drawBuffer != readBuffer);
2067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
2069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2071b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      if (c->gl_ctx == _mesa_get_current_context()
2072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          && c->xm_buffer == drawBuffer
2073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          && c->xm_read_buffer == readBuffer
2074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          && c->xm_buffer->wasCurrent) {
2075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* same context and buffer, do nothing */
2076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
2077693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Disassociate old buffer with this context */
2080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (c->xm_buffer)
2081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  c->xm_buffer->xm_context = NULL;
2082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      drawBuffer->xm_context = c; /* Associate the context with this buffer */
2083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->xm_buffer = drawBuffer;
2085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->xm_read_buffer = readBuffer;
2086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->use_read_buffer = (drawBuffer != readBuffer);
2087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2088b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_make_current2(c->gl_ctx, drawBuffer->gl_buffer, readBuffer->gl_buffer);
2089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (c->gl_ctx->Viewport.Width == 0) {
2091693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* initialize viewport to window size */
2092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 _mesa_Viewport( 0, 0, drawBuffer->width, drawBuffer->height );
2093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 c->gl_ctx->Scissor.Width = drawBuffer->width;
2094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 c->gl_ctx->Scissor.Height = drawBuffer->height;
2095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (c->xm_visual->gl_visual->RGBAflag) {
2098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*
2099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Must recompute and set these pixel values because colormap
2100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * can be different for different windows.
2101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
2102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->pixel = xmesa_color_to_pixel( c, c->red, c->green,
2103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                          c->blue, c->alpha, c->pixelformat );
2104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaSetForeground( c->display, c->xm_buffer->gc1, c->pixel );
2105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->clearpixel = xmesa_color_to_pixel( c,
2106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[0],
2107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[1],
2108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[2],
2109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[3],
2110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->xm_visual->undithered_pf);
2111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaSetForeground(c->display, c->xm_buffer->cleargc, c->clearpixel);
2112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
2115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->xm_buffer->wasCurrent = GL_TRUE;
2116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Detach */
2119b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_make_current2( NULL, NULL, NULL );
2120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Unbind the context c from its buffer.
2127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2128693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaUnbindContext( XMesaContext c )
2129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* A no-op for XFree86 integration purposes */
2131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2135693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaGetCurrentContext( void )
2136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
2139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return xmesa;
2141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2148693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentBuffer( void )
2149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
2152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return xmesa->xm_buffer;
2154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* New in Mesa 3.1 */
2162693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentReadBuffer( void )
2163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
2166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return xmesa->xm_buffer;
2168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2175693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaForceCurrent(XMesaContext c)
2176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
2178b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      if (c->gl_ctx != _mesa_get_current_context()) {
2179b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul	 _mesa_make_current(c->gl_ctx, c->xm_buffer->gl_buffer);
2180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2183b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_make_current(NULL, NULL);
2184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2189693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaLoseCurrent(XMesaContext c)
2190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2192b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_make_current(NULL, NULL);
2193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Switch 3Dfx support hack between window and full-screen mode.
2199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2200693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaSetFXmode( GLint mode )
2201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   const char *fx = getenv("MESA_GLX_FX");
2204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fx && fx[0] != 'd') {
2205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GET_CURRENT_CONTEXT(ctx);
2206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GrHwConfiguration hw;
2207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!FX_grSstQueryHardware(&hw)) {
2208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "!grSstQueryHardware\n");*/
2209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (hw.num_sst < 1) {
2212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "hw.num_sst < 1\n");*/
2213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctx) {
2216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (mode == XMESA_FX_WINDOW) {
2218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    if (xmesa->xm_buffer->FXisHackUsable) {
2219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       FX_grSstControl(GR_CONTROL_DEACTIVATE);
2220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       xmesa->xm_buffer->FXwindowHack = GL_TRUE;
2221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       return GL_TRUE;
2222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    }
2223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else if (mode == XMESA_FX_FULLSCREEN) {
2225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    FX_grSstControl(GR_CONTROL_ACTIVATE);
2226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    xmesa->xm_buffer->FXwindowHack = GL_FALSE;
2227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    return GL_TRUE;
2228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else {
2230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    /* Error: Bad mode value */
2231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*fprintf(stderr, "fallthrough\n");*/
2235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) mode;
2237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
2239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Read image from VooDoo frame buffer into X/Mesa's back XImage.
2246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void FXgetImage( XMesaBuffer b )
2248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static unsigned short pixbuf[MAX_WIDTH];
2250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int x, y;
2251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaWindow root;
2252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned int bw, depth, width, height;
2253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaContext xmesa = (XMesaContext) b->xm_context->gl_ctx->DriverCtx;
2254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(xmesa->xm_buffer->FXctx);
2256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   x = b->frontbuffer->x;
2259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   y = b->frontbuffer->y;
2260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   width = b->frontbuffer->width;
2261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   height = b->frontbuffer->height;
2262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   depth = b->frontbuffer->depth;
2263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetGeometry( xmesa->xm_visual->display, b->frontbuffer,
2265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                 &root, &x, &y, &width, &height, &bw, &depth);
2266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->width != width || b->height != height) {
2268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->width = MIN2((int)width, xmesa->xm_buffer->FXctx->width);
2269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->height = MIN2((int)height, xmesa->xm_buffer->FXctx->height);
2270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->width & 1)
2271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->width--;  /* prevent odd width */
2272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xmesa_alloc_back_buffer( b );
2273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   grLfbWriteColorFormat(GR_COLORFORMAT_ARGB);
2276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (xmesa->xm_visual->undithered_pf==PF_5R6G5B) {
2277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 16bpp RGB */
2278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
2279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       0, xmesa->xm_buffer->FXctx->height - b->height,  /*pos*/
2280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->width, b->height,         /* size */
2281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->width * sizeof(GLushort), /* stride */
2282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->backimage->data);         /* dest buffer */
2283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (xmesa->xm_visual->dithered_pf==PF_DITHER
2285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    && GET_VISUAL_DEPTH(xmesa->xm_visual)==8) {
2286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 8bpp RGB */
2287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (y=0;y<b->height;y++) {
2288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLubyte *ptr = (GLubyte*) xmesa->xm_buffer->backimage->data
2289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + xmesa->xm_buffer->backimage->bytes_per_line * y;
2290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XDITHER_SETUP(y);
2291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
2294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0, xmesa->xm_buffer->FXctx->height-(b->height-y),
2295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          b->width, 1,
2296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
2300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (x=0;x<b->width;x++) {
2301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte r = (pixbuf[x] & 0xf800) >> 8;
2302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte g = (pixbuf[x] & 0x07e0) >> 3;
2303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte b = (pixbuf[x] & 0x001f) << 3;
2304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            *ptr++ = XDITHER( x, r, g, b);
2305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* General case: slow! */
2310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (y=0;y<b->height;y++) {
2311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
2313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0, xmesa->xm_buffer->FXctx->height-(b->height-y),
2314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          b->width, 1,
2315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
2319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (x=0;x<b->width;x++) {
2320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutPixel(b->backimage,x,y,
2321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  xmesa_color_to_pixel(xmesa,
2322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0xf800) >> 8,
2323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x07e0) >> 3,
2324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x001f) << 3,
2325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       0xff, xmesa->pixelformat));
2326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   grLfbWriteColorFormat(GR_COLORFORMAT_ABGR);
2330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy the back buffer to the front buffer.  If there's no back buffer
2336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this is a no-op.
2337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSwapBuffers( XMesaBuffer b )
2339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
2345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->xm_context && b->xm_context->gl_ctx == ctx)
2346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _mesa_swapbuffers(ctx);
2347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul     if (b->backimage) {
2360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy Ximage from host's memory to server's window */
2361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
2363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XShmPutImage( b->xm_visual->display, b->frontbuffer,
2365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  b->cleargc,
2366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  b->backimage, 0, 0,
2367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  0, 0, b->width, b->height, False );
2368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
2371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(GLX_DIRECT_RENDERING) && !defined(XFree86Server)
2374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XMesaDriSwapBuffers( b );
2375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
2378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   b->cleargc,
2379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   b->backimage, 0, 0,
2380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   0, 0, b->width, b->height );
2381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy pixmap to window on server */
2387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaCopyArea( b->xm_visual->display,
2389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->backpixmap,   /* source drawable */
2390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->frontbuffer,  /* dest. drawable */
2391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->cleargc,
2392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0, b->width, b->height,  /* source region */
2393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0                 /* dest region */
2394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      );
2395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if !defined(GLX_DIRECT_RENDERING) && !defined(XFree86Server)
2399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
2400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy sub-region of back buffer to front buffer
2407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
2415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->xm_context->gl_ctx == ctx)
2416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _mesa_swapbuffers(ctx);
2417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int yTop = b->bottom - y - height;
2420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backimage) {
2430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy Ximage from host's memory to server's window */
2431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->shm) {
2433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XShmPutImage( b->xm_visual->display, b->frontbuffer,
2435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          b->cleargc,
2436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          b->backimage, x, yTop,
2437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          x, yTop, width, height, False );
2438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* wait for finished event??? */
2439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
2445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   b->cleargc,
2446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   b->backimage, x, yTop,
2447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   x, yTop, width, height );
2448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy pixmap to window on server */
2452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaCopyArea( b->xm_visual->display,
2453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->backpixmap,           /* source drawable */
2454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->frontbuffer,          /* dest. drawable */
2455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->cleargc,
2456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop, width, height,  /* source region */
2457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop                  /* dest region */
2458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      );
2459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
2466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * is a way to get "under the hood" of X/Mesa so one can manipulate the
2467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * back buffer directly.
2468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  pixmap - pointer to back buffer's Pixmap, or 0
2469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          ximage - pointer to back buffer's XImage, or NULL
2470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE = context is double buffered
2471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE = context is single buffered
2472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2473693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetBackBuffer( XMesaBuffer b,
2474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaPixmap *pixmap,
2475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaImage **ximage )
2476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (pixmap)  *pixmap = b->backpixmap;
2479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ximage)  *ximage = b->backimage;
2480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *pixmap = 0;
2484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *ximage = NULL;
2485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the depth buffer associated with an XMesaBuffer.
2492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the XMesa buffer handle
2493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  width, height - size of buffer in pixels
2494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          bytesPerValue - bytes per depth value (2 or 4)
2495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          buffer - pointer to depth buffer values
2496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2498693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint *bytesPerValue, void **buffer )
2500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if ((!b->gl_buffer) || (!b->gl_buffer->DepthBuffer)) {
2502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *width = 0;
2503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *height = 0;
2504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = 0;
2505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *buffer = 0;
2506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *width = b->gl_buffer->Width;
2510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *height = b->gl_buffer->Height;
2511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = sizeof(GLdepth);
2512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *buffer = b->gl_buffer->DepthBuffer;
2513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaFlush( XMesaContext c )
2519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c && c->xm_visual) {
2521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
2523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSync( c->xm_visual->display, False );
2525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulconst char *XMesaGetString( XMesaContext c, int name )
2532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (name==XMESA_VERSION) {
2535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return "3.1";
2536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (name==XMESA_EXTENSIONS) {
2538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return "";
2539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
2542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2547693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
2550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
2551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->frontbuffer==d && b->display==dpy) {
2552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
2553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
2556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Look for XMesaBuffers whose X window has been destroyed.
2562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate any such XMesaBuffers.
2563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaGarbageCollect( void )
2565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b, next;
2567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=next) {
2568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      next = b->Next;
2569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!b->pixmap_flag) {
2570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* NOT_NEEDED */
2572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XSync(b->display, False);
2574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!window_exists( b->display, b->frontbuffer )) {
2575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* found a dead window, free the ancillary info */
2576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaDestroyBuffer( b );
2577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaReset( void )
2585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    while (XMesaBufferList)
2587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaDestroyBuffer(XMesaBufferList);
2588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    XMesaBufferList = NULL;
2590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat red, GLfloat green,
2595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat blue, GLfloat alpha )
2596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint r = (GLint) (red   * 255.0F);
2598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint g = (GLint) (green * 255.0F);
2599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint b = (GLint) (blue  * 255.0F);
2600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint a = (GLint) (alpha * 255.0F);
2601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (xmesa->pixelformat) {
2603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_INDEX:
2604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
2605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_TRUECOLOR:
2606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
2609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
2612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
2613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
2614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
2615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
2616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
2617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_DITHER:
2618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
2620693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( x, y, r, g, b );
2621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_1BIT:
2623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
2624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
2625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
2626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(x, y, r, g, b);
2627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_LOOKUP:
2628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
2630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
2631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_GRAYSCALE:
2633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
2634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_DITHER_5R6G5B:
2635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
2636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_TRUEDITHER:
2637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, x, y, r, g, b);
2640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
2643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         gl_problem(NULL, "Bad pixel format in XMesaDitherColor");
2644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
2646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2647693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2649