xm_api.c revision fd83bc2b33f34195f05300eee6ebfe18570177a0
1693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa 3-D graphics library
30983163fde91f1026146903155fd414725a79879Brian Paul * Version:  5.1
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
5d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
8693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * copy of this software and associated documentation files (the "Software"),
9693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * to deal in the Software without restriction, including without limitation
10693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
12693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The above copyright notice and this permission notice shall be included
15693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
24c5a76cbed41b5816d2f5284f90c70364b062aea4Brian Paul/* $XFree86: xc/extras/Mesa/src/X/xm_api.c,v 1.2 2002/02/26 23:37:31 tsi Exp $ */
25693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
26693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
27693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * This file contains the implementations of all the XMesa* functions.
28693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
29693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
30693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * NOTES:
31693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
32693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The window coordinate system origin (0,0) is in the lower-left corner
33693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * of the window.  X11's window coordinate origin is in the upper-left
34693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * corner of the window.  Therefore, most drawing functions in this
35693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * file have to flip Y coordinates.
36693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
37693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
38693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in support for the MIT Shared Memory extension.  If enabled, when you
39693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * use an Ximage for the back buffer in double buffered mode, the "swap"
40693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * operation will be faster.  You must also link with -lXext.
41693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
42693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Byte swapping:  If the Mesa host and the X display use a different
43693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * byte order then there's some trickiness to be aware of when using
44693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XImages.  The byte ordering used for the XImage is that of the X
45693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * display, not the Mesa host.
46693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The color-to-pixel encoding for True/DirectColor must be done
47693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * according to the display's visual red_mask, green_mask, and blue_mask.
48693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
49693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * do byte swapping if needed.  If one wants to directly "poke" the pixel
50693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * into the XImage's buffer then the pixel must be byte swapped first.  In
51693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
52693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and use XPutPixel everywhere except in the implementation of
53693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
54693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * instead of using XPutPixel we "poke" our values after byte-swapping
55693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the clear pixel value if needed.
56693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
57693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
58693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
59693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef __CYGWIN__
60693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef WIN32
61693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef __WIN32__
62693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
63693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
64693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glxheader.h"
65693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "GL/xmesa.h"
66693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "xmesaP.h"
67693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "context.h"
68693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "extensions.h"
69693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glthread.h"
709a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h"
71693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "matrix.h"
725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
73a4575499679d9d91055a35c7673b81872ec127cbJouk Jansen#include "macros.h"
74e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul#include "texformat.h"
751e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul#include "texobj.h"
76e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul#include "texstore.h"
77724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/swrast.h"
78ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell#include "swrast_setup/swrast_setup.h"
79cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "array_cache/acache.h"
8023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "tnl/tnl.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
1515e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen}
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 * Return the host's byte order as LSBFirst or MSBFirst ala X.
163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int host_byte_order( void )
166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i = 1;
168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *cptr = (char *) &i;
169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return (*cptr==1) ? LSBFirst : MSBFirst;
170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Error handling.
176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int mesaXErrorFlag = 0;
179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event )
181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) event;
184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mesaXErrorFlag = 1;
185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Check if the X Shared Memory extension is available.
192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  0 = not available
193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          1 = shared XImage support available
194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          2 = shared Pixmap support available also
195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int check_for_xshm( XMesaDisplay *display )
198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM
200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int major, minor, ignore;
201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Bool pixmaps;
202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return (pixmaps==True) ? 2 : 1;
206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return 0;
209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Can't compile XSHM support */
216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the width and height of the given drawable.
224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void get_drawable_size( XMesaDisplay *dpy, XMesaDrawable d,
226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               unsigned int *width, unsigned int *height)
227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    (void) dpy;
230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    *width = d->width;
231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    *height = d->height;
232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Window root;
234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int x, y;
235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned int bw, depth;
236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   _glthread_LOCK_MUTEX(_xmesa_lock);
238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetGeometry( dpy, d, &root, &x, &y, width, height, &bw, &depth );
239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   _glthread_UNLOCK_MUTEX(_xmesa_lock);
240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Apply gamma correction to an intensity value in [0..max].  Return the
246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * new intensity value.
247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLint gamma_adjust( GLfloat gamma, GLint value, GLint max )
249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma == 1.0) {
251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return value;
252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double x = (double) value / (double) max;
255367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma));
256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the true number of bits per pixel for XImages.
263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * For example, if we request a 24-bit deep visual we may actually need/get
264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 32bpp XImages.  This function returns the appropriate bpp.
265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the X display
266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - desribes the visual to be used for XImages
267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  true number of bits per pixel for XImages
268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv )
272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   const int depth = visinfo->nplanes;
275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (screenInfo.formats[i].depth == depth)
278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return screenInfo.formats[i].bitsPerPixel;
279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return depth;  /* should never get here, but this should be safe */
281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv )
286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDisplay *dpy = xmv->display;
288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaImage *img;
290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bitsPerPixel;
291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Create a temporary XImage */
292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       ZPixmap, 0,           /*format, offset*/
294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       (char*) MALLOC(8),    /*data*/
295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       1, 1,                 /*width, height*/
296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       32,                   /*bitmap_pad*/
297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       0                     /*bytes_per_line*/
298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     );
299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(img);
300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* grab the bits/pixel value */
301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bitsPerPixel = img->bits_per_pixel;
302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* free the XImage */
303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE( img->data );
304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img->data = NULL;
305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDestroyImage( img );
306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bitsPerPixel;
307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Determine if a given X window ID is valid (window exists).
314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this by calling XGetWindowAttributes() for the window and
315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * checking if we catch an X error.
316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the display
317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         win - the window to check for existance
318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE - window exists
319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE - window doesn't exist
320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean WindowExistsFlag;
323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (xerr->error_code == BadWindow) {
328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      WindowExistsFlag = GL_FALSE;
329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes wa;
336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   WindowExistsFlag = GL_TRUE;
338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler(window_exists_err_handler);
339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSetErrorHandler(old_handler);
341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return WindowExistsFlag;
342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                Linked list of XMesaBuffers                 *****/
349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer XMesaBufferList = NULL;
352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Allocate a new XMesaBuffer, add to linked list */
355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer alloc_xmesa_buffer(void)
356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b) {
359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->Next = XMesaBufferList;
360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBufferList = b;
361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Find an XMesaBuffer by matching X display and colormap but NOT matching
368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the notThis buffer.
369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer find_xmesa_buffer(XMesaDisplay *dpy,
371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                     XMesaColormap cmap,
372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                     XMesaBuffer notThis)
373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Free an XMesaBuffer, remove from linked list, perhaps free X colormap
386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * entries.
387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void free_xmesa_buffer(int client, XMesaBuffer buffer)
389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer prev = NULL, b;
391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b==buffer) {
394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* unlink bufer from list */
395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (prev)
396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            prev->Next = buffer->Next;
397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaBufferList = buffer->Next;
399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Check to free X colors */
400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (buffer->num_alloced>0) {
401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* If no other buffer uses this X colormap then free the colors. */
402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!find_xmesa_buffer(buffer->display, buffer->cmap, buffer)) {
403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               (void)FreeColors(buffer->cmap, client,
405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				buffer->num_alloced, buffer->alloced_colors,
406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				0);
407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               XFreeColors(buffer->display, buffer->cmap,
409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                           buffer->alloced_colors, buffer->num_alloced, 0);
410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
4131832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
4141832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul         _mesa_free_framebuffer_data(&buffer->mesa_buffer);
415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         FREE(buffer);
4161832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return;
418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* continue search */
420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prev = b;
421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* buffer not found in XMesaBufferList */
42308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul   _mesa_problem(NULL,"free_xmesa_buffer() - buffer not found\n");
424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Copy X color table stuff from one XMesaBuffer to another. */
428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void copy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   dst->num_alloced = src->num_alloced;
435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->alloced_colors, src->alloced_colors,
436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          sizeof(src->alloced_colors));
437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                   Misc Private Functions                   *****/
443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return number of bits set in n.
448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bitcount( unsigned long n )
450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bits;
452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (bits=0; n>0; n=n>>1) {
453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (n&1) {
454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bits++;
455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bits;
458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Allocate a shared memory XImage back buffer for the given XMesaBuffer.
464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE if success, GL_FALSE if error
465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean alloc_shm_back_buffer( XMesaBuffer b )
468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM
470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * We have to do a _lot_ of error checking here to be sure we can
472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * really use the XSHM extension.  It seems different servers trigger
473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * errors at different points if the extension won't work.  Therefore
474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to be very careful...
475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GC gc;
477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay *, XErrorEvent * );
478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->backimage = XShmCreateImage( b->xm_visual->display,
480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                   b->xm_visual->visinfo->visual,
481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                   b->xm_visual->visinfo->depth,
482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				   ZPixmap, NULL, &b->shminfo,
483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				   b->width, b->height );
484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage == NULL) {
4852ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (XShmCreateImage), disabling.");
486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.shmid = shmget( IPC_PRIVATE, b->backimage->bytes_per_line
491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			     * b->backimage->height, IPC_CREAT|0777 );
492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->shminfo.shmid < 0) {
4932ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "shmget failed while allocating back buffer");
494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
4962ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (shmget), disabling.");
497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.shmaddr = b->backimage->data
502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      = (char*)shmat( b->shminfo.shmid, 0, 0 );
503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->shminfo.shmaddr == (char *) -1) {
5042ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "shmat() failed while allocating back buffer");
505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
5082ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (shmat), disabling.");
509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->shminfo.readOnly = False;
514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mesaXErrorFlag = 0;
515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler( mesaHandleXError );
516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* This may trigger the X protocol error we're ready to catch: */
517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XShmAttach( b->xm_visual->display, &b->shminfo );
518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (mesaXErrorFlag) {
521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* we are on a remote display, this error is normal, don't print it */
522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XFlush( b->xm_visual->display );
523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      mesaXErrorFlag = 0;
524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmdt( b->shminfo.shmaddr );
526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      (void) XSetErrorHandler( old_handler );
530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   shmctl( b->shminfo.shmid, IPC_RMID, 0 ); /* nobody else needs it */
534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Finally, try an XShmPutImage to be really sure the extension works */
536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gc = XCreateGC( b->xm_visual->display, b->frontbuffer, 0, NULL );
537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XShmPutImage( b->xm_visual->display, b->frontbuffer, gc,
538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		 b->backimage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False );
539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XFreeGC( b->xm_visual->display, gc );
541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) XSetErrorHandler( old_handler );
542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (mesaXErrorFlag) {
543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XFlush( b->xm_visual->display );
544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      mesaXErrorFlag = 0;
545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XDestroyImage( b->backimage );
546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmdt( b->shminfo.shmaddr );
547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->shm = 0;
550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage) {
554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int height = b->backimage->height;
555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR1 macro */
556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width1 = b->backimage->bytes_per_line;
557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin1 = (GLubyte *) b->backimage->data
558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width1 * (height-1);
559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR2 macro */
560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width2 = b->backimage->bytes_per_line / 2;
561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin2 = (GLushort *) b->backimage->data
562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width2 * (height-1);
563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR3 macro */
564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width3 = b->backimage->bytes_per_line;
565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin3 = (GLubyte *) b->backimage->data
566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width3 * (height-1);
567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Needed by PIXELADDR4 macro */
568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_width4 = b->backimage->width;
569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->ximage_origin4 = (GLuint *) b->backimage->data
570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                        + b->ximage_width4 * (height-1);
571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Can't compile XSHM support */
576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup an off-screen pixmap or Ximage to use as the back buffer.
585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the X/Mesa buffer
586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid xmesa_alloc_back_buffer( XMesaBuffer b )
588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state==BACK_XIMAGE) {
590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Deallocate the old backimage, if any */
591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backimage) {
592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XShmDetach( b->xm_visual->display, &b->shminfo );
595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XDestroyImage( b->backimage );
596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    shmdt( b->shminfo.shmaddr );
597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaDestroyImage( b->backimage );
601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = NULL;
602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Allocate new back buffer */
605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Allocate a regular XImage for the back buffer. */
608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = XMesaCreateImage(b->xm_visual->BitsPerPixel,
609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 b->width, b->height, NULL);
610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
611e4656003caee346d9c4eb23256d73409271291a7Brian Paul      if (b->shm==0 || alloc_shm_back_buffer(b)==GL_FALSE) {
612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Allocate a regular XImage for the back buffer. */
613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->backimage = XCreateImage( b->xm_visual->display,
614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      b->xm_visual->visinfo->visual,
615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      GET_VISUAL_DEPTH(b->xm_visual),
616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      ZPixmap, 0,   /* format, offset */
617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      NULL, b->width, b->height,
618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				      8, 0 );  /* pad, bytes_per_line */
619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
620693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!b->backimage) {
6212ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul	    _mesa_warning(NULL, "alloc_back_buffer: XCreateImage failed.");
622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->backimage->data = (char *) MALLOC( b->backimage->height
624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                             * b->backimage->bytes_per_line );
625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!b->backimage->data) {
6262ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL, "alloc_back_buffer: MALLOC failed.");
627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaDestroyImage( b->backimage );
628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->backimage = NULL;
629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backpixmap = None;
632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (b->db_state==BACK_PIXMAP) {
634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaPixmap old_pixmap = b->backpixmap;
635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Free the old back pixmap */
636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backpixmap) {
637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Allocate new back pixmap */
640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backpixmap = XMesaCreatePixmap( b->xm_visual->display, b->frontbuffer,
641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 b->width, b->height,
642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					 GET_VISUAL_DEPTH(b->xm_visual) );
643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->backimage = NULL;
644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* update other references to backpixmap */
645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->buffer==(XMesaDrawable)old_pixmap) {
646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->buffer = (XMesaDrawable)b->backpixmap;
647693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * A replacement for XAllocColor.  This function should never
655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * fail to allocate a color.  When XAllocColor fails, we return
656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the nearest matching color.  If we have to allocate many colors
657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this function isn't too efficient; the XQueryColors() could be
658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * done just once.
659693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Written by Michael Pichler, Brian Paul, Mark Kilgard
660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - X display
661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - X colormap
662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmapSize - size of colormap
663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In/Out: color - the XColor struct
664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  exact - 1=exact color match, 0=closest match
665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          alloced - 1=XAlloc worked, 0=XAlloc failed
666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void
668693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulnoFaultXAllocColor( int client,
669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaDisplay *dpy,
670693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColormap cmap,
671693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int cmapSize,
672693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColor *color,
673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int *exact, int *alloced )
674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
676693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Pixel *ppixIn;
677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   xrgb *ctable;
678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* we'll try to cache ctable for better remote display performance */
680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static Display *prevDisplay = NULL;
681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColormap prevCmap = 0;
682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static int prevCmapSize = 0;
683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColor *ctable = NULL;
684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaColor subColor;
686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i, bestmatch;
687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double mindist;       /* 3*2^16^2 exceeds long int precision. */
688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* First try just using XAllocColor. */
692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->red, &color->green, &color->blue,
695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->pixel,
696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, color)) {
699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *exact = 1;
701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return;
703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Alloc failed, search for closest match */
706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Retrieve color table entries. */
708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* XXX alloca candidate. */
709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ppixIn[i] = i;
714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   QueryColors(cmap, cmapSize, ppixIn, ctable);
716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (prevDisplay != dpy || prevCmap != cmap
718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       || prevCmapSize != cmapSize || !ctable) {
719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* free previously cached color table */
720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctable)
721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         FREE(ctable);
722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Get the color table from X */
723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(ctable);
725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i = 0; i < cmapSize; i++) {
726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         ctable[i].pixel = i;
727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XQueryColors(dpy, cmap, ctable, cmapSize);
729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevDisplay = dpy;
730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmap = cmap;
731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmapSize = cmapSize;
732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Find best match. */
736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bestmatch = -1;
737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mindist = 0.0;
738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dist = dr * dr + dg * dg + db * db;
743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (bestmatch < 0 || dist < mindist) {
744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bestmatch = i;
745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         mindist = dist;
746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Return result. */
750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.red   = ctable[bestmatch].red;
751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.green = ctable[bestmatch].green;
752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.blue  = ctable[bestmatch].blue;
753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Try to allocate the closest match color.  This should only
754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * fail if the cell is read/write.  Otherwise, we're incrementing
755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the cell's reference count.
756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.red, &subColor.green, &subColor.blue,
760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.pixel,
761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, &subColor)) {
764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* do this to work around a problem reported by Frank Ortega */
769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.pixel = (unsigned long) bestmatch;
770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.red   = ctable[bestmatch].red;
771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.green = ctable[bestmatch].green;
7725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      subColor.blue  = ctable[bestmatch].blue;
773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.flags = DoRed | DoGreen | DoBlue;
774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 0;
775693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(ppixIn);
778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(ctable);
779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* don't free table, save it for next time */
781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *color = subColor;
784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *exact = 0;
785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do setup for PF_GRAYSCALE pixel format.
792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Note that buffer may be NULL.
793693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_grayscale( int client, XMesaVisual v,
795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  XMesaBuffer buffer, XMesaColormap cmap )
796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
806693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
807693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
808693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
809693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
8101832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
8111832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
812693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous XMesaBuffer which uses same
813693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
814693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
815693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
816693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
817693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
818693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate 256 shades of gray */
819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int gray;
820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (gray=0;gray<256;gray++) {
822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
823693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
824693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            int exact, alloced;
826693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaColor xcol;
827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.red   = (r << 8) | r;
828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.green = (g << 8) | g;
829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.blue  = (b << 8) | b;
830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            noFaultXAllocColor( client, v->display,
831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                cmap, GET_COLORMAP_SIZE(v),
832693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                &xcol, &exact, &alloced );
833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!exact) {
834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               colorsfailed++;
835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (alloced) {
837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               assert(buffer->num_alloced<256);
838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->num_alloced++;
840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*OLD
843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(gray < 576);
844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+0] = xcol.pixel;
845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+1] = xcol.pixel;
846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+2] = xcol.pixel;
847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            */
852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray] = xcol.pixel;
853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray;
855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray;
856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray;
857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
859367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
8602ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL,
861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of 256 needed colors do not match exactly.\n",
862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  colorsfailed );
863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
867449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = PF_Grayscale;
868449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->undithered_pf = PF_Grayscale;
869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a PseudoColor, StaticColor,
876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * color.  While this function was originally designed just for 8-bit
879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Dithering code contributed by Bob Mercier.
881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_dithered_color( int client, XMesaVisual v,
883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       XMesaBuffer buffer, XMesaColormap cmap )
884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
888693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
889693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
8981832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
8991832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous, matching XMesaBuffer.
901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Do this to avoid time spent in noFaultXAllocColor.
902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate X colors and initialize color_table[], red_table[], etc */
907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int r, g, b, i;
908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
909d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul         for (r = 0; r < DITH_R; r++) {
910d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul            for (g = 0; g < DITH_G; g++) {
911d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul               for (b = 0; b < DITH_B; b++) {
912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  XMesaColor xcol;
913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  int exact, alloced;
914d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(DITH_R-1),65535);
915d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535);
916d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(DITH_B-1),65535);
917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  noFaultXAllocColor( client, v->display,
918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      cmap, GET_COLORMAP_SIZE(v),
919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      &xcol, &exact, &alloced );
920693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (!exact) {
921693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     colorsfailed++;
922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (alloced) {
924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     assert(buffer->num_alloced<256);
925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->num_alloced++;
927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
928d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  i = DITH_MIX( r, g, b );
929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(i < 576);
930693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->color_table[i] = xcol.pixel;
931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(xcol.pixel < 65536);
932d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1);
933d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1);
934d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1);
935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               }
936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
937693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
939367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
9402ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL,
941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of %d needed colors do not match exactly.\n",
942d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  colorsfailed, DITH_R * DITH_G * DITH_B );
943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
947449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = PF_Dither;
948449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->undithered_pf = PF_Lookup;
949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
952693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
953693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
956693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Special dithering tables have to be initialized.
957693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
958693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_8bit_hpcr( XMesaVisual v )
959693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
961693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * on the root window AND the colormap obtainable by XGetRGBColormaps
963693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * for that atom must be set on the window.  (see also tkInitWindow)
964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If that colormap is not set, the output will look stripy.
965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Setup color tables with gamma correction */
968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double g;
970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
9715e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   g = 1.0 / v->RedGamma;
9725e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   for (i=0; i<256; i++) {
973367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g ));
974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->GreenGamma;
978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
979367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g ));
980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->BlueGamma;
984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
985367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g ));
986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_HPCR;
990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* which method should I use to clear */
992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_FALSE: keep the ordinary method  */
993693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_TRUE : clear with dither pattern */
994367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (v->hpcr_clear_flag) {
997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               DefaultRootWindow(v->display),
999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               16, 2, 8);
1000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
1002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       0, 0, 16, 2, AllPlanes, ZPixmap);
1003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a True/DirectColor visual.
1010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
1012190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                             XMesaColormap cmap )
1013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned long rmask, gmask, bmask;
1015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) buffer;
1016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) cmap;
1017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute red multiplier (mask) and bit shift */
1019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->rshift = 0;
1020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   rmask = GET_REDMASK(v);
1021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((rmask & 1)==0) {
1022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->rshift++;
1023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      rmask = rmask >> 1;
1024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute green multiplier (mask) and bit shift */
1027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->gshift = 0;
1028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gmask = GET_GREENMASK(v);
1029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((gmask & 1)==0) {
1030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->gshift++;
1031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gmask = gmask >> 1;
1032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute blue multiplier (mask) and bit shift */
1035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bshift = 0;
1036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bmask = GET_BLUEMASK(v);
1037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((bmask & 1)==0) {
1038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->bshift++;
1039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      bmask = bmask >> 1;
1040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Compute component-to-pixel lookup tables and dithering kernel
1044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      static GLubyte kernel[16] = {
1047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          0*16,  8*16,  2*16, 10*16,
1048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         12*16,  4*16, 14*16,  6*16,
1049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          3*16, 11*16,  1*16,  9*16,
1050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         15*16,  7*16, 13*16,  5*16,
1051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      };
1052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint rBits = bitcount(rmask);
1053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint gBits = bitcount(gmask);
1054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLint bBits = bitcount(bmask);
10553cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      GLint maxBits;
1056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLuint i;
1057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1058693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
1059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=rmask; i++)
1060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
1061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=gmask; i++)
1062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
1063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=bmask; i++)
1064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
1065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert RGB values from [0,255] to pixel components */
1067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<256;i++) {
1069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint r = gamma_adjust(v->RedGamma,   i, 255);
1070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint g = gamma_adjust(v->GreenGamma, i, 255);
1071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
1072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
1073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
1074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
1075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* overflow protection */
1077693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=256;i<512;i++) {
1078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = v->RtoPixel[255];
1079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = v->GtoPixel[255];
1080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = v->BtoPixel[255];
1081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* setup dithering kernel */
10843cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      maxBits = rBits;
10853cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (gBits > maxBits)  maxBits = gBits;
10863cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (bBits > maxBits)  maxBits = bBits;
1087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<16;i++) {
10883cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul         v->Kernel[i] = kernel[i] >> maxBits;
1089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1091449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->undithered_pf = PF_Truecolor;
1092449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor;
1093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Now check for TrueColor visuals which we can optimize.
1097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (   GET_REDMASK(v)  ==0x0000ff
1099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_GREENMASK(v)==0x00ff00
1100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_BLUEMASK(v) ==0xff0000
1101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
1103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on SGI, Sun */
1106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R;
1107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
1109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
1113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on Linux, HP, IBM */
1116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8R8G8B;
1117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
1119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==24
1123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common packed 24 bpp config used on Linux */
1126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8R8G8B24;
1127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xf800
1129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x07e0
1130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x001f
1131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==16
1133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLushort)==2
1134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* 5-6-5 color weight on common PC VGA boards */
1136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = PF_5R6G5B;
1137449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = PF_Dither_5R6G5B;
1138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xe0
1140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x1c
1141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x03
1142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_FOR_HPCR(v)) {
1143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      setup_8bit_hpcr( v );
1144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a monochrome visual.
1151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_monochrome( XMesaVisual v, XMesaBuffer b )
1153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) b;
1155449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = v->undithered_pf = PF_1Bit;
1156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* if black=1 then we must flip pixel values */
1157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
1158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * When a context is "made current" for the first time, we can finally
1164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * finish initializing the context's visual and buffer information.
1165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual to initialize
1166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         b - the XMesaBuffer to initialize (may be NULL)
1167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - TRUE = RGBA mode, FALSE = color index mode
1168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         window - the window/pixmap we're rendering into
1169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - the colormap associated with the window/pixmap
1170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE=success, GL_FALSE=failure
1171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean initialize_visual_and_buffer( int client,
1173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaVisual v,
1174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaBuffer b,
1175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               GLboolean rgb_flag,
1176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               XMesaDrawable window,
11773265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul                                               XMesaColormap cmap )
1178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGCValues gcvalues;
1181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b) {
1184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(b->xm_visual == v);
1185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save true bits/pixel */
1188a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   v->BitsPerPixel = bits_per_pixel(v);
1189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v->BitsPerPixel > 0);
1190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (rgb_flag==GL_FALSE) {
1193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* COLOR-INDEXED WINDOW:
1194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Even if the visual is TrueColor or DirectColor we treat it as
1195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * being color indexed.  This is weird but might be useful to someone.
1196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1197449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = v->undithered_pf = PF_Index;
1198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->index_bits = GET_VISUAL_DEPTH(v);
1199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* RGB WINDOW:
1202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * We support RGB rendering into almost any kind of visual.
1203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int xclass;
1205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xclass = GET_VISUAL_CLASS(v);
1206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (xclass==TrueColor || xclass==DirectColor) {
1207190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 setup_truecolor( v, b, cmap );
1208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if (xclass==StaticGray && GET_VISUAL_DEPTH(v)==1) {
1210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 setup_monochrome( v, b );
1211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if (xclass==GrayScale || xclass==StaticGray) {
1213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!setup_grayscale( client, v, b, cmap )) {
1214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else if ((xclass==PseudoColor || xclass==StaticColor)
1218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
1219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!setup_dithered_color( client, v, b, cmap )) {
1220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
12242ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul	 _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.");
1225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return GL_FALSE;
1226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->index_bits = 0;
1228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1229367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      if (_mesa_getenv("MESA_NO_DITHER")) {
1230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 v->dithered_pf = v->undithered_pf;
1231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If MESA_INFO env var is set print out some debugging info
1237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * which can help Brian figure out what's going on when a user
1238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * reports bugs.
1239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1240367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_INFO")) {
12412ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa visual = %p\n", (void *) v);
12422ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
12432ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
12442ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa level = %d\n", v->level);
12452ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
12462ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
1247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b && window) {
1250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Do window-specific initializations */
1251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Window dimensions */
1253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      unsigned int w, h;
1254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      get_drawable_size( v->display, window, &w, &h );
1255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->width = w;
1256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->height = h;
1257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->frontbuffer = window;
1259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Setup for single/double buffering */
12611832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (v->mesa_visual.doubleBufferMode) {
1262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Double buffered */
1263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->shm = check_for_xshm( v->display );
1265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         xmesa_alloc_back_buffer( b );
1267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->db_state==BACK_PIXMAP) {
1268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->buffer = (XMesaDrawable)b->backpixmap;
1269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else {
1271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            b->buffer = XIMAGE;
1272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Single Buffered */
1276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->buffer = b->frontbuffer;
1277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* X11 graphics contexts */
1280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1281c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = CreateScratchGC(v->display, window->depth);
1282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1283c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = XCreateGC( v->display, window, 0, NULL );
1284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1285c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      XMesaSetFunction( v->display, b->gc, GXcopy );
1286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
12879ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      /* cleargc - for glClear() */
12889ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#ifdef XFree86Server
12899ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = CreateScratchGC(v->display, window->depth);
12909ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#else
12919ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = XCreateGC( v->display, window, 0, NULL );
12929ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#endif
12939ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->cleargc, GXcopy );
12949ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul
1295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
1297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Michael Pichler May 15, 1995.
1298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
13009ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->swapgc = CreateScratchGC(v->display, window->depth);
1301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
1302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  CARD32 v[1];
1303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	  v[0] = FALSE;
13049ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul	  dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
1305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gcvalues.graphics_exposures = False;
13089ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->swapgc = XCreateGC( v->display, window,
1309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              GCGraphicsExposures, &gcvalues);
1310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
13119ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->swapgc, GXcopy );
1312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Set fill style and tile pixmap once for all for HPCR stuff
1314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * (instead of doing it each time in clear_color_HPCR_pixmap())
1315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Initialize whole stuff
1316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Jacques Leroy March 8, 1998.
1317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->hpcr_clear_flag && b->buffer!=XIMAGE) {
1319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	int i;
1320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	for (i=0; i<16; i++)
1321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        {
1322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
1323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
1324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        }
1325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul        XMesaPutImage(b->display, (XMesaDrawable)v->hpcr_clear_pixmap,
1326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
1327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
1328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
1329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Initialize the row buffer XImage for use in write_color_span() */
1332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1,
1334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (char *)MALLOC(MAX_WIDTH*4));
1335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XCreateImage( v->display,
1337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->visual,
1338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->depth,
1339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  ZPixmap, 0,           /*format, offset*/
1340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  (char*) MALLOC(MAX_WIDTH*4),  /*data*/
1341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  MAX_WIDTH, 1,         /*width, height*/
1342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  32,                   /*bitmap_pad*/
1343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  0                     /*bytes_per_line*/ );
1344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Convert an RGBA color to a pixel value.
1354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long
1356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulxmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLubyte a,
1357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      GLuint pixelFormat)
1358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (pixelFormat) {
1360449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Index:
1361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
1362449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Truecolor:
1363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
1366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
1369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
1370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
1371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B24:
1373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
1374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
1375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
1376449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither:
1377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
1379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( 1, 0, r, g, b );
1380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1381449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_1Bit:
1382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
1383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
1385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(1, 1, r, g, b);
1386449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Lookup:
1387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
1389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
1390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1391449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Grayscale:
1392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
1393449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_True:
1394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1395449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_5R6G5B:
1396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, 1, 0, r, g, b);
1399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
140208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "Bad pixel format in xmesa_color_to_pixel");
1403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
1405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                       Public Functions                     *****/
1410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new X/Mesa visual.
1415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  display - X11 display
1416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - an XVisualInfo pointer
1417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - GL_TRUE = RGB mode,
1418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                    GL_FALSE = color index mode
1419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         alpha_flag - alpha buffer requested?
1420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         db_flag - GL_TRUE = double-buffered,
1421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                   GL_FALSE = single buffered
1422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stereo_flag - stereo visual?
1423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                       GL_FALSE = use an off-screen pixmap for back buffer
1425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         depth_size - requested bits/depth values, or zero
1426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stencil_size - requested bits/stencil values, or zero
1427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_red_size - requested bits/red accum values, or zero
1428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_green_size - requested bits/green accum values, or zero
1429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_blue_size - requested bits/blue accum values, or zero
1430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_alpha_size - requested bits/alpha accum values, or zero
1431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         num_samples - number of samples/pixel if multisampling, or zero
1432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         level - visual level, usually 0
1433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
1434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return;  a new XMesaVisual or 0 if error.
1435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1436693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
1437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               XMesaVisualInfo visinfo,
1438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean rgb_flag,
1439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean alpha_flag,
1440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean db_flag,
1441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean stereo_flag,
1442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean ximage_flag,
1443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint depth_size,
1444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint stencil_size,
1445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_red_size,
1446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_green_size,
1447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_blue_size,
1448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_alpha_size,
1449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint num_samples,
1450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint level,
1451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint visualCaveat )
1452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *gamma;
1454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisual v;
1455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint red_bits, green_bits, blue_bits, alpha_bits;
1456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* For debugging only */
1458367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_XSYNC")) {
1459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* This makes debugging X easier.
1460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * In your debugger, set a breakpoint on _XError to stop when an
1461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * X protocol error is generated.
1462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
1465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSynchronize( display, 1 );
1467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!v) {
1472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * In the X server, NULL is passed in for the display.  It will have
1477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * to be set before using this visual.  See XMesaSetVisualDisplay()
1478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * below.
1479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->display = display;
1481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save a copy of the XVisualInfo struct because the user may XFREE()
1483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the struct but we may need some of the information contained in it
1484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * at a later time.
1485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = visinfo;
1488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if(!v->visinfo) {
1491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE(v);
1492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
1495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Initialize the depth of the screen */
1499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       PixmapFormatRec *format;
1501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       for (format = screenInfo.formats;
1503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    format->depth != display->rootDepth;
1504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    format++)
1505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   ;
1506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       v->screen_depth = format->bitsPerPixel;
1507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* check for MESA_GAMMA environment variable */
1511367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   gamma = _mesa_getenv("MESA_GAMMA");
1512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma) {
1513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->ximage_flag = ximage_flag;
1524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->level = level;
1525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->VisualCaveat = visualCaveat;
1526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
1528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      int xclass;
1531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xclass = GET_VISUAL_CLASS(v);
1532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (xclass==TrueColor || xclass==DirectColor) {
1533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits   = bitcount(GET_REDMASK(v));
1534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = bitcount(GET_GREENMASK(v));
1535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits  = bitcount(GET_BLUEMASK(v));
1536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* this is an approximation */
1540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int depth;
1541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth = GET_VISUAL_DEPTH(v);
1542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits = depth / 3;
1543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= red_bits;
1544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = depth / 2;
1545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= green_bits;
1546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits = depth;
1547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
1549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (alpha_flag && alpha_bits == 0)
1553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      alpha_bits = 8;
1554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
15551832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_visual( &v->mesa_visual,
15561832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            rgb_flag, db_flag, stereo_flag,
15571832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            red_bits, green_bits,
15581832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            blue_bits, alpha_bits,
15591832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            v->index_bits,
15601832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            depth_size,
15611832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            stencil_size,
15621832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_red_size, accum_green_size,
15631832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_blue_size, accum_alpha_size,
15641832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            0 );
1565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return v;
1566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSetVisualDisplay( XMesaDisplay *dpy, XMesaVisual v )
1570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    v->display = dpy;
1572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyVisual( XMesaVisual v )
1576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(v->visinfo);
1579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   FREE(v);
1581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaContext.
1587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - XMesaVisual
1588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         share_list - another XMesaContext with which to share display
1589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                      lists or NULL if no sharing is wanted.
1590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  an XMesaContext or NULL if error.
1591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
15927a1f3a37a10b162b067239dafa19fc6865a41f14Keith WhitwellXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
15949a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul   static GLboolean firstTime = GL_TRUE;
1595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaContext c;
15963c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul   GLboolean direct = GL_TRUE; /* not really */
15971e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   GLcontext *mesaCtx;
1598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (firstTime) {
1600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _glthread_INIT_MUTEX(_xmesa_lock);
1601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      firstTime = GL_FALSE;
1602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!c) {
1606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16091e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   mesaCtx = &(c->mesa);
16101e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul
16111e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   /* Setup these pointers here since they're using for making the default
16121e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul    * and proxy texture objects.  Actually, we don't really need to do
16131e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul    * this since we're using the default fallback functions which
16141e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul    * _mesa_initialize_context() would plug in if needed.
16151e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul    */
16161e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   mesaCtx->Driver.NewTextureObject = _mesa_new_texture_object;
16171e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   mesaCtx->Driver.DeleteTexture = _mesa_delete_texture_object;
16181e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul
16191e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual,
16201e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul                      share_list ? &(share_list->mesa) : (GLcontext *) NULL,
16211e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul                      (void *) c, direct)) {
1622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE(c);
1623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16261e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_sw_extensions(mesaCtx);
16271e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_1_3_extensions(mesaCtx);
16281e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_1_4_extensions(mesaCtx);
162984351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul   _mesa_enable_1_5_extensions(mesaCtx);
1630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (CHECK_BYTE_ORDER(v)) {
1632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->swapbytes = GL_FALSE;
1633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->swapbytes = GL_TRUE;
1636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_visual = v;
16393b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul   c->xm_draw_buffer = NULL;   /* set later by XMesaMakeCurrent */
16403b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul   c->xm_read_buffer = NULL;   /* set later by XMesaMakeCurrent */
1641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->display = v->display;
1643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16451e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   mesaCtx->Driver.UpdateState = xmesa_update_state;
1646a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell
1647ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   /* Initialize the software rasterizer and helper modules.
1648ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell    */
16491e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swrast_CreateContext( mesaCtx );
16501e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _ac_CreateContext( mesaCtx );
16511e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _tnl_CreateContext( mesaCtx );
16521e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swsetup_CreateContext( mesaCtx );
1653ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
16541e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   xmesa_register_swrast_functions( mesaCtx );
1655ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1656709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   /* Set up some constant pointers:
1657709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell    */
16581e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   xmesa_init_pointers( mesaCtx );
1659709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
16607a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   return c;
1661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyContext( XMesaContext c )
1667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
16681e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   GLcontext *mesaCtx = &c->mesa;
1669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
16703b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul   if (c->xm_draw_buffer && c->xm_buffer->FXctx)
16713b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      fxMesaDestroyContext(c->xm_draw_buffer->FXctx);
1672693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
16731e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swsetup_DestroyContext( mesaCtx );
16741e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swrast_DestroyContext( mesaCtx );
16751e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _tnl_DestroyContext( mesaCtx );
16761e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _ac_DestroyContext( mesaCtx );
16770983163fde91f1026146903155fd414725a79879Brian Paul   _mesa_free_context_data( mesaCtx );
16780983163fde91f1026146903155fd414725a79879Brian Paul   _mesa_free( c );
1679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XXX this isn't a public function!  It's a hack for the 3Dfx driver.
1685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X window.
1686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual
1687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         w - the window
1688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         c - the context
1689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  new XMesaBuffer or NULL if error
1690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1691693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
1692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      XMesaContext c )
1693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes attr;
1696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *fxEnvVar;
1699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b) {
1704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
1708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)w)->id);
1711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v);
1714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
17167a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) {
1717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
17187a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   XGetWindowAttributes( v->display, w, &attr );
17197a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell
17207a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (GET_VISUAL_DEPTH(v) != attr.depth) {
1721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
17222ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual and window!\n");
1723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->xm_visual = v;
1727a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   b->type = WINDOW;
1728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->display = v->display;
1729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (attr.colormap) {
1733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->cmap = attr.colormap;
1734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
17362ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
1737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* this is weird, a window w/out a colormap!? */
1738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* OK, let's just allocate a new one and hope for the best */
1739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* determine back buffer implementation */
17441832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (v->mesa_visual.doubleBufferMode) {
1745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->ximage_flag) {
1746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_XIMAGE;
1747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_PIXMAP;
1750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->db_state = 0;
1754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17561832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_framebuffer(&b->mesa_buffer,
17571832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                &v->mesa_visual,
17581832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.depthBits > 0,
17591832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.stencilBits > 0,
17601832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.accumRedBits > 0,
17611832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.alphaBits > 0 );
1762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17631832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
1764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      (XMesaDrawable)w, b->cmap )) {
1765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1770367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   fxEnvVar = _mesa_getenv("MESA_GLX_FX");
1771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fxEnvVar) {
17727a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell     if (fxEnvVar[0]!='d') {
17737a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int attribs[100];
17747a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int numAttribs = 0;
17757a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int hw;
17761832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.depthBits > 0) {
17777a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
1778fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca	 attribs[numAttribs++] = v->mesa_visual.depthBits;
17797a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
17801832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.doubleBufferMode) {
17817a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
17827a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
17831832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.accumRedBits > 0) {
17847a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_ACCUM_SIZE;
17851832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul	 attribs[numAttribs++] = v->mesa_visual.accumRedBits;
17867a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
17871832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.stencilBits > 0) {
17887a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_STENCIL_SIZE;
17891832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul         attribs[numAttribs++] = v->mesa_visual.stencilBits;
17907a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
17911832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.alphaBits > 0) {
17927a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
1793fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca         attribs[numAttribs++] = v->mesa_visual.alphaBits;
17947a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
17951e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul       if (1) {
17967a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
17971e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul         attribs[numAttribs++] = (int) &(c->mesa);
17987a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
17997a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       attribs[numAttribs++] = FXMESA_NONE;
18007a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell
1801fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca       /* [dBorca] need to revise this ASAP!!! */
1802fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca       /*if ((hw = fxQueryHardware())==GR_SSTTYPE_VOODOO) {
18037a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
1804449e47f06a46c42fb9895d13f37b599600225e56Brian Paul         if ((v->undithered_pf!=PF_Index) && (b->backimage)) {
18057a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
18067a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
18077a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	     b->FXwindowHack = b->FXctx ? GL_TRUE : GL_FALSE;
18087a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   else
18097a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	     b->FXwindowHack = GL_FALSE;
18107a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         }
18117a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
1812fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca       else */{
18137a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
18147a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE,
18157a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell					  GR_REFRESH_75Hz, attribs);
18167a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         else
18177a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
18187a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXisHackUsable = GL_FALSE;
18197a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXwindowHack = GL_FALSE;
18207a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
18217a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       /*
18227a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       fprintf(stderr,
18237a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell               "voodoo %d, wid %d height %d hack: usable %d active %d\n",
18247a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell               hw, b->width, b->height, b->FXisHackUsable, b->FXwindowHack);
18257a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       */
18267a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell     }
1827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
18292ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "WARNING: This Mesa Library includes the Glide driver but\n");
18302ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         you have not defined the MESA_GLX_FX env. var.\n");
18312ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         (check the README.3DFX file for more information).\n\n");
18322ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
1833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1840693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w )
1841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaCreateWindowBuffer2( v, w, NULL );
1843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X pixmap.
1848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  v - the XMesaVisual
1849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         p - the pixmap
1850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - the colormap, may be 0 if using a TrueColor or DirectColor
1851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                visual for the pixmap
1852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  new XMesaBuffer or NULL if error
1853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1854693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
1855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     XMesaPixmap p, XMesaColormap cmap )
1856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!b) {
1860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)p)->id);
1866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v);
1869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->xm_visual = v;
1871a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   b->type = PIXMAP;
1872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->display = v->display;
1873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   b->cmap = cmap;
1874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* determine back buffer implementation */
18761832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (v->mesa_visual.doubleBufferMode) {
1877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->ximage_flag) {
1878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_XIMAGE;
1879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 b->db_state = BACK_PIXMAP;
1882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->db_state = 0;
1886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18881832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_framebuffer(&b->mesa_buffer,
18891832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                &v->mesa_visual,
18901832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.depthBits > 0,
18911832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.stencilBits > 0,
18921832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.accumRedBits +
18931832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.accumGreenBits +
18941832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.accumBlueBits > 0,
18951832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                                v->mesa_visual.alphaBits > 0 );
1896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18971832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (XMesaDrawable)p, cmap)) {
1899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      free_xmesa_buffer(client, b);
1900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1908190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian PaulXMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
1909190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                unsigned int width, unsigned int height )
1910190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul{
1911f2c5296dd7c990f566187621835414c3015058a1Brian Paul#ifdef XFree86Server
1912f2c5296dd7c990f566187621835414c3015058a1Brian Paul   return 0;
1913f2c5296dd7c990f566187621835414c3015058a1Brian Paul#else
1914190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   int client = 0;
1915e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaWindow root;
1916e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaDrawable drawable;  /* X Pixmap Drawable */
1917190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1918190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (!b) {
1919190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      return NULL;
1920190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1921190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1922190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   b->xm_visual = v;
19233265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul   b->type = PBUFFER;
1924190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   b->display = v->display;
1925190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   b->cmap = cmap;
1926190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1927e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* allocate pixmap for front buffer */
1928e4656003caee346d9c4eb23256d73409271291a7Brian Paul   root = RootWindow( v->display, v->visinfo->screen );
1929e4656003caee346d9c4eb23256d73409271291a7Brian Paul   drawable = XCreatePixmap( v->display, root, width, height, v->visinfo->depth );
1930e4656003caee346d9c4eb23256d73409271291a7Brian Paul
1931190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   /* determine back buffer implementation */
1932190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (v->mesa_visual.doubleBufferMode) {
1933190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      if (v->ximage_flag) {
1934190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 b->db_state = BACK_XIMAGE;
1935190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      }
1936190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      else {
1937190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 b->db_state = BACK_PIXMAP;
1938190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      }
1939190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1940190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   else {
1941190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      b->db_state = 0;
1942190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1943190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1944190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   _mesa_initialize_framebuffer(&b->mesa_buffer,
1945190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                &v->mesa_visual,
1946190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.depthBits > 0,
1947190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.stencilBits > 0,
1948190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.accumRedBits +
1949190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.accumGreenBits +
1950190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.accumBlueBits > 0,
1951190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul                                v->mesa_visual.alphaBits > 0 );
1952190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1953190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1954e4656003caee346d9c4eb23256d73409271291a7Brian Paul				     drawable, cmap)) {
1955190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      free_xmesa_buffer(client, b);
1956190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      return NULL;
1957190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1958190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1959190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   return b;
1960f2c5296dd7c990f566187621835414c3015058a1Brian Paul#endif
1961190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul}
1962190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1963190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1964190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate an XMesaBuffer structure and all related info.
1967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyBuffer( XMesaBuffer b )
1969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
1971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1973693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->frontbuffer)
1974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       client = CLIENT_ID(b->frontbuffer->id);
1975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1977c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   if (b->gc)  XMesaFreeGC( b->xm_visual->display, b->gc );
1978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->cleargc)  XMesaFreeGC( b->xm_visual->display, b->cleargc );
19799ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul   if (b->swapgc)  XMesaFreeGC( b->xm_visual->display, b->swapgc );
1980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backimage) {
1982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
1983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       if (b->shm) {
1984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XShmDetach( b->xm_visual->display, &b->shminfo );
1985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XDestroyImage( b->backimage );
1986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   shmdt( b->shminfo.shmaddr );
1987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       }
1988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       else
1989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	   XMesaDestroyImage( b->backimage );
1991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->backpixmap) {
1993693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
1994693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->xm_visual->hpcr_clear_flag) {
1995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaFreePixmap( b->xm_visual->display,
1996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			 b->xm_visual->hpcr_clear_pixmap );
1997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaDestroyImage( b->xm_visual->hpcr_clear_ximage );
1998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->rowimage) {
2001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      FREE( b->rowimage->data );
2002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage->data = NULL;
2003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaDestroyImage( b->rowimage );
2004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   free_xmesa_buffer(client, b);
2007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
2013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2014693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
2015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaMakeCurrent2( c, b, b );
2017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
2022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2023693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
2024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                             XMesaBuffer readBuffer )
2025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
2027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!drawBuffer || !readBuffer)
2028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;  /* must specify buffers! */
2029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (drawBuffer->FXctx) {
2032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaMakeCurrent(drawBuffer->FXctx);
2033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20343b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul         c->xm_draw_buffer = drawBuffer;
2035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->xm_read_buffer = readBuffer;
20363b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul         c->xm_buffer = drawBuffer;
2037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
2039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
20411e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (&(c->mesa) == _mesa_get_current_context()
20423b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul          && c->xm_draw_buffer == drawBuffer
2043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          && c->xm_read_buffer == readBuffer
20443b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul          && c->xm_draw_buffer->wasCurrent) {
2045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* same context and buffer, do nothing */
2046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
2047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20493b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_draw_buffer = drawBuffer;
2050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      c->xm_read_buffer = readBuffer;
20513b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_buffer = drawBuffer;
2052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20531e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      _mesa_make_current2(&(c->mesa),
20541832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                          &drawBuffer->mesa_buffer,
20551832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                          &readBuffer->mesa_buffer);
2056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20571e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (c->mesa.Viewport.Width == 0) {
2058693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* initialize viewport to window size */
2059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 _mesa_Viewport( 0, 0, drawBuffer->width, drawBuffer->height );
20601e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul	 c->mesa.Scissor.Width = drawBuffer->width;
20611e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul	 c->mesa.Scissor.Height = drawBuffer->height;
2062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
20641832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (c->xm_visual->mesa_visual.rgbMode) {
2065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*
2066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Must recompute and set these pixel values because colormap
2067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * can be different for different windows.
2068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
2069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         c->clearpixel = xmesa_color_to_pixel( c,
2070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[0],
2071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[1],
2072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[2],
2073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[3],
2074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->xm_visual->undithered_pf);
20753b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul         XMesaSetForeground(c->display, c->xm_draw_buffer->cleargc, c->clearpixel);
2076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2077693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
20793b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_draw_buffer->wasCurrent = GL_TRUE;
2080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Detach */
2083b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_make_current2( NULL, NULL, NULL );
2084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Unbind the context c from its buffer.
2091693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2092693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaUnbindContext( XMesaContext c )
2093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* A no-op for XFree86 integration purposes */
2095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2099693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaGetCurrentContext( void )
2100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
21031e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      XMesaContext xmesa = XMESA_CONTEXT(ctx);
2104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return xmesa;
2105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2112693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentBuffer( void )
2113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
21161e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      XMesaContext xmesa = XMESA_CONTEXT(ctx);
21173b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      return xmesa->xm_draw_buffer;
2118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* New in Mesa 3.1 */
2126693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentReadBuffer( void )
2127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
21301e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      XMesaContext xmesa = XMESA_CONTEXT(ctx);
21313b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      return xmesa->xm_read_buffer;
2132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
2135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2139693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaForceCurrent(XMesaContext c)
2140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
21421e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (&(c->mesa) != _mesa_get_current_context()) {
21431e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul	 _mesa_make_current(&(c->mesa), &c->xm_draw_buffer->mesa_buffer);
2144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2147b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_make_current(NULL, NULL);
2148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2153693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaLoseCurrent(XMesaContext c)
2154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2156b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_make_current(NULL, NULL);
2157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Switch 3Dfx support hack between window and full-screen mode.
2163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2164693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaSetFXmode( GLint mode )
2165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2167367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   const char *fx = _mesa_getenv("MESA_GLX_FX");
2168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fx && fx[0] != 'd') {
2169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GET_CURRENT_CONTEXT(ctx);
2170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GrHwConfiguration hw;
2171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!FX_grSstQueryHardware(&hw)) {
2172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "!grSstQueryHardware\n");*/
2173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (hw.num_sst < 1) {
2176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "hw.num_sst < 1\n");*/
2177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctx) {
21801e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul         XMesaContext xmesa = XMESA_CONTEXT(ctx);
2181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (mode == XMESA_FX_WINDOW) {
21823b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul	    if (xmesa->xm_draw_buffer->FXisHackUsable) {
2183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       FX_grSstControl(GR_CONTROL_DEACTIVATE);
21843b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul	       xmesa->xm_draw_buffer->FXwindowHack = GL_TRUE;
2185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       return GL_TRUE;
2186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    }
2187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else if (mode == XMESA_FX_FULLSCREEN) {
2189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    FX_grSstControl(GR_CONTROL_ACTIVATE);
21903b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul	    xmesa->xm_draw_buffer->FXwindowHack = GL_FALSE;
2191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    return GL_TRUE;
2192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else {
2194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    /* Error: Bad mode value */
2195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*fprintf(stderr, "fallthrough\n");*/
2199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) mode;
2201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
2203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Read image from VooDoo frame buffer into X/Mesa's back XImage.
2210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void FXgetImage( XMesaBuffer b )
2212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
22131d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   GET_CURRENT_CONTEXT(ctx);
2214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static unsigned short pixbuf[MAX_WIDTH];
221501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul   GLuint x, y;
221601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul   int xpos, ypos;
2217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaWindow root;
2218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned int bw, depth, width, height;
22191e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   XMesaContext xmesa = XMESA_CONTEXT(ctx);
2220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   x = b->frontbuffer->x;
2223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   y = b->frontbuffer->y;
2224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   width = b->frontbuffer->width;
2225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   height = b->frontbuffer->height;
2226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   depth = b->frontbuffer->depth;
2227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
22283ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul   XGetGeometry( b->xm_visual->display, b->frontbuffer,
222901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul                 &root, &xpos, &ypos, &width, &height, &bw, &depth);
2230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->width != width || b->height != height) {
22323ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul      b->width = MIN2((int)width, b->FXctx->width);
22333ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul      b->height = MIN2((int)height, b->FXctx->height);
2234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->width & 1)
2235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->width--;  /* prevent odd width */
2236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      xmesa_alloc_back_buffer( b );
2237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   grLfbWriteColorFormat(GR_COLORFORMAT_ARGB);
22403ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul   if (b->xm_visual->undithered_pf==PF_5R6G5B) {
2241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 16bpp RGB */
2242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
22433ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                       0, b->FXctx->height - b->height,  /*pos*/
2244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->width, b->height,         /* size */
2245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->width * sizeof(GLushort), /* stride */
2246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                       b->backimage->data);         /* dest buffer */
2247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2248449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   else if (b->xm_visual->dithered_pf==PF_Dither
22493ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul	    && GET_VISUAL_DEPTH(b->xm_visual)==8) {
2250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 8bpp RGB */
2251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (y=0;y<b->height;y++) {
22523ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul         GLubyte *ptr = (GLubyte*) b->backimage->data
22533ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                        + b->backimage->bytes_per_line * y;
2254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XDITHER_SETUP(y);
2255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
22583ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                          0, b->FXctx->height-(b->height-y),
22595e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                          b->width, 1,
2260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
2264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (x=0;x<b->width;x++) {
2265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte r = (pixbuf[x] & 0xf800) >> 8;
2266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte g = (pixbuf[x] & 0x07e0) >> 3;
2267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte b = (pixbuf[x] & 0x001f) << 3;
2268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            *ptr++ = XDITHER( x, r, g, b);
2269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* General case: slow! */
2274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (y=0;y<b->height;y++) {
2275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
22773ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                          0, b->FXctx->height-(b->height-y),
22785e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen                          b->width, 1,
2279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
2283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (x=0;x<b->width;x++) {
2284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutPixel(b->backimage,x,y,
2285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  xmesa_color_to_pixel(xmesa,
2286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0xf800) >> 8,
2287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x07e0) >> 3,
2288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x001f) << 3,
22893ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul					       0xff,
22903ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                                               b->xm_visual->undithered_pf));
2291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   grLfbWriteColorFormat(GR_COLORFORMAT_ABGR);
2295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy the back buffer to the front buffer.  If there's no back buffer
2301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this is a no-op.
2302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSwapBuffers( XMesaBuffer b )
2304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
231018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
231160b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul      _mesa_notifySwapBuffers(ctx);
2312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul     if (b->backimage) {
2325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy Ximage from host's memory to server's window */
2326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
2328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    XShmPutImage( b->xm_visual->display, b->frontbuffer,
23309ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			  b->swapgc,
2331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  b->backimage, 0, 0,
2332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			  0, 0, b->width, b->height, False );
2333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
2336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
23409ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   b->backimage, 0, 0,
2342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   0, 0, b->width, b->height );
2343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy pixmap to window on server */
2348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaCopyArea( b->xm_visual->display,
2350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->backpixmap,   /* source drawable */
2351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->frontbuffer,  /* dest. drawable */
23529ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
2353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0, b->width, b->height,  /* source region */
2354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0                 /* dest region */
2355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      );
2356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2359655ba5d9927187e76b66f5886d090624dc4b1dd9Brian Paul#if !defined(XFree86Server)
2360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
2361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy sub-region of back buffer to front buffer
2368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
23761d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
237760b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul      _mesa_notifySwapBuffers(ctx);
2378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2380536ede7e00ff5e2f10be3bf9b60cd2cfa80b3518Brian Paul      int yTop = b->height - y - height;
2381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->backimage) {
2391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy Ximage from host's memory to server's window */
2392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->shm) {
2394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XShmPutImage( b->xm_visual->display, b->frontbuffer,
23969ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul                          b->swapgc,
2397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          b->backimage, x, yTop,
2398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          x, yTop, width, height, False );
2399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* wait for finished event??? */
2400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
24069ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   b->backimage, x, yTop,
2408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   x, yTop, width, height );
2409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy pixmap to window on server */
2413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaCopyArea( b->xm_visual->display,
2414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->backpixmap,           /* source drawable */
2415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			b->frontbuffer,          /* dest. drawable */
24169ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
2417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop, width, height,  /* source region */
2418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop                  /* dest region */
2419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      );
2420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
2427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * is a way to get "under the hood" of X/Mesa so one can manipulate the
2428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * back buffer directly.
2429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  pixmap - pointer to back buffer's Pixmap, or 0
2430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          ximage - pointer to back buffer's XImage, or NULL
2431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE = context is double buffered
2432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE = context is single buffered
2433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2434693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetBackBuffer( XMesaBuffer b,
2435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaPixmap *pixmap,
2436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaImage **ximage )
2437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b->db_state) {
2439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (pixmap)  *pixmap = b->backpixmap;
2440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ximage)  *ximage = b->backimage;
2441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *pixmap = 0;
2445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *ximage = NULL;
2446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the depth buffer associated with an XMesaBuffer.
2453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the XMesa buffer handle
2454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  width, height - size of buffer in pixels
2455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          bytesPerValue - bytes per depth value (2 or 4)
2456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          buffer - pointer to depth buffer values
2457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2459693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint *bytesPerValue, void **buffer )
2461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
24621832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!b->mesa_buffer.DepthBuffer) {
2463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *width = 0;
2464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *height = 0;
2465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = 0;
2466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *buffer = 0;
2467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
24701832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *width = b->mesa_buffer.Width;
24711832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *height = b->mesa_buffer.Height;
2472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = sizeof(GLdepth);
24731832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *buffer = b->mesa_buffer.DepthBuffer;
2474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaFlush( XMesaContext c )
2480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c && c->xm_visual) {
2482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
2484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSync( c->xm_visual->display, False );
2486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulconst char *XMesaGetString( XMesaContext c, int name )
2493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (name==XMESA_VERSION) {
24963160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul      return "5.0";
2497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (name==XMESA_EXTENSIONS) {
2499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return "";
2500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
2503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2508693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
2511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
2512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->frontbuffer==d && b->display==dpy) {
2513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
2514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
2517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Look for XMesaBuffers whose X window has been destroyed.
2523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate any such XMesaBuffers.
2524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaGarbageCollect( void )
2526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b, next;
2528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=next) {
2529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      next = b->Next;
2530a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul      if (b->display && b->frontbuffer && b->type == WINDOW) {
2531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* NOT_NEEDED */
2533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XSync(b->display, False);
2535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!window_exists( b->display, b->frontbuffer )) {
2536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* found a dead window, free the ancillary info */
2537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaDestroyBuffer( b );
2538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaReset( void )
2546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    while (XMesaBufferList)
2548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaDestroyBuffer(XMesaBufferList);
2549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    XMesaBufferList = NULL;
2551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat red, GLfloat green,
2556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat blue, GLfloat alpha )
2557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint r = (GLint) (red   * 255.0F);
2559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint g = (GLint) (green * 255.0F);
2560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint b = (GLint) (blue  * 255.0F);
2561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint a = (GLint) (alpha * 255.0F);
2562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (xmesa->pixelformat) {
2564449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Index:
2565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
2566449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Truecolor:
2567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
2570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
2573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
2574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
2575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
2576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
2577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
2578449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither:
2579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
2581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( x, y, r, g, b );
2582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2583449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_1Bit:
2584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
2585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
2586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
2587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(x, y, r, g, b);
2588449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Lookup:
2589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
2591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
2592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2593449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Grayscale:
2594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
2595449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_5R6G5B:
2596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
2597449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_True:
2598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, x, y, r, g, b);
2601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
260408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
2605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
2607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
261018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul/*
261118a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * This is typically called when the window size changes and we need
261218a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * to reallocate the buffer's back/depth/stencil/accum buffers.
261318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul */
261418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paulvoid XMesaResizeBuffers( XMesaBuffer b )
261518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul{
261618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   xmesa_resize_buffers( &(b->mesa_buffer) );
261718a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul
261818a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul}
261918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul
2620