xm_api.c revision f04979ae481acc9fdc423da06514c4d557edd7cd
1693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa 3-D graphics library
363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * Version:  6.5.2
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
5c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
8693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * copy of this software and associated documentation files (the "Software"),
9693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * to deal in the Software without restriction, including without limitation
10693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
12693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The above copyright notice and this permission notice shall be included
15693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
24693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
25d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
26d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \file xm_api.c
27d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *
28d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * All the XMesa* API functions.
29693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
30693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
31693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * NOTES:
32693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
33693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The window coordinate system origin (0,0) is in the lower-left corner
34693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * of the window.  X11's window coordinate origin is in the upper-left
35693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * corner of the window.  Therefore, most drawing functions in this
36693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * file have to flip Y coordinates.
37693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
38693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
39693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in support for the MIT Shared Memory extension.  If enabled, when you
40693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * use an Ximage for the back buffer in double buffered mode, the "swap"
41693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * operation will be faster.  You must also link with -lXext.
42693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
43693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Byte swapping:  If the Mesa host and the X display use a different
44693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * byte order then there's some trickiness to be aware of when using
45693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XImages.  The byte ordering used for the XImage is that of the X
46693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * display, not the Mesa host.
47693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The color-to-pixel encoding for True/DirectColor must be done
48693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * according to the display's visual red_mask, green_mask, and blue_mask.
49693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
50693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * do byte swapping if needed.  If one wants to directly "poke" the pixel
51693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * into the XImage's buffer then the pixel must be byte swapped first.  In
52693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
53693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and use XPutPixel everywhere except in the implementation of
54693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
55693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * instead of using XPutPixel we "poke" our values after byte-swapping
56693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the clear pixel value if needed.
57693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
58693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
59693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
60693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef __CYGWIN__
61693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef WIN32
62693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef __WIN32__
63693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
64693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
65693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glxheader.h"
66693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "GL/xmesa.h"
67693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "xmesaP.h"
68693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "context.h"
69693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "extensions.h"
70e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "framebuffer.h"
71693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glthread.h"
729a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h"
73a4575499679d9d91055a35c7673b81872ec127cbJouk Jansen#include "macros.h"
74e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "renderbuffer.h"
75724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/swrast.h"
76ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell#include "swrast_setup/swrast_setup.h"
7748f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell#include "vbo/vbo.h"
7823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "tnl/tnl.h"
79d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_context.h"
80d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_pipeline.h"
81d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h"
82d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
83304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#ifdef XFree86Server
84304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#include <GL/glxtokens.h>
85693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
86693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
87d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
88693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Global X driver lock
89693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
90693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul_glthread_Mutex _xmesa_lock;
91693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
92693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
93693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
94d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian 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
161d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian 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
174d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Check if the X Shared Memory extension is available.
176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  0 = not available
177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          1 = shared XImage support available
178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          2 = shared Pixmap support available also
179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int check_for_xshm( XMesaDisplay *display )
181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
182692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul#if defined(XFree86Server)
183692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   return 0;
184692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul#elif defined(USE_XSHM)
185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int major, minor, ignore;
186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Bool pixmaps;
187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return (pixmaps==True) ? 2 : 1;
191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return 0;
194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
200692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   /* No  XSHM support */
201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
206d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Apply gamma correction to an intensity value in [0..max].  Return the
208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * new intensity value.
209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
210d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic GLint
211d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulgamma_adjust( GLfloat gamma, GLint value, GLint max )
212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma == 1.0) {
214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return value;
215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double x = (double) value / (double) max;
218367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma));
219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
224d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the true number of bits per pixel for XImages.
226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * For example, if we request a 24-bit deep visual we may actually need/get
227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 32bpp XImages.  This function returns the appropriate bpp.
228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the X display
229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - desribes the visual to be used for XImages
230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  true number of bits per pixel for XImages
231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
232d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic int
233d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulbits_per_pixel( XMesaVisual xmv )
234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
235d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul#ifdef XFree86Server
236304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   const int depth = xmv->nplanes;
237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
2381814d6541b1fb4bad67fb6277a6fcbe518453230Brian Paul   assert(depth > 0);
239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (screenInfo.formats[i].depth == depth)
241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return screenInfo.formats[i].bitsPerPixel;
242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return depth;  /* should never get here, but this should be safe */
244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDisplay *dpy = xmv->display;
246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaImage *img;
248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bitsPerPixel;
249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Create a temporary XImage */
250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       ZPixmap, 0,           /*format, offset*/
252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       (char*) MALLOC(8),    /*data*/
253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       1, 1,                 /*width, height*/
254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       32,                   /*bitmap_pad*/
255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       0                     /*bytes_per_line*/
256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     );
257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(img);
258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* grab the bits/pixel value */
259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bitsPerPixel = img->bits_per_pixel;
260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* free the XImage */
261e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free( img->data );
262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img->data = NULL;
263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDestroyImage( img );
264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bitsPerPixel;
265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
266d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul}
267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Determine if a given X window ID is valid (window exists).
272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this by calling XGetWindowAttributes() for the window and
273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * checking if we catch an X error.
274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the display
275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         win - the window to check for existance
276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE - window exists
277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE - window doesn't exist
278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean WindowExistsFlag;
281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (xerr->error_code == BadWindow) {
286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      WindowExistsFlag = GL_FALSE;
287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes wa;
294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   WindowExistsFlag = GL_TRUE;
296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler(window_exists_err_handler);
297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSetErrorHandler(old_handler);
299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return WindowExistsFlag;
300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
305d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
306d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Return the size of the window (or pixmap) that corresponds to the
307d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * given XMesaBuffer.
308d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param width  returns width in pixels
309d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param height  returns height in pixels
310d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */
311d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulvoid
312d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b,
313d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                      GLuint *width, GLuint *height)
314d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul{
315d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul#ifdef XFree86Server
316d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH);
317d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT);
318d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul#else
319d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   Window root;
320d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   Status stat;
321d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   int xpos, ypos;
322d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   unsigned int w, h, bw, depth;
323d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
324d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _glthread_LOCK_MUTEX(_xmesa_lock);
325d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   XSync(b->xm_visual->display, 0); /* added for Chromium */
326d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   stat = XGetGeometry(dpy, b->frontxrb->pixmap, &root, &xpos, &ypos,
327d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                       &w, &h, &bw, &depth);
328d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _glthread_UNLOCK_MUTEX(_xmesa_lock);
329d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
330d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (stat) {
331d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      *width = w;
332d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      *height = h;
333d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
334d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   else {
335d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      /* probably querying a window that's recently been destroyed */
336d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      _mesa_warning(NULL, "XGetGeometry failed!\n");
337d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      *width = *height = 1;
338d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
339d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul#endif
340d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul}
341d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
342d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
343d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                Linked list of XMesaBuffers                 *****/
346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
348928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaBuffer XMesaBufferList = NULL;
349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
3518d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul/**
352d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Allocate a new XMesaBuffer object which corresponds to the given drawable.
353d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Note that XMesaBuffer is derived from GLframebuffer.
354d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * The new XMesaBuffer will not have any size (Width=Height=0).
355d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *
356d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param d  the corresponding X drawable (window or pixmap)
357d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param type  either WINDOW, PIXMAP or PBUFFER, describing d
358d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param vis  the buffer's visual
359d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param cmap  the window's colormap, if known.
360d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \return new XMesaBuffer or NULL if any problem
3618d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul */
3628d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paulstatic XMesaBuffer
363d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulcreate_xmesa_buffer(XMesaDrawable d, BufferType type,
364d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                    XMesaVisual vis, XMesaColormap cmap)
365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
366d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   GLboolean swAlpha;
367d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   XMesaBuffer b;
368e5fce1694cdfca615022bf7b987835384902acebBrian Paul
369d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER);
3708d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
371d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
372d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b)
373d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return NULL;
374d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
375d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->display = vis->display;
376d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->xm_visual = vis;
377d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->type = type;
378d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->cmap = cmap;
3798d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
380d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _mesa_initialize_framebuffer(&b->mesa_buffer, &vis->mesa_visual);
381928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian   b->mesa_buffer.Delete = xmesa_delete_framebuffer;
382e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
383d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /*
384d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    * Front renderbuffer
385d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    */
38637fd6be41134df46cb9dad7f9201188ff9707629Brian   b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE);
387d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b->frontxrb) {
388d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      _mesa_free(b);
389d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return NULL;
390d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
391d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->frontxrb->Parent = b;
392d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->frontxrb->drawable = d;
393d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->frontxrb->pixmap = (XMesaPixmap) d;
394d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT,
395d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                          &b->frontxrb->Base);
396e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
397d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /*
398d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    * Back renderbuffer
399d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    */
400d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (vis->mesa_visual.doubleBufferMode) {
40137fd6be41134df46cb9dad7f9201188ff9707629Brian      b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE);
402d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      if (!b->backxrb) {
403d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul         /* XXX free front xrb too */
404d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul         _mesa_free(b);
405d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul         return NULL;
406e5fce1694cdfca615022bf7b987835384902acebBrian Paul      }
407d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      b->backxrb->Parent = b;
408d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      /* determine back buffer implementation */
409d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP;
410d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
411d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT,
412d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                             &b->backxrb->Base);
413d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
414e5fce1694cdfca615022bf7b987835384902acebBrian Paul
415d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /*
416d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    * Software alpha planes
417d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    */
418d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (vis->mesa_visual.alphaBits > 0
419d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       && vis->undithered_pf != PF_8A8B8G8R
420d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       && vis->undithered_pf != PF_8A8R8G8B) {
421d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      /* Visual has alpha, but pixel format doesn't support it.
422d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       * We'll use an alpha renderbuffer wrapper.
423d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       */
424d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      swAlpha = GL_TRUE;
425d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
426d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   else {
427d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      swAlpha = GL_FALSE;
428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
429d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
430d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /*
431d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    * Other renderbuffer (depth, stencil, etc)
432d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    */
433d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _mesa_add_soft_renderbuffers(&b->mesa_buffer,
434d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                GL_FALSE,  /* color */
435d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                vis->mesa_visual.haveDepthBuffer,
436d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                vis->mesa_visual.haveStencilBuffer,
437d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                vis->mesa_visual.haveAccumBuffer,
438d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                swAlpha,
439d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                vis->mesa_visual.numAuxBuffers > 0 );
440d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
441d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /* insert buffer into linked list */
442d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->Next = XMesaBufferList;
443d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   XMesaBufferList = b;
444d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
449d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Find an XMesaBuffer by matching X display and colormap but NOT matching
451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the notThis buffer.
452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
453928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaBuffer
454928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis)
455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
466d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
467928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian * Remove buffer from linked list, delete if no longer referenced.
468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
469d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
470928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianxmesa_free_buffer(XMesaBuffer buffer)
471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer prev = NULL, b;
473928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian
474928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian   for (b = XMesaBufferList; b; b = b->Next) {
475928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      if (b == buffer) {
476928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         struct gl_framebuffer *fb = &buffer->mesa_buffer;
477928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian
478928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         /* unlink buffer from list */
479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (prev)
480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            prev->Next = buffer->Next;
481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaBufferList = buffer->Next;
4831832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
484928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         /* mark as delete pending */
485928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         fb->DeletePending = GL_TRUE;
4863049946fa742b654afa9b24f8bc79f387f01aea9Brian
4873049946fa742b654afa9b24f8bc79f387f01aea9Brian         /* Since the X window for the XMesaBuffer is going away, we don't
4883049946fa742b654afa9b24f8bc79f387f01aea9Brian          * want to dereference this pointer in the future.
4893049946fa742b654afa9b24f8bc79f387f01aea9Brian          */
4903049946fa742b654afa9b24f8bc79f387f01aea9Brian         b->frontxrb->drawable = 0;
4913049946fa742b654afa9b24f8bc79f387f01aea9Brian
492a510bc3ee1a696da120c09ee4ec33dc033f671acBrian         /* Unreference.  If count = zero we'll really delete the buffer */
493a510bc3ee1a696da120c09ee4ec33dc033f671acBrian         _mesa_unreference_framebuffer(&fb);
4941832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return;
496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* continue search */
498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prev = b;
499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* buffer not found in XMesaBufferList */
501928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian   _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n");
502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
505d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
506d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Copy X color table stuff from one XMesaBuffer to another.
507d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */
508d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
509d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulcopy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   dst->num_alloced = src->num_alloced;
516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(dst->alloced_colors, src->alloced_colors,
517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          sizeof(src->alloced_colors));
518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                   Misc Private Functions                   *****/
524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
527e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * A replacement for XAllocColor.  This function should never
529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * fail to allocate a color.  When XAllocColor fails, we return
530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the nearest matching color.  If we have to allocate many colors
531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this function isn't too efficient; the XQueryColors() could be
532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * done just once.
533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Written by Michael Pichler, Brian Paul, Mark Kilgard
534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - X display
535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - X colormap
536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmapSize - size of colormap
537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In/Out: color - the XColor struct
538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  exact - 1=exact color match, 0=closest match
539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          alloced - 1=XAlloc worked, 0=XAlloc failed
540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void
542693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulnoFaultXAllocColor( int client,
543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaDisplay *dpy,
544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColormap cmap,
545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int cmapSize,
546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColor *color,
547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int *exact, int *alloced )
548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Pixel *ppixIn;
551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   xrgb *ctable;
552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* we'll try to cache ctable for better remote display performance */
554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static Display *prevDisplay = NULL;
555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColormap prevCmap = 0;
556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static int prevCmapSize = 0;
557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColor *ctable = NULL;
558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaColor subColor;
560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i, bestmatch;
561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double mindist;       /* 3*2^16^2 exceeds long int precision. */
562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* First try just using XAllocColor. */
566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->red, &color->green, &color->blue,
569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->pixel,
570d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul		  client) == Success)
571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
572d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (XAllocColor(dpy, cmap, color))
573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
574d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   {
575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *exact = 1;
576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return;
578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Alloc failed, search for closest match */
581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Retrieve color table entries. */
583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* XXX alloca candidate. */
584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ppixIn[i] = i;
589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   QueryColors(cmap, cmapSize, ppixIn, ctable);
591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (prevDisplay != dpy || prevCmap != cmap
593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       || prevCmapSize != cmapSize || !ctable) {
594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* free previously cached color table */
595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctable)
596e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_free(ctable);
597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Get the color table from X */
598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(ctable);
600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i = 0; i < cmapSize; i++) {
601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         ctable[i].pixel = i;
602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XQueryColors(dpy, cmap, ctable, cmapSize);
604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevDisplay = dpy;
605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmap = cmap;
606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmapSize = cmapSize;
607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Find best match. */
611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bestmatch = -1;
612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mindist = 0.0;
613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dist = dr * dr + dg * dg + db * db;
618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (bestmatch < 0 || dist < mindist) {
619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bestmatch = i;
620693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         mindist = dist;
621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Return result. */
625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.red   = ctable[bestmatch].red;
626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.green = ctable[bestmatch].green;
627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.blue  = ctable[bestmatch].blue;
628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Try to allocate the closest match color.  This should only
629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * fail if the cell is read/write.  Otherwise, we're incrementing
630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the cell's reference count.
631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.red, &subColor.green, &subColor.blue,
635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.pixel,
636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, &subColor)) {
639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* do this to work around a problem reported by Frank Ortega */
644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.pixel = (unsigned long) bestmatch;
645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.red   = ctable[bestmatch].red;
646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.green = ctable[bestmatch].green;
6475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      subColor.blue  = ctable[bestmatch].blue;
648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.flags = DoRed | DoGreen | DoBlue;
649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 0;
650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
652e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(ppixIn);
653e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(ctable);
654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* don't free table, save it for next time */
656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *color = subColor;
659693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *exact = 0;
660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
664d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do setup for PF_GRAYSCALE pixel format.
666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Note that buffer may be NULL.
667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
668d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic GLboolean
669d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_grayscale(int client, XMesaVisual v,
670d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                XMesaBuffer buffer, XMesaColormap cmap)
671693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
672693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
676693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
683928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
6851832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
6861832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous XMesaBuffer which uses same
688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate 256 shades of gray */
694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int gray;
695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (gray=0;gray<256;gray++) {
697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            int exact, alloced;
701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaColor xcol;
702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.red   = (r << 8) | r;
703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.green = (g << 8) | g;
704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.blue  = (b << 8) | b;
705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            noFaultXAllocColor( client, v->display,
706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                cmap, GET_COLORMAP_SIZE(v),
707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                &xcol, &exact, &alloced );
708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!exact) {
709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               colorsfailed++;
710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (alloced) {
712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               assert(buffer->num_alloced<256);
713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->num_alloced++;
715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*OLD
718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(gray < 576);
719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+0] = xcol.pixel;
720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+1] = xcol.pixel;
721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+2] = xcol.pixel;
722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            */
727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray] = xcol.pixel;
728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray;
730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray;
731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray;
732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
734367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
7352ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL,
736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of 256 needed colors do not match exactly.\n",
737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  colorsfailed );
738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
742449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = PF_Grayscale;
743449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->undithered_pf = PF_Grayscale;
744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
749d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a PseudoColor, StaticColor,
751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * color.  While this function was originally designed just for 8-bit
754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Dithering code contributed by Bob Mercier.
756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
757d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic GLboolean
758d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_dithered_color(int client, XMesaVisual v,
759d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                     XMesaBuffer buffer, XMesaColormap cmap)
760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
772928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
7741832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
7751832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous, matching XMesaBuffer.
777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Do this to avoid time spent in noFaultXAllocColor.
778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate X colors and initialize color_table[], red_table[], etc */
783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int r, g, b, i;
784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
785d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul         for (r = 0; r < DITH_R; r++) {
786d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul            for (g = 0; g < DITH_G; g++) {
787d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul               for (b = 0; b < DITH_B; b++) {
788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  XMesaColor xcol;
789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  int exact, alloced;
790d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(DITH_R-1),65535);
791d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535);
792d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(DITH_B-1),65535);
793693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  noFaultXAllocColor( client, v->display,
794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      cmap, GET_COLORMAP_SIZE(v),
795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      &xcol, &exact, &alloced );
796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (!exact) {
797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     colorsfailed++;
798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (alloced) {
800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     assert(buffer->num_alloced<256);
801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->num_alloced++;
803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
804d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  i = DITH_MIX( r, g, b );
805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(i < 576);
806693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->color_table[i] = xcol.pixel;
807693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(xcol.pixel < 65536);
808d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1);
809d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1);
810d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1);
811693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               }
812693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
813693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
814693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
815367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
8162ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL,
817693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of %d needed colors do not match exactly.\n",
818d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  colorsfailed, DITH_R * DITH_G * DITH_B );
819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
823449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = PF_Dither;
824449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->undithered_pf = PF_Lookup;
825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
826693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
829d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
832693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Special dithering tables have to be initialized.
833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
834d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
835d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_8bit_hpcr(XMesaVisual v)
836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * on the root window AND the colormap obtainable by XGetRGBColormaps
840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * for that atom must be set on the window.  (see also tkInitWindow)
841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If that colormap is not set, the output will look stripy.
842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Setup color tables with gamma correction */
845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double g;
847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
8485e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   g = 1.0 / v->RedGamma;
8495e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   for (i=0; i<256; i++) {
850367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g ));
851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->GreenGamma;
855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
856367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g ));
857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->BlueGamma;
861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
862367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g ));
863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_HPCR;
867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* which method should I use to clear */
869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_FALSE: keep the ordinary method  */
870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_TRUE : clear with dither pattern */
871367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (v->hpcr_clear_flag) {
874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               DefaultRootWindow(v->display),
876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               16, 2, 8);
877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       0, 0, 16, 2, AllPlanes, ZPixmap);
880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
885d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a True/DirectColor visual.
887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
888d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
889d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap)
890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned long rmask, gmask, bmask;
892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) buffer;
893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) cmap;
894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute red multiplier (mask) and bit shift */
896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->rshift = 0;
897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   rmask = GET_REDMASK(v);
898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((rmask & 1)==0) {
899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->rshift++;
900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      rmask = rmask >> 1;
901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute green multiplier (mask) and bit shift */
904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->gshift = 0;
905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gmask = GET_GREENMASK(v);
906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((gmask & 1)==0) {
907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->gshift++;
908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gmask = gmask >> 1;
909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute blue multiplier (mask) and bit shift */
912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bshift = 0;
913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bmask = GET_BLUEMASK(v);
914693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((bmask & 1)==0) {
915693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->bshift++;
916693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      bmask = bmask >> 1;
917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
920693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Compute component-to-pixel lookup tables and dithering kernel
921693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      static GLubyte kernel[16] = {
924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          0*16,  8*16,  2*16, 10*16,
925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         12*16,  4*16, 14*16,  6*16,
926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          3*16, 11*16,  1*16,  9*16,
927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         15*16,  7*16, 13*16,  5*16,
928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      };
929692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      GLint rBits = _mesa_bitcount(rmask);
930692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      GLint gBits = _mesa_bitcount(gmask);
931692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      GLint bBits = _mesa_bitcount(bmask);
9323cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      GLint maxBits;
933693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLuint i;
934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=rmask; i++)
937693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=gmask; i++)
939693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=bmask; i++)
941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert RGB values from [0,255] to pixel components */
944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<256;i++) {
946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint r = gamma_adjust(v->RedGamma,   i, 255);
947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint g = gamma_adjust(v->GreenGamma, i, 255);
948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
952693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
953693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* overflow protection */
954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=256;i<512;i++) {
955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = v->RtoPixel[255];
956693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = v->GtoPixel[255];
957693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = v->BtoPixel[255];
958693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
959693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* setup dithering kernel */
9613cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      maxBits = rBits;
9623cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (gBits > maxBits)  maxBits = gBits;
9633cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (bBits > maxBits)  maxBits = bBits;
964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<16;i++) {
9653cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul         v->Kernel[i] = kernel[i] >> maxBits;
966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
968449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->undithered_pf = PF_Truecolor;
969449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor;
970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
973693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Now check for TrueColor visuals which we can optimize.
974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (   GET_REDMASK(v)  ==0x0000ff
976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_GREENMASK(v)==0x00ff00
977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_BLUEMASK(v) ==0xff0000
978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on SGI, Sun */
983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R;
984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on Linux, HP, IBM */
99341bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      if (GET_VISUAL_DEPTH(v)==32)
99441bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul	  v->undithered_pf = v->dithered_pf = PF_8A8R8G8B;
99541bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      else
99641bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul	  v->undithered_pf = v->dithered_pf = PF_8R8G8B;
997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xff0000
999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x00ff00
1000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x0000ff
1001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==24
1003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLuint)==4
1004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common packed 24 bpp config used on Linux */
1006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = v->dithered_pf = PF_8R8G8B24;
1007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xf800
1009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x07e0
1010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x001f
1011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==16
1013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && sizeof(GLushort)==2
1014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* 5-6-5 color weight on common PC VGA boards */
1016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = PF_5R6G5B;
1017449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = PF_Dither_5R6G5B;
1018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xe0
1020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x1c
1021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x03
1022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_FOR_HPCR(v)) {
1023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      setup_8bit_hpcr( v );
1024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1029d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
1030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a monochrome visual.
1031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1032d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
1033d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_monochrome( XMesaVisual v, XMesaBuffer b )
1034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) b;
1036449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = v->undithered_pf = PF_1Bit;
1037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* if black=1 then we must flip pixel values */
1038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
1039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
104363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul/**
104463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * When a context is bound for the first time, we can finally finish
104563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * initializing the context's visual and buffer information.
104663f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param v  the XMesaVisual to initialize
104763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param b  the XMesaBuffer to initialize (may be NULL)
104863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param rgb_flag  TRUE = RGBA mode, FALSE = color index mode
104963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param window  the window/pixmap we're rendering into
105063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param cmap  the colormap associated with the window/pixmap
105163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \return GL_TRUE=success, GL_FALSE=failure
1052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
105363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paulstatic GLboolean
105463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paulinitialize_visual_and_buffer(int client, XMesaVisual v, XMesaBuffer b,
105563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul                             GLboolean rgb_flag, XMesaDrawable window,
105663f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul                             XMesaColormap cmap)
1057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
105863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul   ASSERT(!b || b->xm_visual == v);
1059e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save true bits/pixel */
1061a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   v->BitsPerPixel = bits_per_pixel(v);
1062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v->BitsPerPixel > 0);
1063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1064d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (rgb_flag == GL_FALSE) {
1065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* COLOR-INDEXED WINDOW:
1066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Even if the visual is TrueColor or DirectColor we treat it as
1067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * being color indexed.  This is weird but might be useful to someone.
1068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1069449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = v->undithered_pf = PF_Index;
1070304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v);
1071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* RGB WINDOW:
1074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * We support RGB rendering into almost any kind of visual.
1075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1076304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      const int xclass = v->mesa_visual.visualType;
107763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
1078190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 setup_truecolor( v, b, cmap );
1079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
108063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) {
1081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 setup_monochrome( v, b );
1082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
108363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) {
1084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!setup_grayscale( client, v, b, cmap )) {
1085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
108863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR)
1089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
1090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!setup_dithered_color( client, v, b, cmap )) {
1091693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
109599f13343cf270d8dfde8445ae363d9b05256e05bBrian Paul	 _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n");
1096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return GL_FALSE;
1097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1098304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      v->mesa_visual.indexBits = 0;
1099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1100367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      if (_mesa_getenv("MESA_NO_DITHER")) {
1101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 v->dithered_pf = v->undithered_pf;
1102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If MESA_INFO env var is set print out some debugging info
1108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * which can help Brian figure out what's going on when a user
1109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * reports bugs.
1110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1111367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_INFO")) {
11122ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa visual = %p\n", (void *) v);
11132ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
11142ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
1115304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      _mesa_printf("X/Mesa level = %d\n", v->mesa_visual.level);
11162ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
11172ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
1118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b && window) {
1121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Do window-specific initializations */
1122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1123d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      /* these should have been set in create_xmesa_buffer */
1124d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      ASSERT(b->frontxrb->drawable == window);
1125d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window);
1126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Setup for single/double buffering */
11281832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (v->mesa_visual.doubleBufferMode) {
1129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Double buffered */
1130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->shm = check_for_xshm( v->display );
1131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* X11 graphics contexts */
1134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1135c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = CreateScratchGC(v->display, window->depth);
1136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1137c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = XCreateGC( v->display, window, 0, NULL );
1138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1139c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      XMesaSetFunction( v->display, b->gc, GXcopy );
1140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
11419ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      /* cleargc - for glClear() */
11429ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#ifdef XFree86Server
11439ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = CreateScratchGC(v->display, window->depth);
11449ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#else
11459ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = XCreateGC( v->display, window, 0, NULL );
11469ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#endif
11479ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->cleargc, GXcopy );
11489ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul
1149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
1151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Michael Pichler May 15, 1995.
1152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
11549ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->swapgc = CreateScratchGC(v->display, window->depth);
1155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
1156692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         CARD32 v[1];
1157692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         v[0] = FALSE;
1158692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
1159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
116163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      {
116263f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         XGCValues gcvalues;
116363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         gcvalues.graphics_exposures = False;
116463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         b->swapgc = XCreateGC(v->display, window,
116563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul                               GCGraphicsExposures, &gcvalues);
116663f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      }
1167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
11689ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->swapgc, GXcopy );
1169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Set fill style and tile pixmap once for all for HPCR stuff
1171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * (instead of doing it each time in clear_color_HPCR_pixmap())
1172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Initialize whole stuff
1173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Jacques Leroy March 8, 1998.
1174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
117563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) {
117663f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         int i;
117763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         for (i = 0; i < 16; i++) {
117863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul            XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
117963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul            XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
118063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         }
118163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap,
118263f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul                       b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
118363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
118463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
1185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Initialize the row buffer XImage for use in write_color_span() */
1188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1,
1190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul				     (char *)MALLOC(MAX_WIDTH*4));
1191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XCreateImage( v->display,
1193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->visual,
1194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->depth,
1195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  ZPixmap, 0,           /*format, offset*/
1196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  (char*) MALLOC(MAX_WIDTH*4),  /*data*/
1197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  MAX_WIDTH, 1,         /*width, height*/
1198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  32,                   /*bitmap_pad*/
1199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  0                     /*bytes_per_line*/ );
1200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1201ef5c82bd02926ac851537f1382352f8f6af33eceAlan Hourihane      if (!b->rowimage)
1202ef5c82bd02926ac851537f1382352f8f6af33eceAlan Hourihane         return GL_FALSE;
1203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Convert an RGBA color to a pixel value.
1212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long
1214e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulxmesa_color_to_pixel(GLcontext *ctx,
1215e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     GLubyte r, GLubyte g, GLubyte b, GLubyte a,
1216e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     GLuint pixelFormat)
1217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1218e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   XMesaContext xmesa = XMESA_CONTEXT(ctx);
1219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (pixelFormat) {
1220449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Index:
1221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
1222449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Truecolor:
1223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
1226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
1229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
123041bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      case PF_8A8R8G8B:
123141bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul         return PACK_8A8R8G8B( r, g, b, a );
1232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
1233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B24:
1235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
1236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
1237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
1238449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither:
1239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
1241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( 1, 0, r, g, b );
1242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1243449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_1Bit:
1244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
1245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
1247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(1, 1, r, g, b);
1248449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Lookup:
1249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
1251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
1252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1253449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Grayscale:
1254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
1255449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_True:
1256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1257449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_5R6G5B:
1258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, 1, 0, r, g, b);
1261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
1264e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel");
1265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
1267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1270304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#define NUM_VISUAL_TYPES   6
1271304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1272304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick/**
1273304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * Convert an X visual type to a GLX visual type.
1274304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1275304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.)
1276304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *        to be converted.
1277304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \return If \c visualType is a valid X visual type, a GLX visual type will
1278304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *         be returned.  Otherwise \c GLX_NONE will be returned.
1279304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1280304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \note
1281304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the
1282304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * DRI CVS tree.
1283304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick */
1284304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanickstatic GLint
1285304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanickxmesa_convert_from_x_visual_type( int visualType )
1286304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick{
1287304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    static const int glx_visual_types[ NUM_VISUAL_TYPES ] = {
1288304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_STATIC_GRAY,  GLX_GRAY_SCALE,
1289304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
1290304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_TRUE_COLOR,   GLX_DIRECT_COLOR
1291304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    };
1292304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1293304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    return ( (unsigned) visualType < NUM_VISUAL_TYPES )
1294304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	? glx_visual_types[ visualType ] : GLX_NONE;
1295304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick}
1296304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1297304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                       Public Functions                     *****/
1300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new X/Mesa visual.
1305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  display - X11 display
1306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - an XVisualInfo pointer
1307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - GL_TRUE = RGB mode,
1308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                    GL_FALSE = color index mode
1309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         alpha_flag - alpha buffer requested?
1310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         db_flag - GL_TRUE = double-buffered,
1311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                   GL_FALSE = single buffered
1312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stereo_flag - stereo visual?
1313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                       GL_FALSE = use an off-screen pixmap for back buffer
1315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         depth_size - requested bits/depth values, or zero
1316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stencil_size - requested bits/stencil values, or zero
1317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_red_size - requested bits/red accum values, or zero
1318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_green_size - requested bits/green accum values, or zero
1319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_blue_size - requested bits/blue accum values, or zero
1320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_alpha_size - requested bits/alpha accum values, or zero
1321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         num_samples - number of samples/pixel if multisampling, or zero
1322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         level - visual level, usually 0
1323304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *         visualCaveat - ala the GLX extension, usually GLX_NONE
1324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return;  a new XMesaVisual or 0 if error.
1325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1326693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
1327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               XMesaVisualInfo visinfo,
1328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean rgb_flag,
1329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean alpha_flag,
1330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean db_flag,
1331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean stereo_flag,
1332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean ximage_flag,
1333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint depth_size,
1334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint stencil_size,
1335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_red_size,
1336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_green_size,
1337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_blue_size,
1338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_alpha_size,
1339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint num_samples,
1340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint level,
1341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint visualCaveat )
1342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *gamma;
1344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisual v;
1345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint red_bits, green_bits, blue_bits, alpha_bits;
1346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
134763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul#ifndef XFree86Server
1348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* For debugging only */
1349367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_XSYNC")) {
1350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* This makes debugging X easier.
1351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * In your debugger, set a breakpoint on _XError to stop when an
1352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * X protocol error is generated.
1353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSynchronize( display, 1 );
1355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
135663f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul#endif
1357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!v) {
1360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * In the X server, NULL is passed in for the display.  It will have
1365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * to be set before using this visual.  See XMesaSetVisualDisplay()
1366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * below.
1367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->display = display;
1369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1370e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /* Save a copy of the XVisualInfo struct because the user may X_mesa_free()
1371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the struct but we may need some of the information contained in it
1372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * at a later time.
1373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1374304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#ifndef XFree86Server
1375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if(!v->visinfo) {
1377e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_free(v);
1378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
1381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* check for MESA_GAMMA environment variable */
1384367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   gamma = _mesa_getenv("MESA_GAMMA");
1385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma) {
1386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->ximage_flag = ximage_flag;
1397304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1398304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#ifdef XFree86Server
1399304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   /* We could calculate these values by ourselves.  nplanes is either the sum
1400304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * of the red, green, and blue bits or the number index bits.
1401304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * ColormapEntries is either (1U << index_bits) or
1402304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * (1U << max(redBits, greenBits, blueBits)).
1403304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    */
14041814d6541b1fb4bad67fb6277a6fcbe518453230Brian Paul   assert(visinfo->nplanes > 0);
1405304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->nplanes = visinfo->nplanes;
1406304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->ColormapEntries = visinfo->ColormapEntries;
1407304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1408304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.redMask = visinfo->redMask;
1409304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.greenMask = visinfo->greenMask;
1410304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.blueMask = visinfo->blueMask;
1411304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualID = visinfo->vid;
1412304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.screen = 0; /* FIXME: What should be done here? */
1413304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#else
1414304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.redMask = visinfo->red_mask;
1415304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.greenMask = visinfo->green_mask;
1416304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.blueMask = visinfo->blue_mask;
1417304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualID = visinfo->visualid;
1418304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.screen = visinfo->screen;
1419304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#endif
1420304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1421304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus))
1422304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class);
1423304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#else
1424304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class);
1425304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#endif
1426304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1427304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualRating = visualCaveat;
1428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
1430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1432304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      const int xclass = v->mesa_visual.visualType;
143363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
1434692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         red_bits   = _mesa_bitcount(GET_REDMASK(v));
1435692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         green_bits = _mesa_bitcount(GET_GREENMASK(v));
1436692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         blue_bits  = _mesa_bitcount(GET_BLUEMASK(v));
1437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* this is an approximation */
1441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int depth;
1442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth = GET_VISUAL_DEPTH(v);
1443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits = depth / 3;
1444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= red_bits;
1445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = depth / 2;
1446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= green_bits;
1447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits = depth;
1448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
1450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (alpha_flag && alpha_bits == 0)
1454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      alpha_bits = 8;
1455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
14561832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_visual( &v->mesa_visual,
14571832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            rgb_flag, db_flag, stereo_flag,
14581832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            red_bits, green_bits,
14591832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            blue_bits, alpha_bits,
1460304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick                            v->mesa_visual.indexBits,
14611832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            depth_size,
14621832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            stencil_size,
14631832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_red_size, accum_green_size,
14641832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_blue_size, accum_alpha_size,
14651832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            0 );
1466304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1467894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul   /* XXX minor hack */
1468304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.level = level;
1469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return v;
1470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSetVisualDisplay( XMesaDisplay *dpy, XMesaVisual v )
1474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    v->display = dpy;
1476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyVisual( XMesaVisual v )
1480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1482e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(v->visinfo);
1483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1484e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(v);
1485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1489d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/**
1490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaContext.
1491d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param v  the XMesaVisual
1492d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param share_list  another XMesaContext with which to share display
1493d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul *                    lists or NULL if no sharing is wanted.
1494d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \return an XMesaContext or NULL if error.
1495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
14967a1f3a37a10b162b067239dafa19fc6865a41f14Keith WhitwellXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
14989a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul   static GLboolean firstTime = GL_TRUE;
1499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaContext c;
15001e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   GLcontext *mesaCtx;
1501d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
1502d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   TNLcontext *tnl;
1503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (firstTime) {
1505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _glthread_INIT_MUTEX(_xmesa_lock);
1506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      firstTime = GL_FALSE;
1507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1509d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */
1510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1511d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   if (!c)
1512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
15141e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   mesaCtx = &(c->mesa);
15151e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul
1516d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* initialize with default driver functions, then plug in XMesa funcs */
1517d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   _mesa_init_driver_functions(&functions);
1518d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   xmesa_init_driver_functions(v, &functions);
15191e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual,
15201e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul                      share_list ? &(share_list->mesa) : (GLcontext *) NULL,
1521d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                      &functions, (void *) c)) {
1522e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_free(c);
1523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
15261e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_sw_extensions(mesaCtx);
15271e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_1_3_extensions(mesaCtx);
15281e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_1_4_extensions(mesaCtx);
152984351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul   _mesa_enable_1_5_extensions(mesaCtx);
153053f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   _mesa_enable_2_0_extensions(mesaCtx);
15314fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#if ENABLE_EXT_texure_compression_s3tc
15323c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca    if (c->Mesa_DXTn) {
1533692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul       _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc");
1534692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul       _mesa_enable_extension(mesaCtx, "GL_S3_s3tc");
15353c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca    }
1536692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul    _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1");
15373c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca#endif
15384fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#if ENABLE_EXT_timer_query
1539692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul    _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query");
15404fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#endif
1541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1542507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis#ifdef XFree86Server
1543507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis   /* If we're running in the X server, do bounds checking to prevent
1544507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis    * segfaults and server crashes!
1545507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis    */
1546507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis   mesaCtx->Const.CheckArrayBounds = GL_TRUE;
1547507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis#endif
1548507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis
1549d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* finish up xmesa context initializations */
1550d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE;
1551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_visual = v;
1552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->display = v->display;
1554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1556ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   /* Initialize the software rasterizer and helper modules.
1557ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell    */
1558c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul   if (!_swrast_CreateContext( mesaCtx ) ||
15590a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell       !_vbo_CreateContext( mesaCtx ) ||
1560c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul       !_tnl_CreateContext( mesaCtx ) ||
1561c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul       !_swsetup_CreateContext( mesaCtx )) {
1562c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul      _mesa_free_context_data(&c->mesa);
1563c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul      _mesa_free(c);
1564c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul      return NULL;
1565c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul   }
1566ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1567d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* tnl setup */
1568d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   tnl = TNL_CONTEXT(mesaCtx);
1569d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   tnl->Driver.RunPipeline = _tnl_run_pipeline;
1570d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* swrast setup */
15711e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   xmesa_register_swrast_functions( mesaCtx );
1572d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   _swsetup_Wakeup(mesaCtx);
1573709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
15747a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   return c;
1575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyContext( XMesaContext c )
1580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
15811e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   GLcontext *mesaCtx = &c->mesa;
1582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1583e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   XMesaBuffer xmbuf = XMESA_BUFFER(mesaCtx->DrawBuffer);
1584e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1585e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (xmbuf && xmbuf->FXctx)
1586e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      fxMesaDestroyContext(xmbuf->FXctx);
1587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
15881e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swsetup_DestroyContext( mesaCtx );
15891e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swrast_DestroyContext( mesaCtx );
15901e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _tnl_DestroyContext( mesaCtx );
15910a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell   _vbo_DestroyContext( mesaCtx );
15920983163fde91f1026146903155fd414725a79879Brian Paul   _mesa_free_context_data( mesaCtx );
15930983163fde91f1026146903155fd414725a79879Brian Paul   _mesa_free( c );
1594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1598d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
1599d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Private function for creating an XMesaBuffer which corresponds to an
1600d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * X window or pixmap.
1601d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param v  the window's XMesaVisual
1602d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param w  the window we're wrapping
1603d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param c  context used to initialize the buffer if 3Dfx mode in use.
1604d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \return  new XMesaBuffer or NULL if error
1605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
16068d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
16078d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreateWindowBuffer2(XMesaVisual v, XMesaWindow w, XMesaContext c)
1608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes attr;
1611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *fxEnvVar;
1614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
16168d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
16178d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaColormap cmap;
1618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16198d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   assert(v);
1620d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   assert(w);
1621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
1622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16238d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   /* Check that window depth matches visual depth */
1624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)w)->id);
1626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16277a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) {
1628a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
1629a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul                    GET_VISUAL_DEPTH(v), ((XMesaDrawable) w)->depth);
16306e776f25fd4d275722494824e2d5149a25ed4036Ian Romanick      return NULL;
16316e776f25fd4d275722494824e2d5149a25ed4036Ian Romanick   }
1632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
16337a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   XGetWindowAttributes( v->display, w, &attr );
16347a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell
16357a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   if (GET_VISUAL_DEPTH(v) != attr.depth) {
1636a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
1637a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul                    GET_VISUAL_DEPTH(v), attr.depth);
1638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
16406e776f25fd4d275722494824e2d5149a25ed4036Ian Romanick#endif
1641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16428d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   /* Find colormap */
1643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
16448d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (attr.colormap) {
16478d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      cmap = attr.colormap;
1648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
16502ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
1651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* this is weird, a window w/out a colormap!? */
1652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* OK, let's just allocate a new one and hope for the best */
16538d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1657d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap);
1658d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b)
16598d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      return NULL;
1660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16611832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
1662ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul                                      (XMesaDrawable) w, cmap )) {
1663928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      xmesa_free_buffer(b);
1664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1668367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   fxEnvVar = _mesa_getenv("MESA_GLX_FX");
1669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fxEnvVar) {
16707a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell     if (fxEnvVar[0]!='d') {
16717a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int attribs[100];
16727a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int numAttribs = 0;
16737a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       int hw;
16741832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.depthBits > 0) {
16757a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
1676fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca	 attribs[numAttribs++] = v->mesa_visual.depthBits;
16777a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
16781832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.doubleBufferMode) {
16797a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
16807a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
16811832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.accumRedBits > 0) {
16827a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	 attribs[numAttribs++] = FXMESA_ACCUM_SIZE;
16831832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul	 attribs[numAttribs++] = v->mesa_visual.accumRedBits;
16847a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
16851832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.stencilBits > 0) {
16867a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_STENCIL_SIZE;
16871832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul         attribs[numAttribs++] = v->mesa_visual.stencilBits;
16887a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
16891832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul       if (v->mesa_visual.alphaBits > 0) {
16907a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
1691fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca         attribs[numAttribs++] = v->mesa_visual.alphaBits;
16927a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
16931e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul       if (1) {
16947a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
16951e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul         attribs[numAttribs++] = (int) &(c->mesa);
16967a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
16977a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       attribs[numAttribs++] = FXMESA_NONE;
16987a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell
1699fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca       /* [dBorca] we should take an envvar for `fxMesaSelectCurrentBoard'!!! */
1700fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca       hw = fxMesaSelectCurrentBoard(0);
170129926a11b16ec7a235947d95e9a46777605dd30eBrian Paul
170229926a11b16ec7a235947d95e9a46777605dd30eBrian Paul       /* if these fail, there's a new bug somewhere */
170329926a11b16ec7a235947d95e9a46777605dd30eBrian Paul       ASSERT(b->mesa_buffer.Width > 0);
170429926a11b16ec7a235947d95e9a46777605dd30eBrian Paul       ASSERT(b->mesa_buffer.Height > 0);
170529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul
1706fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca       if ((hw == GR_SSTTYPE_VOODOO) || (hw == GR_SSTTYPE_Voodoo2)) {
170729926a11b16ec7a235947d95e9a46777605dd30eBrian Paul         b->FXctx = fxMesaCreateBestContext(0, b->mesa_buffer.Width,
170829926a11b16ec7a235947d95e9a46777605dd30eBrian Paul                                            b->mesa_buffer.Height, attribs);
1709e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if ((v->undithered_pf!=PF_Index) && (b->backxrb->ximage)) {
17107a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
1711fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	   if (b->FXctx && (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')) {
1712fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	     b->FXwindowHack = GL_TRUE;
1713fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	     FX_grSstControl(GR_CONTROL_DEACTIVATE);
1714fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	   }
1715fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca           else {
17167a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	     b->FXwindowHack = GL_FALSE;
1717fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	   }
17187a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         }
17197a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
1720e9e98405e720845f06f7a375585491e938f4dacdDaniel Borca       else {
17217a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
17227a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell	   b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE,
17237a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell					  GR_REFRESH_75Hz, attribs);
17247a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         else
172529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul	   b->FXctx = fxMesaCreateBestContext(0, b->mesa_buffer.Width,
172629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul                                              b->mesa_buffer.Height, attribs);
17277a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXisHackUsable = GL_FALSE;
17287a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell         b->FXwindowHack = GL_FALSE;
17297a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       }
17307a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       /*
17317a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       fprintf(stderr,
17327a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell               "voodoo %d, wid %d height %d hack: usable %d active %d\n",
1733c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca               hw, b->mesa_buffer.Width, b->mesa_buffer.Height,
1734c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca	       b->FXisHackUsable, b->FXwindowHack);
17357a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell       */
17367a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell     }
1737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
17392ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "WARNING: This Mesa Library includes the Glide driver but\n");
17402ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         you have not defined the MESA_GLX_FX env. var.\n");
17412ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         (check the README.3DFX file for more information).\n\n");
17422ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
1743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17508d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
17518d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w)
1752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaCreateWindowBuffer2( v, w, NULL );
1754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1757304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick/**
1758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X pixmap.
1759304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1760304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param v    the XMesaVisual
1761304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param p    the pixmap
1762304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or
1763304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *             \c GLX_DIRECT_COLOR visual for the pixmap
1764304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \returns new XMesaBuffer or NULL if error
1765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
17668d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
17678d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap)
1768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int client = 0;
17708d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
17718d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
17728d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   assert(v);
17738d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
1774d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap);
1775d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b)
1776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   client = CLIENT_ID(((XMesaDrawable)p)->id);
1780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17821832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1783ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul				     (XMesaDrawable) p, cmap)) {
1784928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      xmesa_free_buffer(b);
1785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17938d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
17948d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
17958d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul                   unsigned int width, unsigned int height)
1796190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul{
1797f2c5296dd7c990f566187621835414c3015058a1Brian Paul#ifdef XFree86Server
1798f2c5296dd7c990f566187621835414c3015058a1Brian Paul   return 0;
1799f2c5296dd7c990f566187621835414c3015058a1Brian Paul#else
1800190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   int client = 0;
1801e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaWindow root;
1802e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaDrawable drawable;  /* X Pixmap Drawable */
18038d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
18048d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
1805e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* allocate pixmap for front buffer */
1806e4656003caee346d9c4eb23256d73409271291a7Brian Paul   root = RootWindow( v->display, v->visinfo->screen );
1807d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   drawable = XCreatePixmap(v->display, root, width, height,
1808d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                            v->visinfo->depth);
1809d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!drawable)
1810d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return NULL;
1811d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
1812d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b = create_xmesa_buffer(drawable, PBUFFER, v, cmap);
1813d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b)
1814d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return NULL;
1815e4656003caee346d9c4eb23256d73409271291a7Brian Paul
1816190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1817e4656003caee346d9c4eb23256d73409271291a7Brian Paul				     drawable, cmap)) {
1818928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      xmesa_free_buffer(b);
1819190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      return NULL;
1820190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1821190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1822190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   return b;
1823f2c5296dd7c990f566187621835414c3015058a1Brian Paul#endif
1824190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul}
1825190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1826190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1827190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate an XMesaBuffer structure and all related info.
1830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1831928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianvoid
1832928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaDestroyBuffer(XMesaBuffer b)
1833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1834928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian   xmesa_free_buffer(b);
1835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1838d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
1839d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Query the current window size and update the corresponding GLframebuffer
1840d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * and all attached renderbuffers.
1841d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Called when:
1842d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *  1. the first time a buffer is bound to a context.
1843d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *  2. from glViewport to poll for window size changes
1844d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *  3. from the XMesaResizeBuffers() API function.
1845d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */
1846d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulvoid
1847d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer)
1848d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul{
1849d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   GLuint width, height;
1850d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   xmesa_get_window_size(xmctx->display, drawBuffer, &width, &height);
1851d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (drawBuffer->mesa_buffer.Width != width ||
1852d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       drawBuffer->mesa_buffer.Height != height) {
1853d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      _mesa_resize_framebuffer(&(xmctx->mesa),
1854d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                               &(drawBuffer->mesa_buffer), width, height);
1855d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
185642b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul   drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */
1857d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul}
1858d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
1859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
1862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1863693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
1864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaMakeCurrent2( c, b, b );
1866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
1871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1872693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
1873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                             XMesaBuffer readBuffer )
1874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
1876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!drawBuffer || !readBuffer)
1877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;  /* must specify buffers! */
1878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
1880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (drawBuffer->FXctx) {
1881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaMakeCurrent(drawBuffer->FXctx);
1882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18833b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul         c->xm_buffer = drawBuffer;
1884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
1886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
18881e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (&(c->mesa) == _mesa_get_current_context()
1889e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer
1890e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          && c->mesa.ReadBuffer == &readBuffer->mesa_buffer
1891d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul          && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) {
1892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* same context and buffer, do nothing */
1893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
1894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18963b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_buffer = drawBuffer;
1897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1898c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul      /* Call this periodically to detect when the user has begun using
1899c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul       * GL rendering from multiple threads.
1900c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul       */
1901c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul      _glapi_check_multithread();
1902c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
190342b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul      xmesa_check_and_update_buffer_size(c, drawBuffer);
190442b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul      if (readBuffer != drawBuffer)
1905d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul         xmesa_check_and_update_buffer_size(c, readBuffer);
1906d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
1907e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current(&(c->mesa),
1908e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                         &drawBuffer->mesa_buffer,
1909e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                         &readBuffer->mesa_buffer);
1910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
19111832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (c->xm_visual->mesa_visual.rgbMode) {
1912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*
1913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Must recompute and set these pixel values because colormap
1914693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * can be different for different windows.
1915693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
1916e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         c->clearpixel = xmesa_color_to_pixel( &c->mesa,
1917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[0],
1918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[1],
1919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[2],
1920693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[3],
1921693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->xm_visual->undithered_pf);
1922e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel);
1923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
1926e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      drawBuffer->wasCurrent = GL_TRUE;
1927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Detach */
1930e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current( NULL, NULL, NULL );
1931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1932693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1933693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1937693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Unbind the context c from its buffer.
1938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1939693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaUnbindContext( XMesaContext c )
1940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* A no-op for XFree86 integration purposes */
1942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1946693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaGetCurrentContext( void )
1947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
1949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
19501e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      XMesaContext xmesa = XMESA_CONTEXT(ctx);
1951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return xmesa;
1952693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1953693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
1955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1956693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1957693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1958693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1959693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentBuffer( void )
1960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1961693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
1962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
1963e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
1964e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      return xmbuf;
1965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
1968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* New in Mesa 3.1 */
1973693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentReadBuffer( void )
1974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
1976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
1977d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return XMESA_BUFFER(ctx->ReadBuffer);
1978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
1981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1985693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaForceCurrent(XMesaContext c)
1986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
19881e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (&(c->mesa) != _mesa_get_current_context()) {
1989e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	 _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer);
1990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1993e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current(NULL, NULL, NULL);
1994693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1999693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaLoseCurrent(XMesaContext c)
2000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2002e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_make_current(NULL, NULL, NULL);
2003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
2004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Switch 3Dfx support hack between window and full-screen mode.
2009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2010693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaSetFXmode( GLint mode )
2011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2013367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   const char *fx = _mesa_getenv("MESA_GLX_FX");
2014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (fx && fx[0] != 'd') {
2015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GET_CURRENT_CONTEXT(ctx);
2016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GrHwConfiguration hw;
2017693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!FX_grSstQueryHardware(&hw)) {
2018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "!grSstQueryHardware\n");*/
2019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (hw.num_sst < 1) {
2022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*fprintf(stderr, "hw.num_sst < 1\n");*/
2023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
2024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctx) {
2026fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca         /* [dBorca] Hack alert:
2027fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	  * oh, this is sooo wrong: ctx above is
2028fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	  * really an fxMesaContext, not an XMesaContext
2029fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca	  */
2030e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
2031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (mode == XMESA_FX_WINDOW) {
2032e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	    if (xmbuf->FXisHackUsable) {
2033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       FX_grSstControl(GR_CONTROL_DEACTIVATE);
2034e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	       xmbuf->FXwindowHack = GL_TRUE;
2035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	       return GL_TRUE;
2036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    }
2037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else if (mode == XMESA_FX_FULLSCREEN) {
2039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    FX_grSstControl(GR_CONTROL_ACTIVATE);
2040e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	    xmbuf->FXwindowHack = GL_FALSE;
2041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    return GL_TRUE;
2042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else {
2044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	    /* Error: Bad mode value */
2045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*fprintf(stderr, "fallthrough\n");*/
2049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) mode;
2051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
2053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2058693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Read image from VooDoo frame buffer into X/Mesa's back XImage.
2060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void FXgetImage( XMesaBuffer b )
2062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
20631d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   GET_CURRENT_CONTEXT(ctx);
2064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static unsigned short pixbuf[MAX_WIDTH];
206501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul   GLuint x, y;
2066d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   GLuint width, height;
20671e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   XMesaContext xmesa = XMESA_CONTEXT(ctx);
2068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2070e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   x = b->frontxrb->pixmap->x;
2071e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   y = b->frontxrb->pixmap->y;
2072e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   width = b->frontxrb->pixmap->width;
2073e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   height = b->frontxrb->pixmap->height;
2074e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   depth = b->frontxrb->pixmap->depth;
2075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2076d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   xmesa_get_window_size(b->display, b, &width, &height);
2077d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   x = y = 0;
2078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
20799cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul   if (b->mesa_buffer.Width != width || b->mesa_buffer.Height != height) {
20809cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      b->mesa_buffer.Width = MIN2((int)width, b->FXctx->width);
20819cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      b->mesa_buffer.Height = MIN2((int)height, b->FXctx->height);
20829cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      if (b->mesa_buffer.Width & 1)
2083d98c47300ad0640f8456caced6f03675de06d3a9Daniel Borca         b->mesa_buffer.Width--;  /* prevent odd width */
2084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2086fa21787b52d85a7aeaf5de64a39e019f39fcfa07Daniel Borca   /* [dBorca] we're always in the right GR_COLORFORMAT... aren't we? */
20871b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca   /* grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); */
20883ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul   if (b->xm_visual->undithered_pf==PF_5R6G5B) {
2089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 16bpp RGB */
2090c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca      grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
20919cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                       0, b->FXctx->height - b->mesa_buffer.Height,  /*pos*/
20929cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                       b->mesa_buffer.Width, b->mesa_buffer.Height,  /* size */
20939cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                       b->mesa_buffer.Width * sizeof(GLushort), /* stride */
2094e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                       b->backxrb->ximage->data);         /* dest buffer */
2095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2096449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   else if (b->xm_visual->dithered_pf==PF_Dither
20973ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul	    && GET_VISUAL_DEPTH(b->xm_visual)==8) {
2098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Special case: 8bpp RGB */
20999cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      for (y=0;y<b->mesa_buffer.Height;y++) {
2100e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLubyte *ptr = (GLubyte*) b->backxrb->ximage->data
2101e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                        + b->backxrb->ximage->bytes_per_line * y;
2102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XDITHER_SETUP(y);
2103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2105c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
21069cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                          0, b->FXctx->height-(b->mesa_buffer.Height-y),
21079cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                          b->mesa_buffer.Width, 1,
2108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
21129cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul         for (x=0;x<b->mesa_buffer.Width;x++) {
2113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte r = (pixbuf[x] & 0xf800) >> 8;
2114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte g = (pixbuf[x] & 0x07e0) >> 3;
2115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLubyte b = (pixbuf[x] & 0x001f) << 3;
2116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            *ptr++ = XDITHER( x, r, g, b);
2117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* General case: slow! */
21229cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul      for (y=0;y<b->mesa_buffer.Height;y++) {
2123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* read row from 3Dfx frame buffer */
2124c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
21259cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                          0, b->FXctx->height-(b->mesa_buffer.Height-y),
21269cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul                          b->mesa_buffer.Width, 1,
2127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          0,
2128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          pixbuf );
2129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* write to XImage back buffer */
21319cf65c5a5b2cccf180b5850c7a7346c4ca339932Brian Paul         for (x=0;x<b->mesa_buffer.Width;x++) {
2132e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            XMesaPutPixel(b->backxrb->ximage,x,y,
2133c8542705f712732d178d07da5ee1b7b25362db4bDaniel Borca			  xmesa_color_to_pixel(ctx,
2134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0xf800) >> 8,
2135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x07e0) >> 3,
2136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul					       (pixbuf[x] & 0x001f) << 3,
21373ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul					       0xff,
21383ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul                                               b->xm_visual->undithered_pf));
2139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
21421b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca   /* grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); */
2143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy the back buffer to the front buffer.  If there's no back buffer
2149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this is a no-op.
2150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSwapBuffers( XMesaBuffer b )
2152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2155692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (!b->backxrb) {
2156692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      /* single buffered */
2157692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      return;
2158692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   }
2159692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul
2160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
216318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
216460b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul      _mesa_notifySwapBuffers(ctx);
2165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2166692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (b->db_mode) {
2167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2177e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul     if (b->backxrb->ximage) {
2178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy Ximage from host's memory to server's window */
2179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
2181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2182ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul	    XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
21839ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			  b->swapgc,
2184e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			  b->backxrb->ximage, 0, 0,
218529926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			  0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
218629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul                          False );
2187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
2190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2193ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
21949ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2195e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			   b->backxrb->ximage, 0, 0,
219629926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			   0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height );
2197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* Copy pixmap to window on server */
2202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaCopyArea( b->xm_visual->display,
2204e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			b->backxrb->pixmap,   /* source drawable */
2205ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul			b->frontxrb->drawable,  /* dest. drawable */
22069ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
220729926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
2208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0                 /* dest region */
2209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      );
2210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2213655ba5d9927187e76b66f5886d090624dc4b1dd9Brian Paul#if !defined(XFree86Server)
2214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
2215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy sub-region of back buffer to front buffer
2222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
22301d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
223160b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul      _mesa_notifySwapBuffers(ctx);
2232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2233692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (!b->backxrb) {
2234692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      /* single buffered */
2235692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      return;
2236692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   }
2237692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul
2238692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (b->db_mode) {
223929926a11b16ec7a235947d95e9a46777605dd30eBrian Paul      int yTop = b->mesa_buffer.Height - y - height;
2240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX
2241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->FXctx) {
2242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         fxMesaSwapBuffers();
2243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->FXwindowHack)
2244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            FXgetImage(b);
2245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return;
2247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2249e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (b->backxrb->ximage) {
2250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy Ximage from host's memory to server's window */
2251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->shm) {
2253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2254ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul            XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
22559ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul                          b->swapgc,
2256e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                          b->backxrb->ximage, x, yTop,
2257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          x, yTop, width, height, False );
2258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* wait for finished event??? */
2259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2264ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
22659ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2266e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			   b->backxrb->ximage, x, yTop,
2267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   x, yTop, width, height );
2268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy pixmap to window on server */
2272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaCopyArea( b->xm_visual->display,
2273e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			b->backxrb->pixmap,           /* source drawable */
2274ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul			b->frontxrb->drawable,        /* dest. drawable */
22759ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
2276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop, width, height,  /* source region */
2277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop                  /* dest region */
2278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      );
2279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
2286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * is a way to get "under the hood" of X/Mesa so one can manipulate the
2287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * back buffer directly.
2288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  pixmap - pointer to back buffer's Pixmap, or 0
2289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          ximage - pointer to back buffer's XImage, or NULL
2290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE = context is double buffered
2291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE = context is single buffered
2292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2293ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul#ifndef XFree86Server
2294693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetBackBuffer( XMesaBuffer b,
2295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaPixmap *pixmap,
2296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaImage **ximage )
2297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2298692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (b->db_mode) {
2299692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      if (pixmap)
2300692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         *pixmap = b->backxrb->pixmap;
2301692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      if (ximage)
2302692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         *ximage = b->backxrb->ximage;
2303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *pixmap = 0;
2307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *ximage = NULL;
2308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2311ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul#endif /* XFree86Server */
2312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the depth buffer associated with an XMesaBuffer.
2316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the XMesa buffer handle
2317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  width, height - size of buffer in pixels
2318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          bytesPerValue - bytes per depth value (2 or 4)
2319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          buffer - pointer to depth buffer values
2320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2322693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint *bytesPerValue, void **buffer )
2324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2325e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb
2326e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer;
2327e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (!rb || !rb->Data) {
2328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *width = 0;
2329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *height = 0;
2330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = 0;
2331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *buffer = 0;
2332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
23351832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *width = b->mesa_buffer.Width;
23361832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *height = b->mesa_buffer.Height;
2337f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul      *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16
2338f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul         ? sizeof(GLushort) : sizeof(GLuint);
2339e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      *buffer = rb->Data;
2340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaFlush( XMesaContext c )
2346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c && c->xm_visual) {
2348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
2350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSync( c->xm_visual->display, False );
2352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulconst char *XMesaGetString( XMesaContext c, int name )
2359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (name==XMESA_VERSION) {
23623160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul      return "5.0";
2363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (name==XMESA_EXTENSIONS) {
2365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return "";
2366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
2369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2374693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
2377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
2378ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul      if (b->frontxrb->drawable == d && b->display == dpy) {
2379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
2380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
2383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
23866c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul/**
23876c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul * Free/destroy all XMesaBuffers associated with given display.
23886c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul */
23896c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paulvoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy)
23906c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul{
23916c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul   XMesaBuffer b, next;
23926c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul   for (b = XMesaBufferList; b; b = next) {
23936c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul      next = b->Next;
23946c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul      if (b->display == dpy) {
2395928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         xmesa_free_buffer(b);
23966c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul      }
23976c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul   }
23986c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul}
23996c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul
2400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Look for XMesaBuffers whose X window has been destroyed.
2403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate any such XMesaBuffers.
2404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaGarbageCollect( void )
2406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b, next;
2408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=next) {
2409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      next = b->Next;
2410ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul      if (b->display && b->frontxrb->drawable && b->type == WINDOW) {
2411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* NOT_NEEDED */
2413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XSync(b->display, False);
2415ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul         if (!window_exists( b->display, b->frontxrb->drawable )) {
2416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* found a dead window, free the ancillary info */
2417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaDestroyBuffer( b );
2418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaReset( void )
2426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    while (XMesaBufferList)
2428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	XMesaDestroyBuffer(XMesaBufferList);
2429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    XMesaBufferList = NULL;
2431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat red, GLfloat green,
2436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat blue, GLfloat alpha )
2437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2438e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLcontext *ctx = &xmesa->mesa;
2439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint r = (GLint) (red   * 255.0F);
2440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint g = (GLint) (green * 255.0F);
2441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint b = (GLint) (blue  * 255.0F);
2442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint a = (GLint) (alpha * 255.0F);
2443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (xmesa->pixelformat) {
2445449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Index:
2446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
2447449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Truecolor:
2448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
2451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
2454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
245541bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      case PF_8A8R8G8B:
245641bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul         return PACK_8A8R8G8B( r, g, b, a );
2457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
2458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
2459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
2460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
2461449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither:
2462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
2464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( x, y, r, g, b );
2465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2466449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_1Bit:
2467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
2468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
2469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
2470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(x, y, r, g, b);
2471449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Lookup:
2472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
2474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
2475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2476449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Grayscale:
2477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
2478449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_5R6G5B:
2479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
2480449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_True:
2481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, x, y, r, g, b);
2484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
248708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
2488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
2490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
249318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul/*
249418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * This is typically called when the window size changes and we need
249518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * to reallocate the buffer's back/depth/stencil/accum buffers.
249618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul */
2497d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulvoid
2498d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian PaulXMesaResizeBuffers( XMesaBuffer b )
249918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul{
2500e0e993c5ff090058037875642dcd34727a3d8760Adam Jackson   GET_CURRENT_CONTEXT(ctx);
2501d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   XMesaContext xmctx = XMESA_CONTEXT(ctx);
2502f04979ae481acc9fdc423da06514c4d557edd7cdMathias Hopf   if (!xmctx)
2503f04979ae481acc9fdc423da06514c4d557edd7cdMathias Hopf      return;
2504d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   xmesa_check_and_update_buffer_size(xmctx, b);
250518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul}
250618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul
2507