xm_api.c revision 9a33a11d714c90162d32781ebbd2c1dfab52cfd1
1770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* $Id: xm_api.c,v 1.37 2002/06/13 04:28:30 brianp Exp $ */
2770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
3770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
4770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Mesa 3-D graphics library
5770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Version:  4.0.2
6770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
7770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
8770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
9770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
10770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * copy of this software and associated documentation files (the "Software"),
11770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to deal in the Software without restriction, including without limitation
12770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
14770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software is furnished to do so, subject to the following conditions:
15770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
16770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The above copyright notice and this permission notice shall be included
17770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * in all copies or substantial portions of the Software.
18770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
19770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
26770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* $XFree86: xc/extras/Mesa/src/X/xm_api.c,v 1.2 2002/02/26 23:37:31 tsi Exp $ */
27770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
28770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
29ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick * This file contains the implementations of all the XMesa* functions.
30ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul *
31ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul *
32ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul * NOTES:
33ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul *
34ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul * The window coordinate system origin (0,0) is in the lower-left corner
35770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * of the window.  X11's window coordinate origin is in the upper-left
36ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul * corner of the window.  Therefore, most drawing functions in this
37ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul * file have to flip Y coordinates.
38770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
39770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
40770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * in support for the MIT Shared Memory extension.  If enabled, when you
41770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * use an Ximage for the back buffer in double buffered mode, the "swap"
42770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * operation will be faster.  You must also link with -lXext.
43770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
44770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Byte swapping:  If the Mesa host and the X display use a different
45ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick * byte order then there's some trickiness to be aware of when using
46ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick * XImages.  The byte ordering used for the XImage is that of the X
47ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick * display, not the Mesa host.
48770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The color-to-pixel encoding for True/DirectColor must be done
49770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * according to the display's visual red_mask, green_mask, and blue_mask.
50770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
51770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * do byte swapping if needed.  If one wants to directly "poke" the pixel
52770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * into the XImage's buffer then the pixel must be byte swapped first.  In
53770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
54770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * and use XPutPixel everywhere except in the implementation of
557c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
567c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul * instead of using XPutPixel we "poke" our values after byte-swapping
57770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the clear pixel value if needed.
58770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
59770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
60ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick
61ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick#ifdef __CYGWIN__
62770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#undef WIN32
63770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#undef __WIN32__
64770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
65770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
66770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "glxheader.h"
67770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "GL/xmesa.h"
68770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "xmesaP.h"
69770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "context.h"
70df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#include "extensions.h"
71df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#include "glthread.h"
72df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#include "imports.h"
73770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "matrix.h"
74770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "mem.h"
75df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#include "mmath.h"
76df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#include "mtypes.h"
77df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#ifdef HAVE_CONFIG_H
78639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#include "conf.h"
79639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#endif
80639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#include "macros.h"
819ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#include "texformat.h"
829ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#include "texstore.h"
839ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#include "swrast/swrast.h"
849ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#include "swrast_setup/swrast_setup.h"
85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "array_cache/acache.h"
86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "tnl/tnl.h"
87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef GLX_NONE_EXT
899ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#define GLX_NONE_EXT 0x8000
909ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#endif
919ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
929ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick/*
94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Global X driver lock
95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_glthread_Mutex _xmesa_lock;
97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Lookup tables for HPCR pixel format:
102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic short hpcr_rgbTbl[3][256] = {
104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick},
122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
139592a6642fc5c9f697bcc6521c99fe00b2de827c8Brian Paul},
140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 40,  40,  41,  41,  42,  42,  43,  43,  44,  44,  45,  45,  46,  46,  47,  47,
143565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
144565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
145565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
146565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
147565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  86,  86,  87,  87,
148565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
149565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick};
159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**********************************************************************/
163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*****                     X Utility Functions                    *****/
164ede0cd4d8c8eb8c6c443c84905138091944d69afIan Romanick/**********************************************************************/
165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * X/Mesa error reporting function:
169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void error( const char *msg )
171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void)DitherValues;		/* Muffle compiler */
173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (getenv("MESA_DEBUG"))
175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      fprintf( stderr, "X/Mesa error: %s\n", msg );
176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return the host's byte order as LSBFirst or MSBFirst ala X.
1813fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul */
182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef XFree86Server
1833fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paulstatic int host_byte_order( void )
184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int i = 1;
1861edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   char *cptr = (char *) &i;
187aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick   return (*cptr==1) ? LSBFirst : MSBFirst;
188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1910e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick
1920e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick/*
193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Error handling.
194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef XFree86Server
196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int mesaXErrorFlag = 0;
197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event )
199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2008ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   (void) dpy;
201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) event;
202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   mesaXErrorFlag = 1;
203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 0;
204eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick}
205565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick#endif
206565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Check if the X Shared Memory extension is available.
210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  0 = not available
211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *          1 = shared XImage support available
212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *          2 = shared Pixmap support available also
213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef XFree86Server
21581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanickstatic int check_for_xshm( XMesaDisplay *display )
21681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick{
217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef USE_XSHM
218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int major, minor, ignore;
219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   Bool pixmaps;
220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 return (pixmaps==True) ? 2 : 1;
224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 return 0;
227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return 0;
231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Can't compile XSHM support */
234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 0;
235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
237333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick#endif
238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return the width and height of the given drawable.
242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void get_drawable_size( XMesaDisplay *dpy, XMesaDrawable d,
244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               unsigned int *width, unsigned int *height)
245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    (void) dpy;
248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    *width = d->width;
249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    *height = d->height;
250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   Window root;
252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int x, y;
253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   unsigned int bw, depth;
254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _glthread_LOCK_MUTEX(_xmesa_lock);
256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XGetGeometry( dpy, d, &root, &x, &y, width, height, &bw, &depth );
257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _glthread_UNLOCK_MUTEX(_xmesa_lock);
258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Apply gamma correction to an intensity value in [0..max].  Return the
264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * new intensity value.
265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic GLint gamma_adjust( GLfloat gamma, GLint value, GLint max )
267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (gamma == 1.0) {
269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return value;
270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      double x = (double) value / (double) max;
273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return IROUND_POS((GLfloat) max * pow(x, 1.0F/gamma));
274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return the true number of bits per pixel for XImages.
281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * For example, if we request a 24-bit deep visual we may actually need/get
282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * 32bpp XImages.  This function returns the appropriate bpp.
283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Input:  dpy - the X display
284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         visinfo - desribes the visual to be used for XImages
285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  true number of bits per pixel for XImages
286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int bits_per_pixel( XMesaVisual xmv )
290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaVisualInfo visinfo = xmv->visinfo;
292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   const int depth = visinfo->nplanes;
293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int i;
294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
29588018e2e073909ae807f16707f2701e068900926Ian Romanick      if (screenInfo.formats[i].depth == depth)
29688018e2e073909ae807f16707f2701e068900926Ian Romanick         return screenInfo.formats[i].bitsPerPixel;
29788018e2e073909ae807f16707f2701e068900926Ian Romanick   }
298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return depth;  /* should never get here, but this should be safe */
299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int bits_per_pixel( XMesaVisual xmv )
304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
3050e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick   XMesaDisplay *dpy = xmv->display;
306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaVisualInfo visinfo = xmv->visinfo;
307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaImage *img;
308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int bitsPerPixel;
309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Create a temporary XImage */
310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		       ZPixmap, 0,           /*format, offset*/
312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		       (char*) MALLOC(8),    /*data*/
313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		       1, 1,                 /*width, height*/
314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		       32,                   /*bitmap_pad*/
315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		       0                     /*bytes_per_line*/
316301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick                     );
317301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick   assert(img);
318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* grab the bits/pixel value */
31941d5696628a5eef62cd671711b33edea9344977dIan Romanick   bitsPerPixel = img->bits_per_pixel;
32041d5696628a5eef62cd671711b33edea9344977dIan Romanick   /* free the XImage */
32141d5696628a5eef62cd671711b33edea9344977dIan Romanick   FREE( img->data );
32241d5696628a5eef62cd671711b33edea9344977dIan Romanick   img->data = NULL;
32341d5696628a5eef62cd671711b33edea9344977dIan Romanick   XMesaDestroyImage( img );
324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return bitsPerPixel;
325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Determine if a given X window ID is valid (window exists).
332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Do this by calling XGetWindowAttributes() for the window and
333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * checking if we catch an X error.
334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Input:  dpy - the display
335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         win - the window to check for existance
336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  GL_TRUE - window exists
337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *          GL_FALSE - window doesn't exist
338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef XFree86Server
340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic GLboolean WindowExistsFlag;
341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) dpy;
345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (xerr->error_code == BadWindow) {
346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      WindowExistsFlag = GL_FALSE;
347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 0;
349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
3520db5ef074169589bc4d665094147aa284a5496d7Ian Romanick{
3530db5ef074169589bc4d665094147aa284a5496d7Ian Romanick   XWindowAttributes wa;
3540db5ef074169589bc4d665094147aa284a5496d7Ian Romanick   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
3550db5ef074169589bc4d665094147aa284a5496d7Ian Romanick   WindowExistsFlag = GL_TRUE;
356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   old_handler = XSetErrorHandler(window_exists_err_handler);
3570db5ef074169589bc4d665094147aa284a5496d7Ian Romanick   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
3580db5ef074169589bc4d665094147aa284a5496d7Ian Romanick   XSetErrorHandler(old_handler);
3590db5ef074169589bc4d665094147aa284a5496d7Ian Romanick   return WindowExistsFlag;
3600db5ef074169589bc4d665094147aa284a5496d7Ian Romanick}
361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**********************************************************************/
366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*****                Linked list of XMesaBuffers                 *****/
367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**********************************************************************/
368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic XMesaBuffer XMesaBufferList = NULL;
370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* Allocate a new XMesaBuffer, add to linked list */
373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic XMesaBuffer alloc_xmesa_buffer(void)
3748ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick{
375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaBuffer b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b) {
377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->Next = XMesaBufferList;
378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaBufferList = b;
379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return b;
381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
385a0f7b869592013b24a5bacf0ceb2bdb1e9146378Paul Berry * Find an XMesaBuffer by matching X display and colormap but NOT matching
386a0f7b869592013b24a5bacf0ceb2bdb1e9146378Paul Berry * the notThis buffer.
3879ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick */
388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic XMesaBuffer find_xmesa_buffer(XMesaDisplay *dpy,
389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                     XMesaColormap cmap,
390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                     XMesaBuffer notThis)
391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaBuffer b;
3939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   for (b=XMesaBufferList; b; b=b->Next) {
394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return b;
396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return NULL;
3999ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick}
400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Free an XMesaBuffer, remove from linked list, perhaps free X colormap
404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * entries.
405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
4069ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstatic void free_xmesa_buffer(int client, XMesaBuffer buffer)
407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaBuffer prev = NULL, b;
409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) client;
410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (b=XMesaBufferList; b; b=b->Next) {
411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b==buffer) {
412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* unlink bufer from list */
4139ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         if (prev)
414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            prev->Next = buffer->Next;
415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         else
416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            XMesaBufferList = buffer->Next;
417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* Check to free X colors */
418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (buffer->num_alloced>0) {
4199ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick            /* If no other buffer uses this X colormap then free the colors. */
420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            if (!find_xmesa_buffer(buffer->display, buffer->cmap, buffer)) {
4211edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick#ifdef XFree86Server
4221edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick               (void)FreeColors(buffer->cmap, client,
4231edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick				buffer->num_alloced, buffer->alloced_colors,
4241edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick				0);
4251edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick#else
426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick               XFreeColors(buffer->display, buffer->cmap,
4270db5ef074169589bc4d665094147aa284a5496d7Ian Romanick                           buffer->alloced_colors, buffer->num_alloced, 0);
4281edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick#endif
4291edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick            }
4301edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick         }
4311edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4321edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick         _mesa_free_framebuffer_data(&buffer->mesa_buffer);
4331edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick         FREE(buffer);
4341edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4351edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick         return;
4361edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick      }
4371edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick      /* continue search */
4381edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick      prev = b;
4391edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   }
4401edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   /* buffer not found in XMesaBufferList */
4411edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   _mesa_problem(NULL,"free_xmesa_buffer() - buffer not found\n");
4421edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick}
4431edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4441edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4451edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick/* Copy X color table stuff from one XMesaBuffer to another. */
4461edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanickstatic void copy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
4471edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick{
4481edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
4491edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
4501edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
4511edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
4521edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   dst->num_alloced = src->num_alloced;
4531edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   MEMCPY(dst->alloced_colors, src->alloced_colors,
4541edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick          sizeof(src->alloced_colors));
4551edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick}
4561edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**********************************************************************/
460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*****                   Misc Private Functions                   *****/
461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**********************************************************************/
462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
4640db5ef074169589bc4d665094147aa284a5496d7Ian Romanick/*
465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return number of bits set in n.
46681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick */
46781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanickstatic int bitcount( unsigned long n )
46881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick{
46981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   int bits;
47081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   for (bits=0; n>0; n=n>>1) {
47181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      if (n&1) {
47281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         bits++;
47381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      }
474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return bits;
4768ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick}
4778ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4789ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
4798ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4808ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick/*
4818ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * Allocate a shared memory XImage back buffer for the given XMesaBuffer.
4828ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick * Return:  GL_TRUE if success, GL_FALSE if error
4838ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick */
4848ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick#ifndef XFree86Server
4858ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanickstatic GLboolean alloc_shm_back_buffer( XMesaBuffer b )
4868ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick{
4878ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick#ifdef USE_XSHM
4888ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   /*
4898ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick    * We have to do a _lot_ of error checking here to be sure we can
4908ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick    * really use the XSHM extension.  It seems different servers trigger
4918ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick    * errors at different points if the extension won't work.  Therefore
4928ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick    * we have to be very careful...
4938ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick    */
4948ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   GC gc;
4958ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   int (*old_handler)( XMesaDisplay *, XErrorEvent * );
4968ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4978ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   b->backimage = XShmCreateImage( b->xm_visual->display,
4988ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick                                   b->xm_visual->visinfo->visual,
4998ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick                                   b->xm_visual->visinfo->depth,
5008ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick				   ZPixmap, NULL, &b->shminfo,
5018ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick				   b->width, b->height );
5028ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   if (b->backimage == NULL) {
5038ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      error("alloc_back_buffer: Shared memory error (XShmCreateImage), disabling.");
5048ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      b->shm = 0;
5058ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      return GL_FALSE;
5068ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   }
5078ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
5088ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   b->shminfo.shmid = shmget( IPC_PRIVATE, b->backimage->bytes_per_line
5098ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick			     * b->backimage->height, IPC_CREAT|0777 );
5108ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick   if (b->shminfo.shmid < 0) {
5118ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      if (getenv("MESA_DEBUG"))
5128ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick          perror("alloc_back_buffer");
5138ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      XDestroyImage( b->backimage );
5148ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      b->backimage = NULL;
5158ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      error("alloc_back_buffer: Shared memory error (shmget), disabling.");
5168ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      b->shm = 0;
5178ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick      return GL_FALSE;
518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   b->shminfo.shmaddr = b->backimage->data
521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                      = (char*)shmat( b->shminfo.shmid, 0, 0 );
522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->shminfo.shmaddr == (char *) -1) {
523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (getenv("MESA_DEBUG"))
524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          perror("alloc_back_buffer");
525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XDestroyImage( b->backimage );
526770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->backimage = NULL;
528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      error("alloc_back_buffer: Shared memory error (shmat), disabling.");
529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->shm = 0;
530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_FALSE;
5311edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   }
5321edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
5331edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick   b->shminfo.readOnly = False;
534aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick   mesaXErrorFlag = 0;
535aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick   old_handler = XSetErrorHandler( mesaHandleXError );
536aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick   /* This may trigger the X protocol error we're ready to catch: */
537aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick   XShmAttach( b->xm_visual->display, &b->shminfo );
538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XSync( b->xm_visual->display, False );
539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (mesaXErrorFlag) {
541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* we are on a remote display, this error is normal, don't print it */
542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XFlush( b->xm_visual->display );
543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      mesaXErrorFlag = 0;
544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XDestroyImage( b->backimage );
545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      shmdt( b->shminfo.shmaddr );
546648dac4251de69d2949026af3dec0b0befee734bIan Romanick      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->backimage = NULL;
5489ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      b->shm = 0;
549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      (void) XSetErrorHandler( old_handler );
550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_FALSE;
551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
552eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   shmctl( b->shminfo.shmid, IPC_RMID, 0 ); /* nobody else needs it */
554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Finally, try an XShmPutImage to be really sure the extension works */
556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   gc = XCreateGC( b->xm_visual->display, b->frontbuffer, 0, NULL );
557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XShmPutImage( b->xm_visual->display, b->frontbuffer, gc,
558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 b->backimage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False );
559eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick   XSync( b->xm_visual->display, False );
560eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick   XFreeGC( b->xm_visual->display, gc );
561eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick   (void) XSetErrorHandler( old_handler );
562eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick   if (mesaXErrorFlag) {
563eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      XFlush( b->xm_visual->display );
564eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      mesaXErrorFlag = 0;
565eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      XDestroyImage( b->backimage );
566eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      shmdt( b->shminfo.shmaddr );
567eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
568eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      b->backimage = NULL;
569eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      b->shm = 0;
570eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      return GL_FALSE;
571eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick   }
572eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
573eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick   if (b->backimage) {
574eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      int height = b->backimage->height;
575eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      /* Needed by PIXELADDR1 macro */
576eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      b->ximage_width1 = b->backimage->bytes_per_line;
577eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      b->ximage_origin1 = (GLubyte *) b->backimage->data
578eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick                        + b->ximage_width1 * (height-1);
579eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      /* Needed by PIXELADDR2 macro */
580770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->ximage_width2 = b->backimage->bytes_per_line / 2;
581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->ximage_origin2 = (GLushort *) b->backimage->data
582eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick                        + b->ximage_width2 * (height-1);
583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* Needed by PIXELADDR3 macro */
584eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      b->ximage_width3 = b->backimage->bytes_per_line;
585b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick      b->ximage_origin3 = (GLubyte *) b->backimage->data
586b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick                        + b->ximage_width3 * (height-1);
587b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick      /* Needed by PIXELADDR4 macro */
588b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick      b->ximage_width4 = b->backimage->width;
589eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      b->ximage_origin4 = (GLuint *) b->backimage->data
590b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick                        + b->ximage_width4 * (height-1);
591b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick   }
592b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick
593b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick   return GL_TRUE;
594b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick#else
5957c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul   /* Can't compile XSHM support */
596b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick   return GL_FALSE;
597639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#endif
598639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul}
599639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#endif
600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
603770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Setup an off-screen pixmap or Ximage to use as the back buffer.
605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Input:  b - the X/Mesa buffer
606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
607770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid xmesa_alloc_back_buffer( XMesaBuffer b )
608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->db_state==BACK_XIMAGE) {
610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* Deallocate the old backimage, if any */
611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->backimage) {
612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#if defined(USE_XSHM) && !defined(XFree86Server)
613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (b->shm) {
614eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	    XShmDetach( b->xm_visual->display, &b->shminfo );
615eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	    XDestroyImage( b->backimage );
616eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	    shmdt( b->shminfo.shmaddr );
617eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	 }
618eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	 else
619eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick#endif
620eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   XMesaDestroyImage( b->backimage );
621eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	 b->backimage = NULL;
622eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      }
623eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
624eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      /* Allocate new back buffer */
625eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick#ifdef XFree86Server
626eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      {
627eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	 /* Allocate a regular XImage for the back buffer. */
628eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	 b->backimage = XMesaCreateImage(b->xm_visual->BitsPerPixel,
629eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick					 b->width, b->height, NULL);
630eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick#else
631eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick      if (b->shm==0
632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  || alloc_shm_back_buffer(b)==GL_FALSE
633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  ) {
63481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	 /* Allocate a regular XImage for the back buffer. */
635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 b->backimage = XCreateImage( b->xm_visual->display,
636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                      b->xm_visual->visinfo->visual,
637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                      GET_VISUAL_DEPTH(b->xm_visual),
63881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick				      ZPixmap, 0,   /* format, offset */
63981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick				      NULL, b->width, b->height,
64081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick				      8, 0 );  /* pad, bytes_per_line */
641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (!b->backimage) {
643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    error("alloc_back_buffer: XCreateImage failed.");
644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 }
645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         b->backimage->data = (char *) MALLOC( b->backimage->height
646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                             * b->backimage->bytes_per_line );
647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (!b->backimage->data) {
648770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            error("alloc_back_buffer: MALLOC failed.");
649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            XMesaDestroyImage( b->backimage );
650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            b->backimage = NULL;
651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->backpixmap = None;
6545606dfb572bf4b89b4882265924705bacc8c182bIan Romanick   }
655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else if (b->db_state==BACK_PIXMAP) {
656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaPixmap old_pixmap = b->backpixmap;
657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* Free the old back pixmap */
658770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->backpixmap) {
659770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
661df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul      /* Allocate new back pixmap */
662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->backpixmap = XMesaCreatePixmap( b->xm_visual->display, b->frontbuffer,
663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					 b->width, b->height,
664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					 GET_VISUAL_DEPTH(b->xm_visual) );
665770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->backimage = NULL;
666770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* update other references to backpixmap */
667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->buffer==(XMesaDrawable)old_pixmap) {
668565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	 b->buffer = (XMesaDrawable)b->backpixmap;
669565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      }
670565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   }
671565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick}
672565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
673565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
674565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
675565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick/*
676565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * A replacement for XAllocColor.  This function should never
677565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * fail to allocate a color.  When XAllocColor fails, we return
678565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * the nearest matching color.  If we have to allocate many colors
679565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * this function isn't too efficient; the XQueryColors() could be
680565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * done just once.
681565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * Written by Michael Pichler, Brian Paul, Mark Kilgard
682565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * Input:  dpy - X display
683565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick *         cmap - X colormap
684565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick *         cmapSize - size of colormap
685565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * In/Out: color - the XColor struct
686565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick * Output:  exact - 1=exact color match, 0=closest match
687565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick *          alloced - 1=XAlloc worked, 0=XAlloc failed
688565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick */
689565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanickstatic void
690565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian RomanicknoFaultXAllocColor( int client,
691565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick                    XMesaDisplay *dpy,
692565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick                    XMesaColormap cmap,
693565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick                    int cmapSize,
694565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick                    XMesaColor *color,
695565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick                    int *exact, int *alloced )
696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   Pixel *ppixIn;
699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   xrgb *ctable;
700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
701565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   /* we'll try to cache ctable for better remote display performance */
702565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   static Display *prevDisplay = NULL;
703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   static XMesaColormap prevCmap = 0;
704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   static int prevCmapSize = 0;
705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   static XMesaColor *ctable = NULL;
706770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaColor subColor;
708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int i, bestmatch;
709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   double mindist;       /* 3*2^16^2 exceeds long int precision. */
710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) client;
712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
713565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   /* First try just using XAllocColor. */
714565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick#ifdef XFree86Server
715565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   if (AllocColor(cmap,
716565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick		  &color->red, &color->green, &color->blue,
717565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick		  &color->pixel,
718565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick		  client) == Success) {
719565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick#else
720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (XAllocColor(dpy, cmap, color)) {
7210e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick#endif
722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *exact = 1;
723301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick      *alloced = 1;
724301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick      return;
725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Alloc failed, search for closest match */
728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Retrieve color table entries. */
730301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick   /* XXX alloca candidate. */
731301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick#ifdef XFree86Server
732301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
733301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (i = 0; i < cmapSize; i++) {
735565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      ppixIn[i] = i;
736565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   }
737770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   QueryColors(cmap, cmapSize, ppixIn, ctable);
738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
739565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   if (prevDisplay != dpy || prevCmap != cmap
740565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick       || prevCmapSize != cmapSize || !ctable) {
741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* free previously cached color table */
742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (ctable)
743565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick         FREE(ctable);
744565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      /* Get the color table from X */
745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      assert(ctable);
747565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      for (i = 0; i < cmapSize; i++) {
748565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick         ctable[i].pixel = i;
749565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      }
750565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      XQueryColors(dpy, cmap, ctable, cmapSize);
751565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      prevDisplay = dpy;
752565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      prevCmap = cmap;
753565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      prevCmapSize = cmapSize;
754565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   }
755565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick#endif
756565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
757565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   /* Find best match. */
758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   bestmatch = -1;
759565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   mindist = 0.0;
760565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   for (i = 0; i < cmapSize; i++) {
761565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
762565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
763565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
764565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      double dist = dr * dr + dg * dg + db * db;
765565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      if (bestmatch < 0 || dist < mindist) {
766565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick         bestmatch = i;
767565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick         mindist = dist;
768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Return result. */
772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   subColor.red   = ctable[bestmatch].red;
773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   subColor.green = ctable[bestmatch].green;
774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   subColor.blue  = ctable[bestmatch].blue;
775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Try to allocate the closest match color.  This should only
7760e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick    * fail if the cell is read/write.  Otherwise, we're incrementing
777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * the cell's reference count.
778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (AllocColor(cmap,
781301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick		  &subColor.red, &subColor.green, &subColor.blue,
782301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick		  &subColor.pixel,
783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		  client) == Success) {
784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (XAllocColor(dpy, cmap, &subColor)) {
786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *alloced = 1;
788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* do this to work around a problem reported by Frank Ortega */
791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      subColor.pixel = (unsigned long) bestmatch;
792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      subColor.red   = ctable[bestmatch].red;
793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      subColor.green = ctable[bestmatch].green;
794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      subColor.blue  = ctable[bestmatch].blue;
795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      subColor.flags = DoRed | DoGreen | DoBlue;
796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *alloced = 0;
797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
798df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#ifdef XFree86Server
799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   FREE(ppixIn);
800770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   FREE(ctable);
801639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#else
802639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   /* don't free table, save it for next time */
803639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#endif
804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   *color = subColor;
806df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   *exact = 0;
807dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich}
8088a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick
8098a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick
8108a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick
8118a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick
8128a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick/*
813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Do setup for PF_GRAYSCALE pixel format.
814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Note that buffer may be NULL.
815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic GLboolean setup_grayscale( int client, XMesaVisual v,
817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                  XMesaBuffer buffer, XMesaColormap cmap )
818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_FALSE;
821df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   }
822dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich
823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (buffer) {
824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaBuffer prevBuffer;
825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (!cmap) {
827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return GL_FALSE;
828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
831ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick      if (prevBuffer &&
832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          (buffer->xm_visual->mesa_visual.rgbMode ==
833770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* Copy colormap stuff from previous XMesaBuffer which uses same
835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          */
837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         copy_colortable_info(buffer, prevBuffer);
838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
84056643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul         /* Allocate 256 shades of gray */
841770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         int gray;
842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         int colorsfailed = 0;
843770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         for (gray=0;gray<256;gray++) {
844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            int exact, alloced;
848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            XMesaColor xcol;
849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            xcol.red   = (r << 8) | r;
850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            xcol.green = (g << 8) | g;
851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            xcol.blue  = (b << 8) | b;
852df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul            noFaultXAllocColor( client, v->display,
85369d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick                                cmap, GET_COLORMAP_SIZE(v),
85469d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick                                &xcol, &exact, &alloced );
855639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul            if (!exact) {
856639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul               colorsfailed++;
857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            }
858770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            if (alloced) {
859770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick               assert(buffer->num_alloced<256);
860770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick               buffer->num_alloced++;
862df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul            }
863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
8640e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick            /*OLD
865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            assert(gray < 576);
866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->color_table[gray*3+0] = xcol.pixel;
867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->color_table[gray*3+1] = xcol.pixel;
868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->color_table[gray*3+2] = xcol.pixel;
869301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick            assert(xcol.pixel < 65536);
870301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
872770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            */
874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->color_table[gray] = xcol.pixel;
875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            assert(xcol.pixel < 65536);
876770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->pixel_to_r[xcol.pixel] = gray;
877770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->pixel_to_g[xcol.pixel] = gray;
878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            buffer->pixel_to_b[xcol.pixel] = gray;
87986b33b5649710f351d241ce6890200ac1f38f724Ian Romanick         }
88086b33b5649710f351d241ce6890200ac1f38f724Ian Romanick
881df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul         if (colorsfailed && getenv("MESA_DEBUG")) {
88286b33b5649710f351d241ce6890200ac1f38f724Ian Romanick            fprintf( stderr,
88386b33b5649710f351d241ce6890200ac1f38f724Ian Romanick                  "Note: %d out of 256 needed colors do not match exactly.\n",
884df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul                  colorsfailed );
88586b33b5649710f351d241ce6890200ac1f38f724Ian Romanick         }
88686b33b5649710f351d241ce6890200ac1f38f724Ian Romanick      }
887df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   }
88886b33b5649710f351d241ce6890200ac1f38f724Ian Romanick
889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->dithered_pf = PF_GRAYSCALE;
890770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->undithered_pf = PF_GRAYSCALE;
891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return GL_TRUE;
892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
8930e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick
894770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
897770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Setup RGB rendering for a window with a PseudoColor, StaticColor,
898301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
899301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * color.  While this function was originally designed just for 8-bit
901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Dithering code contributed by Bob Mercier.
903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic GLboolean setup_dithered_color( int client, XMesaVisual v,
905770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                       XMesaBuffer buffer, XMesaColormap cmap )
906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
907770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_FALSE;
909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (buffer) {
912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaBuffer prevBuffer;
913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
914770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (!cmap) {
915770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return GL_FALSE;
916770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (prevBuffer &&
920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          (buffer->xm_visual->mesa_visual.rgbMode ==
921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* Copy colormap stuff from previous, matching XMesaBuffer.
923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          * Do this to avoid time spent in noFaultXAllocColor.
924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          */
925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         copy_colortable_info(buffer, prevBuffer);
926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* Allocate X colors and initialize color_table[], red_table[], etc */
929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         int r, g, b, i;
930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         int colorsfailed = 0;
931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         for (r = 0; r < _R; r++) {
932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            for (g = 0; g < _G; g++) {
933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick               for (b = 0; b < _B; b++) {
934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  XMesaColor xcol;
935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  int exact, alloced;
936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(_R-1),65535);
937770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(_G-1),65535);
938770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(_B-1),65535);
939770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  noFaultXAllocColor( client, v->display,
9408ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul                                      cmap, GET_COLORMAP_SIZE(v),
9412aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul                                      &xcol, &exact, &alloced );
94278a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul                  if (!exact) {
9432aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul                     colorsfailed++;
9442aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul                  }
945770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  if (alloced) {
946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                     assert(buffer->num_alloced<256);
947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                     buffer->num_alloced++;
949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  }
950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  i = _MIX( r, g, b );
951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  assert(i < 576);
952770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  buffer->color_table[i] = xcol.pixel;
953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  assert(xcol.pixel < 65536);
9548ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (_R-1);
9552aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (_G-1);
95678a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (_B-1);
9572aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul               }
9582aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul            }
959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (colorsfailed && getenv("MESA_DEBUG")) {
962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            fprintf( stderr,
963770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  "Note: %d out of %d needed colors do not match exactly.\n",
964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                  colorsfailed, _R*_G*_B );
965770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
9660e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick      }
967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->dithered_pf = PF_DITHER;
970770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->undithered_pf = PF_LOOKUP;
971301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick   return GL_TRUE;
972301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick}
973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Special dithering tables have to be initialized.
979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void setup_8bit_hpcr( XMesaVisual v )
981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
983770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * on the root window AND the colormap obtainable by XGetRGBColormaps
985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * for that atom must be set on the window.  (see also tkInitWindow)
986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * If that colormap is not set, the output will look stripy.
987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Setup color tables with gamma correction */
990770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int i;
991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   double g;
992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   g = 1.0 / v->RedGamma;
994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (i=0; i<256; i++) {
995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      GLint red = IROUND_POS(255.0 * pow( hpcr_rgbTbl[0][i]/255.0, g ));
996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
999770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   g = 1.0 / v->GreenGamma;
1000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (i=0; i<256; i++) {
1001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      GLint green = IROUND_POS(255.0 * pow( hpcr_rgbTbl[1][i]/255.0, g ));
1002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
1003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1005770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   g = 1.0 / v->BlueGamma;
1006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (i=0; i<256; i++) {
1007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      GLint blue = IROUND_POS(255.0 * pow( hpcr_rgbTbl[2][i]/255.0, g ));
1008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
1009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1010770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
1011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->dithered_pf = PF_HPCR;
1012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* which method should I use to clear */
1014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* GL_FALSE: keep the ordinary method  */
1015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* GL_TRUE : clear with dither pattern */
1016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->hpcr_clear_flag = getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
1017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (v->hpcr_clear_flag) {
1019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
1020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                               DefaultRootWindow(v->display),
102181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick                                               16, 2, 8);
102281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick#ifndef XFree86Server
102381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
102481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick                                       0, 0, 16, 2, AllPlanes, ZPixmap);
102581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick#endif
102681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   }
102781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick}
102881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
102981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
103081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick/*
103181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick * Setup RGB rendering for a window with a True/DirectColor visual.
103281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick */
103381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanickstatic void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
103481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick                             XMesaColormap cmap )
103581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick{
103681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   unsigned long rmask, gmask, bmask;
103781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   (void) buffer;
103881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   (void) cmap;
103981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
104081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   /* Compute red multiplier (mask) and bit shift */
104181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   v->rshift = 0;
104281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   rmask = GET_REDMASK(v);
104381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   while ((rmask & 1)==0) {
104481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      v->rshift++;
104581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      rmask = rmask >> 1;
104681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   }
104781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
104881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   /* Compute green multiplier (mask) and bit shift */
104981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   v->gshift = 0;
105081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   gmask = GET_GREENMASK(v);
105181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   while ((gmask & 1)==0) {
105281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      v->gshift++;
105381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      gmask = gmask >> 1;
105481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   }
105581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
105681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   /* Compute blue multiplier (mask) and bit shift */
105781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   v->bshift = 0;
105881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   bmask = GET_BLUEMASK(v);
105981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   while ((bmask & 1)==0) {
106081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      v->bshift++;
106181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      bmask = bmask >> 1;
106232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   }
106381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
106481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   /*
106581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick    * Compute component-to-pixel lookup tables and dithering kernel
106681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick    */
106781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   {
106881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      static GLubyte kernel[16] = {
106981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick          0*16,  8*16,  2*16, 10*16,
107081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         12*16,  4*16, 14*16,  6*16,
107181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick          3*16, 11*16,  1*16,  9*16,
107281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         15*16,  7*16, 13*16,  5*16,
107381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      };
107481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      GLint rBits = bitcount(rmask);
107581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      GLint gBits = bitcount(gmask);
107681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      GLint bBits = bitcount(bmask);
107781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      GLint maxBits;
107881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      GLuint i;
107981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
108081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
108181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      for (i=0; i<=rmask; i++)
108281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
108381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      for (i=0; i<=gmask; i++)
108481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
108532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      for (i=0; i<=bmask; i++)
108681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
108781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
108881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      /* convert RGB values from [0,255] to pixel components */
108981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
109081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      for (i=0;i<256;i++) {
109181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         GLint r = gamma_adjust(v->RedGamma,   i, 255);
109281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         GLint g = gamma_adjust(v->GreenGamma, i, 255);
109381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
109481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
109581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
109681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
1097770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1098770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* overflow protection */
1099770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      for (i=256;i<512;i++) {
1100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         v->RtoPixel[i] = v->RtoPixel[255];
1101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         v->GtoPixel[i] = v->GtoPixel[255];
1102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         v->BtoPixel[i] = v->BtoPixel[255];
1103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* setup dithering kernel */
1106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      maxBits = rBits;
1107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (gBits > maxBits)  maxBits = gBits;
1108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (bBits > maxBits)  maxBits = bBits;
1109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      for (i=0;i<16;i++) {
1110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         v->Kernel[i] = kernel[i] >> maxBits;
1111301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick      }
1112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->undithered_pf = PF_TRUECOLOR;
1114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_TRUEDITHER : PF_TRUECOLOR;
1115b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich   }
1116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /*
1118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * Now check for TrueColor visuals which we can optimize.
1119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
1120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (   GET_REDMASK(v)  ==0x0000ff
1121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && GET_GREENMASK(v)==0x00ff00
1122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && GET_BLUEMASK(v) ==0xff0000
1123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && CHECK_BYTE_ORDER(v)
1124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && v->BitsPerPixel==32
1125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && sizeof(GLuint)==4
1126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* common 32 bpp config used on SGI, Sun */
1128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R;
1129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else if (GET_REDMASK(v)  ==0xff0000
1131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       &&   GET_GREENMASK(v)==0x00ff00
1132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       &&   GET_BLUEMASK(v) ==0x0000ff
1133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && CHECK_BYTE_ORDER(v)
1134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && v->BitsPerPixel==32
1135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && sizeof(GLuint)==4
1136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* common 32 bpp config used on Linux, HP, IBM */
1138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->undithered_pf = v->dithered_pf = PF_8R8G8B;
1139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else if (GET_REDMASK(v)  ==0xff0000
1141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       &&   GET_GREENMASK(v)==0x00ff00
1142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       &&   GET_BLUEMASK(v) ==0x0000ff
1143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && CHECK_BYTE_ORDER(v)
1144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && v->BitsPerPixel==24
1145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && sizeof(GLuint)==4
1146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* common packed 24 bpp config used on Linux */
1148054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick      v->undithered_pf = v->dithered_pf = PF_8R8G8B24;
1149054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick   }
1150054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick   else if (GET_REDMASK(v)  ==0xf800
1151054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick       &&   GET_GREENMASK(v)==0x07e0
1152054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick       &&   GET_BLUEMASK(v) ==0x001f
1153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && CHECK_BYTE_ORDER(v)
1154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && v->BitsPerPixel==16
1155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && sizeof(GLushort)==2
1156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
1157054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick      /* 5-6-5 color weight on common PC VGA boards */
1158054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick      v->undithered_pf = PF_5R6G5B;
1159054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick      v->dithered_pf = PF_DITHER_5R6G5B;
1160054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick   }
1161054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick   else if (GET_REDMASK(v)  ==0xe0
1162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       &&   GET_GREENMASK(v)==0x1c
1163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       &&   GET_BLUEMASK(v) ==0x03
1164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && CHECK_FOR_HPCR(v)) {
1165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      setup_8bit_hpcr( v );
1166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1170054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick
1171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
1172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Setup RGB rendering for a window with a monochrome visual.
1173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
1174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void setup_monochrome( XMesaVisual v, XMesaBuffer b )
1175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) b;
1177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->dithered_pf = v->undithered_pf = PF_1BIT;
1178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* if black=1 then we must flip pixel values */
1179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
1180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1181ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick
1182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
1185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * When a context is "made current" for the first time, we can finally
1186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * finish initializing the context's visual and buffer information.
1187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Input:  v - the XMesaVisual to initialize
1188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         b - the XMesaBuffer to initialize (may be NULL)
1189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         rgb_flag - TRUE = RGBA mode, FALSE = color index mode
1190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         window - the window/pixmap we're rendering into
1191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         cmap - the colormap associated with the window/pixmap
1192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  GL_TRUE=success, GL_FALSE=failure
1193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
1194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic GLboolean initialize_visual_and_buffer( int client,
1195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                               XMesaVisual v,
1196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                               XMesaBuffer b,
1197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                               GLboolean rgb_flag,
1198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                               XMesaDrawable window,
1199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                               XMesaColormap cmap
1200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                             )
1201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef XFree86Server
1203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XGCValues gcvalues;
1204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b) {
1207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      assert(b->xm_visual == v);
1208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Save true bits/pixel */
1211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->BitsPerPixel = bits_per_pixel(v);
1212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   assert(v->BitsPerPixel > 0);
1213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (rgb_flag==GL_FALSE) {
1216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* COLOR-INDEXED WINDOW:
1217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * Even if the visual is TrueColor or DirectColor we treat it as
1218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * being color indexed.  This is weird but might be useful to someone.
1219301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick       */
1220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->dithered_pf = v->undithered_pf = PF_INDEX;
1221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->index_bits = GET_VISUAL_DEPTH(v);
1222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
1224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* RGB WINDOW:
122584db95bfcd340a26a448fa89a19215711681cb50Eric Anholt       * We support RGB rendering into almost any kind of visual.
1226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       */
1227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      int xclass;
1228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      xclass = GET_VISUAL_CLASS(v);
1229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (xclass==TrueColor || xclass==DirectColor) {
1230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 setup_truecolor( v, b, cmap );
1231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else if (xclass==StaticGray && GET_VISUAL_DEPTH(v)==1) {
1233ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	 setup_monochrome( v, b );
1234301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick      }
1235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else if (xclass==GrayScale || xclass==StaticGray) {
1236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (!setup_grayscale( client, v, b, cmap )) {
1237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return GL_FALSE;
1238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else if ((xclass==PseudoColor || xclass==StaticColor)
1241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
1242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (!setup_dithered_color( client, v, b, cmap )) {
1243301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick            return GL_FALSE;
1244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
1247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 error("XMesa: RGB mode rendering not supported in given visual.");
1248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 return GL_FALSE;
1249639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      }
1250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->index_bits = 0;
1251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (getenv("MESA_NO_DITHER")) {
1253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 v->dithered_pf = v->undithered_pf;
1254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /*
1259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * If MESA_INFO env var is set print out some debugging info
1260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * which can help Brian figure out what's going on when a user
1261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * reports bugs.
1262dd245016657c599ecf24c4abe999319f9c870c47Ian Romanick    */
1263f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul   if (getenv("MESA_INFO")) {
1264f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul      fprintf(stderr, "X/Mesa visual = %p\n", (void *) v);
1265f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul      fprintf(stderr, "X/Mesa dithered pf = %u\n", v->dithered_pf);
1266f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul      fprintf(stderr, "X/Mesa undithered pf = %u\n", v->undithered_pf);
1267f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul      fprintf(stderr, "X/Mesa level = %d\n", v->level);
1268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      fprintf(stderr, "X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
1269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      fprintf(stderr, "X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
1270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b && window) {
1273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* Do window-specific initializations */
1274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* Window dimensions */
1276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      unsigned int w, h;
1277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      get_drawable_size( v->display, window, &w, &h );
1278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->width = w;
1279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->height = h;
1280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->frontbuffer = window;
1282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* Setup for single/double buffering */
1284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (v->mesa_visual.doubleBufferMode) {
1285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* Double buffered */
1286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef XFree86Server
1287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         b->shm = check_for_xshm( v->display );
1288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         xmesa_alloc_back_buffer( b );
1290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (b->db_state==BACK_PIXMAP) {
1291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            b->buffer = (XMesaDrawable)b->backpixmap;
1292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         else {
1294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            b->buffer = XIMAGE;
1295770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
1298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* Single Buffered */
1299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         b->buffer = b->frontbuffer;
1300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* X11 graphics contexts */
1303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->gc = CreateScratchGC(v->display, window->depth);
1305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
1306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->gc = XCreateGC( v->display, window, 0, NULL );
1307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaSetFunction( v->display, b->gc, GXcopy );
1309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* cleargc - for glClear() */
13117c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul#ifdef XFree86Server
1312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->cleargc = CreateScratchGC(v->display, window->depth);
1313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
1314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->cleargc = XCreateGC( v->display, window, 0, NULL );
1315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaSetFunction( v->display, b->cleargc, GXcopy );
1317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /*
1319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
1320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * Patch contributed by Michael Pichler May 15, 1995.
1321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       */
1322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->swapgc = CreateScratchGC(v->display, window->depth);
1324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      {
1325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  CARD32 v[1];
1326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  v[0] = FALSE;
1327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
1328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
1330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      gcvalues.graphics_exposures = False;
13317c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul      b->swapgc = XCreateGC( v->display, window,
1332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                              GCGraphicsExposures, &gcvalues);
1333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaSetFunction( v->display, b->swapgc, GXcopy );
1335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /*
1336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * Set fill style and tile pixmap once for all for HPCR stuff
1337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * (instead of doing it each time in clear_color_HPCR_pixmap())
1338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * Initialize whole stuff
1339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * Patch contributed by Jacques Leroy March 8, 1998.
1340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       */
1341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (v->hpcr_clear_flag && b->buffer!=XIMAGE) {
1342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	int i;
1343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	for (i=0; i<16; i++)
1344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        {
1345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
1346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
1347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        }
1348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        XMesaPutImage(b->display, (XMesaDrawable)v->hpcr_clear_pixmap,
1349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
1350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
13517c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul	XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
1352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* Initialize the row buffer XImage for use in write_color_span() */
1355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1,
1357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick				     (char *)MALLOC(MAX_WIDTH*4));
1358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
1359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->rowimage = XCreateImage( v->display,
1360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                  v->visinfo->visual,
1361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                  v->visinfo->depth,
1362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                  ZPixmap, 0,           /*format, offset*/
1363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                  (char*) MALLOC(MAX_WIDTH*4),  /*data*/
1364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                  MAX_WIDTH, 1,         /*width, height*/
1365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                  32,                   /*bitmap_pad*/
1366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                  0                     /*bytes_per_line*/ );
1367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1369333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick
1370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return GL_TRUE;
1371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
1376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Convert an RGBA color to a pixel value.
1377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
1378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickunsigned long
1379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickxmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLubyte a,
1380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                      GLuint pixelFormat)
1381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   switch (pixelFormat) {
1383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_INDEX:
1384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return 0;
1385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_TRUECOLOR:
1386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         {
1387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            unsigned long p;
1388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            PACK_TRUECOLOR( p, r, g, b );
1389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return p;
1390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_8A8B8G8R:
1392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return PACK_8A8B8G8R( r, g, b, a );
1393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_8R8G8B:
1394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* fall through */
1395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_8R8G8B24:
1396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return PACK_8R8G8B( r, g, b );
1397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_5R6G5B:
1398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return PACK_5R6G5B( r, g, b );
1399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_DITHER:
1400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         {
1401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            DITHER_SETUP;
1402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return DITHER( 1, 0, r, g, b );
1403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_1BIT:
1405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* 382 = (3*255)/2 */
1406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_HPCR:
1408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return DITHER_HPCR(1, 1, r, g, b);
1409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_LOOKUP:
1410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         {
1411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            LOOKUP_SETUP;
1412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return LOOKUP( r, g, b );
1413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1414054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick      case PF_GRAYSCALE:
1415054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick         return GRAY_RGB( r, g, b );
1416054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick      case PF_TRUEDITHER:
1417054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick         /* fall through */
1418054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick      case PF_DITHER_5R6G5B:
1419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         {
1420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            unsigned long p;
1421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            PACK_TRUEDITHER(p, 1, 0, r, g, b);
1422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return p;
1423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      default:
1425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         _mesa_problem(NULL, "Bad pixel format in xmesa_color_to_pixel");
1426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 0;
1428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1431770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**********************************************************************/
1432770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*****                       Public Functions                     *****/
1433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**********************************************************************/
1434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
1437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Create a new X/Mesa visual.
1438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Input:  display - X11 display
1439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         visinfo - an XVisualInfo pointer
1440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         rgb_flag - GL_TRUE = RGB mode,
1441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *                    GL_FALSE = color index mode
1442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         alpha_flag - alpha buffer requested?
1443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         db_flag - GL_TRUE = double-buffered,
1444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *                   GL_FALSE = single buffered
1445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         stereo_flag - stereo visual?
1446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *                       GL_FALSE = use an off-screen pixmap for back buffer
1448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         depth_size - requested bits/depth values, or zero
1449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         stencil_size - requested bits/stencil values, or zero
1450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         accum_red_size - requested bits/red accum values, or zero
1451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         accum_green_size - requested bits/green accum values, or zero
1452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         accum_blue_size - requested bits/blue accum values, or zero
1453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         accum_alpha_size - requested bits/alpha accum values, or zero
1454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         num_samples - number of samples/pixel if multisampling, or zero
1455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         level - visual level, usually 0
1456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
1457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return;  a new XMesaVisual or 0 if error.
1458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
1459770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
1460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               XMesaVisualInfo visinfo,
1461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLboolean rgb_flag,
1462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLboolean alpha_flag,
1463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLboolean db_flag,
1464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLboolean stereo_flag,
1465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLboolean ximage_flag,
1466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint depth_size,
1467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint stencil_size,
1468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint accum_red_size,
1469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint accum_green_size,
1470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint accum_blue_size,
1471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint accum_alpha_size,
1472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint num_samples,
1473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint level,
1474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint visualCaveat )
1475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   char *gamma;
1477770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaVisual v;
1478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLint red_bits, green_bits, blue_bits, alpha_bits;
1479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* For debugging only */
1481770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (getenv("MESA_XSYNC")) {
1482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* This makes debugging X easier.
1483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * In your debugger, set a breakpoint on _XError to stop when an
1484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       * X protocol error is generated.
1485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       */
1486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* NOT_NEEDED */
1488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
1489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XSynchronize( display, 1 );
1490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (!v) {
1495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /*
1499ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick    * In the X server, NULL is passed in for the display.  It will have
1500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * to be set before using this visual.  See XMesaSetVisualDisplay()
1501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * below.
1502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
1503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->display = display;
1504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Save a copy of the XVisualInfo struct because the user may XFREE()
1506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * the struct but we may need some of the information contained in it
1507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * at a later time.
1508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
1509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->visinfo = visinfo;
1511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
1512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if(!v->visinfo) {
1514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      FREE(v);
1515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
1518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Save a copy of the pointer now so we can find this visual again
1520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * if we need to search for it in find_glx_visual().
1521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
1522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->vishandle = visinfo;
1523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1526770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Initialize the depth of the screen */
1527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   {
1528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       PixmapFormatRec *format;
1529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       for (format = screenInfo.formats;
1531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    format->depth != display->rootDepth;
1532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    format++)
1533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   ;
1534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       v->screen_depth = format->bitsPerPixel;
1535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* check for MESA_GAMMA environment variable */
1539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   gamma = getenv("MESA_GAMMA");
1540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (gamma) {
1541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
1548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->ximage_flag = ximage_flag;
1552770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->level = level;
1553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   v->VisualCaveat = visualCaveat;
1554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
1556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   {
1558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      int xclass;
1559770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      xclass = GET_VISUAL_CLASS(v);
1560770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (xclass==TrueColor || xclass==DirectColor) {
1561770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         red_bits   = bitcount(GET_REDMASK(v));
1562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         green_bits = bitcount(GET_GREENMASK(v));
1563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         blue_bits  = bitcount(GET_BLUEMASK(v));
1564770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         alpha_bits = 0;
1565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
1567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* this is an approximation */
1568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         int depth;
1569770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         depth = GET_VISUAL_DEPTH(v);
1570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         red_bits = depth / 3;
1571ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick         depth -= red_bits;
1572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         green_bits = depth / 2;
1573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         depth -= green_bits;
1574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         blue_bits = depth;
1575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         alpha_bits = 0;
1576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
1577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1578770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
15803fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul   if (alpha_flag && alpha_bits == 0)
1581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      alpha_bits = 8;
1582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_initialize_visual( &v->mesa_visual,
1584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                            rgb_flag, db_flag, stereo_flag,
1585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                            red_bits, green_bits,
1586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                            blue_bits, alpha_bits,
15873fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul                            v->index_bits,
1588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                            depth_size,
1589770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                            stencil_size,
1590770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                            accum_red_size, accum_green_size,
1591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                            accum_blue_size, accum_alpha_size,
1592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                            0 );
1593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return v;
1594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1597770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid XMesaSetVisualDisplay( XMesaDisplay *dpy, XMesaVisual v )
1598770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1599770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    v->display = dpy;
1600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1603770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid XMesaDestroyVisual( XMesaVisual v )
1604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef XFree86Server
1606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   FREE(v->visinfo);
1607770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   FREE(v);
1609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
1614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Create a new XMesaContext.
1615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Input:  v - XMesaVisual
1616770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         share_list - another XMesaContext with which to share display
1617770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *                      lists or NULL if no sharing is wanted.
1618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  an XMesaContext or NULL if error.
1619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
1620770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1622770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   static GLboolean firstTime = GL_TRUE;
1623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaContext c;
1624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLcontext *ctx;
1625770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   __GLimports imports;
1626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (firstTime) {
1628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _glthread_INIT_MUTEX(_xmesa_lock);
1629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      firstTime = GL_FALSE;
1630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (!c) {
1634770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_init_default_imports( &imports, (void *) c );
1638770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   ctx = c->gl_ctx = _mesa_create_context( &v->mesa_visual,
1639770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                      share_list ? share_list->gl_ctx : (GLcontext *) NULL,
1640770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                      &imports );
1641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (!c->gl_ctx) {
1642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      FREE(c);
1643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_enable_sw_extensions(ctx);
1647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_enable_1_3_extensions(ctx);
1648770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (CHECK_BYTE_ORDER(v)) {
1650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      c->swapbytes = GL_FALSE;
1651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
1653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      c->swapbytes = GL_TRUE;
1654770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   c->xm_visual = v;
1657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1658770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   c->display = v->display;
1659770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1661770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   ctx->Driver.UpdateState = xmesa_update_state;
1662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Initialize the software rasterizer and helper modules.
1664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
1665770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _swrast_CreateContext( ctx );
1666770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _ac_CreateContext( ctx );
1667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _tnl_CreateContext( ctx );
1668770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _swsetup_CreateContext( ctx );
1669770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1670770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   xmesa_register_swrast_functions( ctx );
1671770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1672770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Set up some constant pointers:
1673770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
1674770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   xmesa_init_pointers( ctx );
1675770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1676770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return c;
1677770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1678770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1679770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1680770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid XMesaDestroyContext( XMesaContext c )
1683770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1684770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef FX
1685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (c->xm_buffer && c->xm_buffer->FXctx)
1686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      fxMesaDestroyContext(c->xm_buffer->FXctx);
1687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1688770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (c->gl_ctx) {
1689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _swsetup_DestroyContext( c->gl_ctx );
1690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _swrast_DestroyContext( c->gl_ctx );
1691770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _tnl_DestroyContext( c->gl_ctx );
1692770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _ac_DestroyContext( c->gl_ctx );
1693770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_destroy_context( c->gl_ctx );
1694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   FREE( c );
1697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1701770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
1702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * XXX this isn't a public function!  It's a hack for the 3Dfx driver.
1703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Create a new XMesaBuffer from an X window.
1704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Input:  v - the XMesaVisual
1705054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick *         w - the window
1706770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *         c - the context
1707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  new XMesaBuffer or NULL if error
1708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
1709770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickXMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
1710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                      XMesaContext c )
1711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef XFree86Server
1713770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XWindowAttributes attr;
1714770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1715770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef FX
1716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   char *fxEnvVar;
1717770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1718770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int client = 0;
1719847bc5c852214a344b6b39c619d182cb1058ecbcIan Romanick
1720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaBuffer b = alloc_xmesa_buffer();
1721847bc5c852214a344b6b39c619d182cb1058ecbcIan Romanick   if (!b) {
1722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1723770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1724770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) c;
1726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   client = CLIENT_ID(((XMesaDrawable)w)->id);
1729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   assert(v);
1732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1733770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) {
1735770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
1736770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XGetWindowAttributes( v->display, w, &attr );
1737770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (GET_VISUAL_DEPTH(v) != attr.depth) {
1739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1740770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (getenv("MESA_DEBUG")) {
1741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         fprintf(stderr, "XMesaCreateWindowBuffer: depth mismatch between visual and window!\n");
1742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1743770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1744770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   b->xm_visual = v;
1747ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick   b->type = WINDOW;
1748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   b->display = v->display;
1749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   b->cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
1752770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (attr.colormap) {
1753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->cmap = attr.colormap;
1754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
1756333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick      if (getenv("MESA_DEBUG")) {
1757333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick         fprintf(stderr, "Window %u has no colormap!\n", (unsigned int) w);
1758333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick      }
1759333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick      /* this is weird, a window w/out a colormap!? */
1760333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick      /* OK, let's just allocate a new one and hope for the best */
1761333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick      b->cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1764770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* determine back buffer implementation */
1766770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (v->mesa_visual.doubleBufferMode) {
1767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (v->ximage_flag) {
1768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 b->db_state = BACK_XIMAGE;
1769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
1771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 b->db_state = BACK_PIXMAP;
1772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
1775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->db_state = 0;
1776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_initialize_framebuffer(&b->mesa_buffer,
1779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                &v->mesa_visual,
1780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                v->mesa_visual.depthBits > 0,
1781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                v->mesa_visual.stencilBits > 0,
1782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                v->mesa_visual.accumRedBits > 0,
1783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                v->mesa_visual.alphaBits > 0 );
1784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
1786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                      (XMesaDrawable)w, b->cmap )) {
1787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      free_xmesa_buffer(client, b);
1788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef FX
1792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   fxEnvVar = getenv("MESA_GLX_FX");
1793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (fxEnvVar) {
1794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     if (fxEnvVar[0]!='d') {
1795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       int attribs[100];
1796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       int numAttribs = 0;
1797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       int hw;
1798770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       if (v->mesa_visual.depthBits > 0) {
1799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
1800770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 attribs[numAttribs++] = 1;
1801770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       }
1802770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       if (v->mesa_visual.doubleBufferMode) {
1803770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
1804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       }
1805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       if (v->mesa_visual.accumRedBits > 0) {
1806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 attribs[numAttribs++] = FXMESA_ACCUM_SIZE;
1807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 attribs[numAttribs++] = v->mesa_visual.accumRedBits;
1808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       }
1809770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       if (v->mesa_visual.stencilBits > 0) {
1810770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         attribs[numAttribs++] = FXMESA_STENCIL_SIZE;
1811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         attribs[numAttribs++] = v->mesa_visual.stencilBits;
1812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       }
1813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       if (v->mesa_visual.alphaBits > 0) {
1814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
1815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         attribs[numAttribs++] = 1;
1816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       }
1817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       if (c->gl_ctx) {
1818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define FXMESA_SHARE_CONTEXT 990099  /* keep in sync with fxapi.c! */
1819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
1820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         attribs[numAttribs++] = (int) c->gl_ctx;
1821770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       }
1822770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       attribs[numAttribs++] = FXMESA_NONE;
1823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       if ((hw = fxQueryHardware())==GR_SSTTYPE_VOODOO) {
1825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
1826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if ((v->undithered_pf!=PF_INDEX) && (b->backimage)) {
1827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
1828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
1829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	     b->FXwindowHack = b->FXctx ? GL_TRUE : GL_FALSE;
1830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   else
1831770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	     b->FXwindowHack = GL_FALSE;
1832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
1833ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick       }
1834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       else {
1835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
1836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE,
1837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					  GR_REFRESH_75Hz, attribs);
1838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         else
1839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
1840770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         b->FXisHackUsable = GL_FALSE;
1841770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         b->FXwindowHack = GL_FALSE;
1842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       }
1843ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick       /*
1844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       fprintf(stderr,
1845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick               "voodoo %d, wid %d height %d hack: usable %d active %d\n",
1846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick               hw, b->width, b->height, b->FXisHackUsable, b->FXwindowHack);
1847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       */
1848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     }
1849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
1851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      fprintf(stderr,"WARNING: This Mesa Library includes the Glide driver but\n");
1852770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      fprintf(stderr,"         you have not defined the MESA_GLX_FX env. var.\n");
1853770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      fprintf(stderr,"         (check the README.3DFX file for more information).\n\n");
1854770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      fprintf(stderr,"         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
1855770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1856770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1858600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick   return b;
1859324857599b2a4735c86e54da9a1776c034dadf72Brian Paul}
1860324857599b2a4735c86e54da9a1776c034dadf72Brian Paul
1861324857599b2a4735c86e54da9a1776c034dadf72Brian Paul
1862324857599b2a4735c86e54da9a1776c034dadf72Brian PaulXMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w )
1863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1864770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return XMesaCreateWindowBuffer2( v, w, NULL );
1865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1868ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick/*
1869324857599b2a4735c86e54da9a1776c034dadf72Brian Paul * Create a new XMesaBuffer from an X pixmap.
1870324857599b2a4735c86e54da9a1776c034dadf72Brian Paul * Input:  v - the XMesaVisual
1871324857599b2a4735c86e54da9a1776c034dadf72Brian Paul *         p - the pixmap
1872324857599b2a4735c86e54da9a1776c034dadf72Brian Paul *         cmap - the colormap, may be 0 if using a TrueColor or DirectColor
1873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *                visual for the pixmap
1874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  new XMesaBuffer or NULL if error
1875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
1876ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian RomanickXMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
1877324857599b2a4735c86e54da9a1776c034dadf72Brian Paul				     XMesaPixmap p, XMesaColormap cmap )
1878324857599b2a4735c86e54da9a1776c034dadf72Brian Paul{
1879324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   int client = 0;
1880324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   XMesaBuffer b = alloc_xmesa_buffer();
1881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (!b) {
1882770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1884770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1886600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick#ifdef XFree86Server
1887324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   client = CLIENT_ID(((XMesaDrawable)p)->id);
1888324857599b2a4735c86e54da9a1776c034dadf72Brian Paul#endif
1889324857599b2a4735c86e54da9a1776c034dadf72Brian Paul
1890324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   assert(v);
1891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   b->xm_visual = v;
1893770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   b->type = PIXMAP;
1894600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick   b->display = v->display;
1895324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   b->cmap = cmap;
1896324857599b2a4735c86e54da9a1776c034dadf72Brian Paul
1897324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   /* determine back buffer implementation */
1898324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   if (v->mesa_visual.doubleBufferMode) {
1899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (v->ximage_flag) {
1900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 b->db_state = BACK_XIMAGE;
1901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
1902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
1903600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	 b->db_state = BACK_PIXMAP;
1904324857599b2a4735c86e54da9a1776c034dadf72Brian Paul      }
1905324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   }
1906324857599b2a4735c86e54da9a1776c034dadf72Brian Paul   else {
1907324857599b2a4735c86e54da9a1776c034dadf72Brian Paul      b->db_state = 0;
1908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_initialize_framebuffer(&b->mesa_buffer,
1911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                &v->mesa_visual,
1912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                v->mesa_visual.depthBits > 0,
1913324857599b2a4735c86e54da9a1776c034dadf72Brian Paul                                v->mesa_visual.stencilBits > 0,
1914324857599b2a4735c86e54da9a1776c034dadf72Brian Paul                                v->mesa_visual.accumRedBits +
1915324857599b2a4735c86e54da9a1776c034dadf72Brian Paul                                v->mesa_visual.accumGreenBits +
1916324857599b2a4735c86e54da9a1776c034dadf72Brian Paul                                v->mesa_visual.accumBlueBits > 0,
1917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                v->mesa_visual.alphaBits > 0 );
1918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick				     (XMesaDrawable)p, cmap)) {
1921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      free_xmesa_buffer(client, b);
1922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
1923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
1924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return b;
1926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
1927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#if 0 /* not done */
1931770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickXMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
1932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                unsigned int width, unsigned int height )
1933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
1934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int client = 0;
1935d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   XMesaBuffer b = alloc_xmesa_buffer();
1936d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   if (!b) {
1937d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      return NULL;
19380e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick   }
1939d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
1940d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   b->xm_visual = v;
1941d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   b->pbuffer_flag = GL_TRUE;
1942d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   b->display = v->display;
1943d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   b->cmap = cmap;
1944d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
1945d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   /* determine back buffer implementation */
1946d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   if (v->mesa_visual.doubleBufferMode) {
1947d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      if (v->ximage_flag) {
1948d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	 b->db_state = BACK_XIMAGE;
1949d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      }
1950d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      else {
1951d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	 b->db_state = BACK_PIXMAP;
1952d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      }
1953d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   }
1954d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   else {
1955d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      b->db_state = 0;
1956d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   }
1957d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
1958d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   _mesa_initialize_framebuffer(&b->mesa_buffer,
1959d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick                                &v->mesa_visual,
1960d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick                                v->mesa_visual.depthBits > 0,
1961d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick                                v->mesa_visual.stencilBits > 0,
1962d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick                                v->mesa_visual.accumRedBits +
1963d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick                                v->mesa_visual.accumGreenBits +
1964d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick                                v->mesa_visual.accumBlueBits > 0,
1965d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick                                v->mesa_visual.alphaBits > 0 );
196632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg
1967d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1968d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick				     0, cmap)) {
1969d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      free_xmesa_buffer(client, b);
1970d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      return NULL;
1971d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   }
1972d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
1973d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   return b;
1974d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick}
1975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
1980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Deallocate an XMesaBuffer structure and all related info.
1981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
1982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid XMesaDestroyBuffer( XMesaBuffer b )
1983301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick{
1984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int client = 0;
1985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
1987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->frontbuffer)
1988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       client = CLIENT_ID(b->frontbuffer->id);
1989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
1990301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
1991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->gc)  XMesaFreeGC( b->xm_visual->display, b->gc );
1992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->cleargc)  XMesaFreeGC( b->xm_visual->display, b->cleargc );
1993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->swapgc)  XMesaFreeGC( b->xm_visual->display, b->swapgc );
1994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->backimage) {
1996d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick#if defined(USE_XSHM) && !defined(XFree86Server)
1997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       if (b->shm) {
1998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   XShmDetach( b->xm_visual->display, &b->shminfo );
1999d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	   XDestroyImage( b->backimage );
2000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   shmdt( b->shminfo.shmaddr );
2001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       }
20024e4c2ee1fd574d1d651c559f46afb6ca5487156dIan Romanick       else
2003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
2004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   XMesaDestroyImage( b->backimage );
2005d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick   }
2006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->backpixmap) {
2007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
2008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->xm_visual->hpcr_clear_flag) {
2009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	XMesaFreePixmap( b->xm_visual->display,
2010770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			 b->xm_visual->hpcr_clear_pixmap );
2011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	XMesaDestroyImage( b->xm_visual->hpcr_clear_ximage );
2012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->rowimage) {
2015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      FREE( b->rowimage->data );
2016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      b->rowimage->data = NULL;
2017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaDestroyImage( b->rowimage );
2018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   free_xmesa_buffer(client, b);
2021770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2022770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2023770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2024770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
2026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Bind buffer b to context c and make c the current rendering context.
2027770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2028770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
2029770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2030770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return XMesaMakeCurrent2( c, b, b );
2031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2032770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
2035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Bind buffer b to context c and make c the current rendering context.
2036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2037770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
2038770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                             XMesaBuffer readBuffer )
2039770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2040770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (c) {
2041770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (!drawBuffer || !readBuffer)
2042770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return GL_FALSE;  /* must specify buffers! */
2043770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2044770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef FX
2045770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (drawBuffer->FXctx) {
2046770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         fxMesaMakeCurrent(drawBuffer->FXctx);
2047770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2048770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         c->xm_buffer = drawBuffer;
2049770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         c->xm_read_buffer = readBuffer;
2050770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         c->use_read_buffer = (drawBuffer != readBuffer);
2051770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2052770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return GL_TRUE;
2053770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2054770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
2055770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (c->gl_ctx == _mesa_get_current_context()
2056770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          && c->xm_buffer == drawBuffer
2057770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          && c->xm_read_buffer == readBuffer
2058770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick          && c->xm_buffer->wasCurrent) {
2059770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* same context and buffer, do nothing */
2060770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return GL_TRUE;
2061770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2062770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2063770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      c->xm_buffer = drawBuffer;
2064770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      c->xm_read_buffer = readBuffer;
2065770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      c->use_read_buffer = (drawBuffer != readBuffer);
2066770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2067770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_make_current2(c->gl_ctx,
2068770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                          &drawBuffer->mesa_buffer,
2069d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt                          &readBuffer->mesa_buffer);
2070d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt
2071d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt      if (c->gl_ctx->Viewport.Width == 0) {
2072d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	 /* initialize viewport to window size */
2073d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	 _mesa_Viewport( 0, 0, drawBuffer->width, drawBuffer->height );
2074d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	 c->gl_ctx->Scissor.Width = drawBuffer->width;
2075d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	 c->gl_ctx->Scissor.Height = drawBuffer->height;
2076d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt      }
2077770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
207828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt      if (c->xm_visual->mesa_visual.rgbMode) {
207928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt         /*
208028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt          * Must recompute and set these pixel values because colormap
208128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt          * can be different for different windows.
208228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt          */
208328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt         c->clearpixel = xmesa_color_to_pixel( c,
208428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt                                               c->clearcolor[0],
208528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt                                               c->clearcolor[1],
208628cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt                                               c->clearcolor[2],
208728cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt                                               c->clearcolor[3],
208828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt                                               c->xm_visual->undithered_pf);
208928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt         XMesaSetForeground(c->display, c->xm_buffer->cleargc, c->clearpixel);
209028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt      }
209128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt
209228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
209328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt      c->xm_buffer->wasCurrent = GL_TRUE;
209428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt   }
209528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt   else {
209628cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt      /* Detach */
209728cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt      _mesa_make_current2( NULL, NULL, NULL );
209828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt   }
209928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt   return GL_TRUE;
210028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt}
210128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt
210228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt
210328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt/*
210428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt * Unbind the context c from its buffer.
210528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt */
2106770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean XMesaUnbindContext( XMesaContext c )
2107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* A no-op for XFree86 integration purposes */
2109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return GL_TRUE;
2110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2113770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickXMesaContext XMesaGetCurrentContext( void )
2114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GET_CURRENT_CONTEXT(ctx);
2116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (ctx) {
2117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return xmesa;
2119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return 0;
2122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2126770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickXMesaBuffer XMesaGetCurrentBuffer( void )
2127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GET_CURRENT_CONTEXT(ctx);
2129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (ctx) {
2130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return xmesa->xm_buffer;
2132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return 0;
2135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* New in Mesa 3.1 */
2140770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickXMesaBuffer XMesaGetCurrentReadBuffer( void )
2141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GET_CURRENT_CONTEXT(ctx);
2143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (ctx) {
2144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return xmesa->xm_buffer;
2146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return 0;
2149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2153770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean XMesaForceCurrent(XMesaContext c)
2154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (c) {
2156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (c->gl_ctx != _mesa_get_current_context()) {
2157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 _mesa_make_current(c->gl_ctx, &c->xm_buffer->mesa_buffer);
2158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_make_current(NULL, NULL);
2162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return GL_TRUE;
2164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2167770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean XMesaLoseCurrent(XMesaContext c)
2168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) c;
2170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_make_current(NULL, NULL);
2171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return GL_TRUE;
2172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2174ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick
2175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
2176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Switch 3Dfx support hack between window and full-screen mode.
2177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2178770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean XMesaSetFXmode( GLint mode )
2179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef FX
2181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   const char *fx = getenv("MESA_GLX_FX");
2182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (fx && fx[0] != 'd') {
2183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      GET_CURRENT_CONTEXT(ctx);
2184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      GrHwConfiguration hw;
2185ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick      if (!FX_grSstQueryHardware(&hw)) {
2186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /*fprintf(stderr, "!grSstQueryHardware\n");*/
2187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return GL_FALSE;
2188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (hw.num_sst < 1) {
2190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /*fprintf(stderr, "hw.num_sst < 1\n");*/
2191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return GL_FALSE;
2192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (ctx) {
2194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (mode == XMESA_FX_WINDOW) {
2196ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	    if (xmesa->xm_buffer->FXisHackUsable) {
2197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       FX_grSstControl(GR_CONTROL_DEACTIVATE);
2198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       xmesa->xm_buffer->FXwindowHack = GL_TRUE;
2199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       return GL_TRUE;
2200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    }
2201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 }
2202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 else if (mode == XMESA_FX_FULLSCREEN) {
2203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    FX_grSstControl(GR_CONTROL_ACTIVATE);
2204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    xmesa->xm_buffer->FXwindowHack = GL_FALSE;
22050e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick	    return GL_TRUE;
2206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 }
2207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 else {
2208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    /* Error: Bad mode value */
2209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 }
2210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2212301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick   /*fprintf(stderr, "fallthrough\n");*/
2213301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick#else
2214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) mode;
2215fe86f8d73268785b31bc8d5a278a233bff42034dBrian Paul#endif
221678a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul   return GL_FALSE;
2217301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick}
2218fe86f8d73268785b31bc8d5a278a233bff42034dBrian Paul
2219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2221301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick#ifdef FX
2222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
2223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Read image from VooDoo frame buffer into X/Mesa's back XImage.
2224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void FXgetImage( XMesaBuffer b )
22261c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick{
2227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GET_CURRENT_CONTEXT(ctx);
2228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   static unsigned short pixbuf[MAX_WIDTH];
2229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLuint x, y;
2230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int xpos, ypos;
22310e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick   XMesaWindow root;
22320e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick   unsigned int bw, depth, width, height;
22330e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
22340e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick
2235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   assert(xmesa->xm_buffer->FXctx);
2236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
22379ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#ifdef XFree86Server
22389ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   x = b->frontbuffer->x;
22399ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   y = b->frontbuffer->y;
22409ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   width = b->frontbuffer->width;
22419ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   height = b->frontbuffer->height;
22429ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   depth = b->frontbuffer->depth;
22439ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#else
22449ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   XGetGeometry( xmesa->xm_visual->display, b->frontbuffer,
22459ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                 &root, &xpos, &ypos, &width, &height, &bw, &depth);
22469ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick#endif
22479ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   if (b->width != width || b->height != height) {
22489ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      b->width = MIN2((int)width, xmesa->xm_buffer->FXctx->width);
22499ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      b->height = MIN2((int)height, xmesa->xm_buffer->FXctx->height);
22509ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      if (b->width & 1)
22519ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         b->width--;  /* prevent odd width */
22529ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      xmesa_alloc_back_buffer( b );
225381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   }
225481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
225581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   grLfbWriteColorFormat(GR_COLORFORMAT_ARGB);
225681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   if (xmesa->xm_visual->undithered_pf==PF_5R6G5B) {
225781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      /* Special case: 16bpp RGB */
225881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
225981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick                       0, xmesa->xm_buffer->FXctx->height - b->height,  /*pos*/
226081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick                       b->width, b->height,         /* size */
226181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick                       b->width * sizeof(GLushort), /* stride */
22629ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                       b->backimage->data);         /* dest buffer */
22639ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   }
22649ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   else if (xmesa->xm_visual->dithered_pf==PF_DITHER
22659ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	    && GET_VISUAL_DEPTH(xmesa->xm_visual)==8) {
22669ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      /* Special case: 8bpp RGB */
22679ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      for (y=0;y<b->height;y++) {
22689ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         GLubyte *ptr = (GLubyte*) xmesa->xm_buffer->backimage->data
22699ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                        + xmesa->xm_buffer->backimage->bytes_per_line * y;
22709ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         XDITHER_SETUP(y);
22719ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
22729ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         /* read row from 3Dfx frame buffer */
22739ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
22749ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                          0, xmesa->xm_buffer->FXctx->height-(b->height-y),
22759ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                          b->width, 1,
22769ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                          0,
22779ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                          pixbuf );
22789ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
2279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* write to XImage back buffer */
2280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         for (x=0;x<b->width;x++) {
2281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            GLubyte r = (pixbuf[x] & 0xf800) >> 8;
2282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            GLubyte g = (pixbuf[x] & 0x07e0) >> 3;
2283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            GLubyte b = (pixbuf[x] & 0x001f) << 3;
2284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            *ptr++ = XDITHER( x, r, g, b);
2285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
22869ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      }
2287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2289ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick      /* General case: slow! */
2290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      for (y=0;y<b->height;y++) {
229117534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick         /* read row from 3Dfx frame buffer */
22929ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
22939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                          0, xmesa->xm_buffer->FXctx->height-(b->height-y),
2294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                          b->width, 1,
22959ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                          0,
22969ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick                          pixbuf );
22979ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
22989ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         /* write to XImage back buffer */
22999ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         for (x=0;x<b->width;x++) {
23009ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick            XMesaPutPixel(b->backimage,x,y,
23019ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			  xmesa_color_to_pixel(xmesa,
23029ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick					       (pixbuf[x] & 0xf800) >> 8,
23039ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick					       (pixbuf[x] & 0x07e0) >> 3,
23049ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick					       (pixbuf[x] & 0x001f) << 3,
23059ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick					       0xff, xmesa->pixelformat));
23069ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick         }
23079ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      }
23089ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   }
23099ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   grLfbWriteColorFormat(GR_COLORFORMAT_ABGR);
23109ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick}
2311d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick#endif
2312d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
23139ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
2314d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick/*
2315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Copy the back buffer to the front buffer.  If there's no back buffer
23169ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick * this is a no-op.
2317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid XMesaSwapBuffers( XMesaBuffer b )
2319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GET_CURRENT_CONTEXT(ctx);
2321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* If we're swapping the buffer associated with the current context
2323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * we have to flush any pending rendering commands first.
2324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
2326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_swapbuffers(ctx);
2327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->db_state) {
2329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef FX
2330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->FXctx) {
2331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         fxMesaSwapBuffers();
2332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (b->FXwindowHack)
2334df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul            FXgetImage(b);
2335df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul         else
2336df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul            return;
2337df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul      }
2338df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#endif
2339df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul     if (b->backimage) {
2340df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	 /* Copy Ximage from host's memory to server's window */
234188bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee#if defined(USE_XSHM) && !defined(XFree86Server)
2342df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	 if (b->shm) {
234388bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2344df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	    XShmPutImage( b->xm_visual->display, b->frontbuffer,
2345df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul			  b->swapgc,
2346df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul			  b->backimage, 0, 0,
2347df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul			  0, 0, b->width, b->height, False );
2348df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2349df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	 }
2350df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	 else
2351df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul#endif
2352df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul         {
2353df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2354df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
2355df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul			   b->swapgc,
2356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			   b->backimage, 0, 0,
2357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			   0, 0, b->width, b->height );
2358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
2360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
2362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 /* Copy pixmap to window on server */
2363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 XMesaCopyArea( b->xm_visual->display,
2365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			b->backpixmap,   /* source drawable */
2366639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul			b->frontbuffer,  /* dest. drawable */
2367639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul			b->swapgc,
2368639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul			0, 0, b->width, b->height,  /* source region */
2369df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul			0, 0                 /* dest region */
2370df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul		      );
2371df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2372639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      }
2373639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   }
2374639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#if !defined(XFree86Server)
2375639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   XSync( b->xm_visual->display, False );
2376639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul#endif
2377639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul}
2378639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
2379639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
2380df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
2381df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul/*
2382639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * Copy sub-region of back buffer to front buffer
2383df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul */
238488bd32383a06224c742f6af59fcd95cd11284d5bVinson Leevoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2385df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul{
238688bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee   GET_CURRENT_CONTEXT(ctx);
2387df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
2388df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   /* If we're swapping the buffer associated with the current context
2389df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul    * we have to flush any pending rendering commands first.
2390639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul    */
2391df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
2392df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul      _mesa_swapbuffers(ctx);
2393df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
2394df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   if (b->db_state) {
2395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      int yTop = b->height - y - height;
2396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef FX
2397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->FXctx) {
2398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         fxMesaSwapBuffers();
2399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (b->FXwindowHack)
2400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            FXgetImage(b);
2401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         else
2402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return;
2403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
2405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->backimage) {
2406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* Copy Ximage from host's memory to server's window */
2407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#if defined(USE_XSHM) && !defined(XFree86Server)
2408b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich         if (b->shm) {
2409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            /* XXX assuming width and height aren't too large! */
2410b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich            XShmPutImage( b->xm_visual->display, b->frontbuffer,
2411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                          b->swapgc,
2412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                          b->backimage, x, yTop,
2413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                          x, yTop, width, height, False );
2414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            /* wait for finished event??? */
2415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
2416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         else
2417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
2418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         {
2419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            /* XXX assuming width and height aren't too large! */
2420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
2421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			   b->swapgc,
2422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			   b->backimage, x, yTop,
2423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			   x, yTop, width, height );
2424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
2425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      else {
2427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         /* Copy pixmap to window on server */
2428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         XMesaCopyArea( b->xm_visual->display,
2429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			b->backpixmap,           /* source drawable */
2430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			b->frontbuffer,          /* dest. drawable */
24311c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick			b->swapgc,
24321c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick			x, yTop, width, height,  /* source region */
2433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			x, yTop                  /* dest region */
2434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                      );
2435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
2441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
2442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * is a way to get "under the hood" of X/Mesa so one can manipulate the
2443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * back buffer directly.
2444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Output:  pixmap - pointer to back buffer's Pixmap, or 0
2445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *          ximage - pointer to back buffer's XImage, or NULL
2446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  GL_TRUE = context is double buffered
2447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *          GL_FALSE = context is single buffered
2448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2449770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean XMesaGetBackBuffer( XMesaBuffer b,
2450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                              XMesaPixmap *pixmap,
2451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                              XMesaImage **ximage )
2452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (b->db_state) {
2454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (pixmap)  *pixmap = b->backpixmap;
2455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (ximage)  *ximage = b->backimage;
2456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_TRUE;
2457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *pixmap = 0;
2460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *ximage = NULL;
2461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_FALSE;
2462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
246494b45567047fd681666f261f1ad0164049f0491aIan Romanick
246594b45567047fd681666f261f1ad0164049f0491aIan Romanick
2466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
2467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return the depth buffer associated with an XMesaBuffer.
2468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Input:  b - the XMesa buffer handle
2469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Output:  width, height - size of buffer in pixels
2470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *          bytesPerValue - bytes per depth value (2 or 4)
2471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *          buffer - pointer to depth buffer values
2472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2474770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               GLint *bytesPerValue, void **buffer )
2476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2477770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (!b->mesa_buffer.DepthBuffer) {
2478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *width = 0;
2479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *height = 0;
2480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *bytesPerValue = 0;
2481592a6642fc5c9f697bcc6521c99fe00b2de827c8Brian Paul      *buffer = 0;
2482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_FALSE;
2483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
248532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      *width = b->mesa_buffer.Width;
2486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *height = b->mesa_buffer.Height;
2487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *bytesPerValue = sizeof(GLdepth);
2488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      *buffer = b->mesa_buffer.DepthBuffer;
2489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_TRUE;
2490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid XMesaFlush( XMesaContext c )
2495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (c && c->xm_visual) {
2497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
2498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      /* NOT_NEEDED */
2499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
2500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      XSync( c->xm_visual->display, False );
2501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
2502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
250328b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick}
2504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickconst char *XMesaGetString( XMesaContext c, int name )
2508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   (void) c;
2510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (name==XMESA_VERSION) {
2511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return "3.5";
2512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else if (name==XMESA_EXTENSIONS) {
2514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return "";
2515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return NULL;
2518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2522639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
2523770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2524639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul{
2525639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   XMesaBuffer b;
2526639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   for (b=XMesaBufferList; b; b=b->Next) {
2527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->frontbuffer==d && b->display==dpy) {
2528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return b;
2529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return NULL;
2532639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul}
2533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2534639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
2535639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
2536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
2537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Look for XMesaBuffers whose X window has been destroyed.
2538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Deallocate any such XMesaBuffers.
2539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid XMesaGarbageCollect( void )
2541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   XMesaBuffer b, next;
2543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (b=XMesaBufferList; b; b=next) {
2544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      next = b->Next;
2545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (b->display && b->frontbuffer && b->type == WINDOW) {
2546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifdef XFree86Server
2547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 /* NOT_NEEDED */
2548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#else
2549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         XSync(b->display, False);
2550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         if (!window_exists( b->display, b->frontbuffer )) {
2551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            /* found a dead window, free the ancillary info */
2552770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            XMesaDestroyBuffer( b );
2553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
2554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
2555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2559f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul
2560f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paulvoid XMesaReset( void )
2561f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul{
2562f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul    while (XMesaBufferList)
2563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	XMesaDestroyBuffer(XMesaBufferList);
2564f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul
2565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    XMesaBufferList = NULL;
2566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2569770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                GLfloat red, GLfloat green,
2571770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                GLfloat blue, GLfloat alpha )
2572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLint r = (GLint) (red   * 255.0F);
2574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLint g = (GLint) (green * 255.0F);
2575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLint b = (GLint) (blue  * 255.0F);
2576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLint a = (GLint) (alpha * 255.0F);
2577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2578639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   switch (xmesa->pixelformat) {
2579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_INDEX:
2580639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         return 0;
2581639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      case PF_TRUECOLOR:
2582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         {
2583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            unsigned long p;
2584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            PACK_TRUECOLOR( p, r, g, b );
2585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return p;
2586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
2587639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      case PF_8A8B8G8R:
2588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return PACK_8A8B8G8R( r, g, b, a );
2589639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      case PF_8R8G8B:
2590639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         return PACK_8R8G8B( r, g, b );
2591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_5R6G5B:
2592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return PACK_5R6G5B( r, g, b );
2593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_DITHER:
2594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         {
2595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            DITHER_SETUP;
2596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return DITHER( x, y, r, g, b );
2597770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         }
2598639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      case PF_1BIT:
2599639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         /* 382 = (3*255)/2 */
2600639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
2601639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      case PF_HPCR:
2602639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         return DITHER_HPCR(x, y, r, g, b);
26037c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul      case PF_LOOKUP:
26047c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul         {
26057c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul            LOOKUP_SETUP;
2606639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul            return LOOKUP( r, g, b );
2607639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         }
2608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_GRAYSCALE:
2609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         return GRAY_RGB( r, g, b );
2610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case PF_DITHER_5R6G5B:
26117c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul         /* fall through */
26127c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul      case PF_TRUEDITHER:
2613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         {
2614639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul            unsigned long p;
2615639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul            PACK_TRUEDITHER(p, x, y, r, g, b);
26167c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul            return p;
26177c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul         }
2618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      default:
2619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
262028b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick   }
2621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 0;
2622639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul}
2623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
26247c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul
2625639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul/*
2626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * This is typically called when the window size changes and we need
2627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to reallocate the buffer's back/depth/stencil/accum buffers.
2628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid XMesaResizeBuffers( XMesaBuffer b )
2630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   xmesa_resize_buffers( &(b->mesa_buffer) );
263244843c753301db0e8f8343745777479465f34cccIan Romanick
263344843c753301db0e8f8343745777479465f34cccIan Romanick}
263444843c753301db0e8f8343745777479465f34cccIan Romanick
263544843c753301db0e8f8343745777479465f34cccIan Romanick